Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGclF-003l2R-Ak for pgsql-hackers@arkaria.postgresql.org; Thu, 28 Nov 2024 11:32:41 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tGclD-004cO7-Nk for pgsql-hackers@arkaria.postgresql.org; Thu, 28 Nov 2024 11:32:39 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGclC-004cNy-Of for pgsql-hackers@lists.postgresql.org; Thu, 28 Nov 2024 11:32:39 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tGcl6-004JtW-9D for pgsql-hackers@postgresql.org; Thu, 28 Nov 2024 11:32:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1732793550; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=8D4s85oHMW74tRLPCYomnJ0tysEa0hnBJSEBfik/jfg=; b=HwnpDBUSjh+CPYmuul6pLZECNeMulafaTK08FMg38txcIqpgH+FoVe/rkNGT6x3BWlMfjK bRdMVSWiTaIAi+2cc/NhCJd5he9mwYky2aeY9wX6hDEIaweDlEoa9OCNTxAzGDqo4mRBtW WUNOb/8Yp3j6Nc55xJcwy4MJ88CUCq0= Received: from mail-io1-f70.google.com (mail-io1-f70.google.com [209.85.166.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-20-E30Hx9OCPNKohwdCJ1NQBQ-1; Thu, 28 Nov 2024 06:32:28 -0500 X-MC-Unique: E30Hx9OCPNKohwdCJ1NQBQ-1 X-Mimecast-MFC-AGG-ID: E30Hx9OCPNKohwdCJ1NQBQ Received: by mail-io1-f70.google.com with SMTP id ca18e2360f4ac-841a3f2aebfso58908439f.0 for ; Thu, 28 Nov 2024 03:32:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1732793548; x=1733398348; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=5mZd+E57EZIRhpi9CWvLPSIhT/k0m4AT1x6Qi5LmzpY=; b=JgDsjkyoCSUvc0piYfmooTSHKiUECpqCUNN47SlCwGhNsy1r/XBLOiL+lvFR/l2GQU 02btlOdP3YXv78mg0sfjhQ7d2HeVuI6qDM+mcgpN3ZGx0xtMteFBnuYA324r1w0P0/yu rJW/S1C0LFIu/EgBOkhrLN0rvqidAGNDdEdMkAxGYUkS5N6HFXFJdFSIEj3sTLMb0XLE 7RdBXmnCgu3rLztlKnSMcJV+HnMUz3fxiaKc1LJ9RYUalJwfL5R0Bwzq4NmhUv7UkmUa QMkfZSVAP57NVNWnlva8NtR4Cezu79qeuS/uu5JPXLaLuVFKxlBQnni4C623Ii6F/XOm BUrQ== X-Gm-Message-State: AOJu0YzZvRt6OsouVVN7CGMkUxhnUVWgqCW1mBnnE+9L6fjJ8vEaWLNj dPy8qnbboTjnLeXcQDBoQRtT39M+Ew+L89n8ZKfrHIl4qLqhoSNSzBCbuWojPPR3bnxj3AN+YtO WA42J2uj8FSuKzbbO43fxGQFnTl10gSyYShZ7G7cmIU3xMvMkJ9LfbZwekE/ZG/NSxWa0GiGhVx eTQfnXWlR7VXpqfixFxQZMoz+wiObDPVlnkUmDvya1izwR X-Gm-Gg: ASbGncsVnAtBkQP9Ylx0pORwVx/DirUMVR/36Xt4QFQy5AhyKMOFSCgg8bmOl2812EN IZhdsUtbNS8qkQ7GUSm7aDjqUSceKgdw= X-Received: by 2002:a05:6602:3fcb:b0:83a:b43b:da89 with SMTP id ca18e2360f4ac-843ed0b6a43mr784684039f.10.1732793547633; Thu, 28 Nov 2024 03:32:27 -0800 (PST) X-Google-Smtp-Source: AGHT+IGyOaVDLzy3Nd8lUvL+wW98JNd3ChJHId2m+m2wU5bWvIjECaUY69YjAS0psE8tibUS/JXpmQiFKCba4nPujOQ= X-Received: by 2002:a05:6602:3fcb:b0:83a:b43b:da89 with SMTP id ca18e2360f4ac-843ed0b6a43mr784681439f.10.1732793547243; Thu, 28 Nov 2024 03:32:27 -0800 (PST) MIME-Version: 1.0 References: <29c87c10-fdbc-4d0f-b0f4-15e14dd36bce@vondra.me> In-Reply-To: From: Filip Janus Date: Thu, 28 Nov 2024 12:32:15 +0100 Message-ID: Subject: Re: Proposal: Adding compression of temporary files To: Tomas Vondra Cc: pgsql-hackers@postgresql.org X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: US8ryrNHH8qPs9KPG3lyDvtlQGMllCqGqcwNVwW3ORA_1732793548 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="000000000000da7efe0627f76f8f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000da7efe0627f76f8f Content-Type: multipart/alternative; boundary="000000000000da7efd0627f76f8d" --000000000000da7efd0627f76f8d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I've added a regression test for lz4 compression if the server is compiled with the "--with-lz4" option. -Filip- ne 24. 11. 2024 v 15:53 odes=C3=ADlatel Filip Janus nap= sal: > > > -Filip- > > > st 20. 11. 2024 v 1:35 odes=C3=ADlatel Tomas Vondra nap= sal: > >> Hi, >> >> On 11/18/24 22:58, Filip Janus wrote: >> > ... >> > Hi all, >> > Postgresql supports data compression nowadays, but the compression >> of >> > temporary files has not been implemented yet. The huge queries can >> > produce a significant amount of temporary data that needs to >> > be stored on disk >> > and cause many expensive I/O operations. >> > I am attaching a proposal of the patch to enable temporary files >> > compression for >> > hashjoins for now. Initially, I've chosen the LZ4 compression >> > algorithm. It would >> > probably make better sense to start with pglz, but I realized it >> late. >> > >> >> Thanks for the idea & patch. I agree this might be quite useful for >> workloads generating a lot of temporary files for stuff like sorts etc. >> I think it will be interesting to think about the trade offs, i.e. how >> to pick the compression level - at some point the compression ratio >> stops improving while paying more and more CPU time. Not sure what the >> right choice is, so using default seems fine. >> >> I agree it'd be better to start with pglz, and only then add lz4 etc. >> Firstly, pglz is simply the built-in compression, supported everywhere. >> And it's also simpler to implement, I think. >> >> > # Future possible improvements >> > Reducing the number of memory allocations within the dumping and >> > loading of >> > the buffer. I have two ideas for solving this problem. I would >> > either add a buffer into >> > struct BufFile or provide the buffer as an argument from the calle= r. >> > For the sequential >> > execution, I would prefer the second option. >> > >> >> Yes, this would be good. Doing a palloc+pfree for each compression is >> going to be expensive, especially because these buffers are going to be >> large - likely larger than 8kB. Which means it's not cached in the >> memory context, etc. >> >> Adding it to the BufFile is not going to fly, because that doubles the >> amount of memory per file. And we already have major issues with hash >> joins consuming massive amounts of memory. But at the same time the >> buffer is only needed during compression, and there's only one at a >> time. So I agree with passing a single buffer as an argument. >> >> > # Future plan/open questions >> > In the future, I would like to add support for pglz and zstd. >> > Further, I plan to >> > extend the support of the temporary file compression also for >> > sorting, gist index creation, etc. >> > >> > Experimenting with the stream mode of compression algorithms. The >> > compression >> > ratio of LZ4 in block mode seems to be satisfying, but the stream >> > mode could >> > produce a better ratio, but it would consume more memory due to th= e >> > requirement to store >> > context for LZ4 stream compression. >> > >> >> One thing I realized is that this only enables temp file compression for >> a single place - hash join spill files. AFAIK this is because compressed >> files don't support random access, and the other places might need that. >> >> Is that correct? The patch does not explain this anywhere. If that's >> correct, the patch probably should mention this in a comment for the >> 'compress' argument added to BufFileCreateTemp(), so that it's clear >> when it's legal to set compress=3Dtrue. >> > > I will add the description there. > > >> Which other places might compress temp files? Surely hash joins are not >> the only place that could benefit from this, right? >> > > Yes, you are definitely right. I have chosen the hash joins as a POC > because > there are no seeks besides seeks at the beginning of the buffer. > I have focused on hashjoins, but there are definitely also other places > where > the compression could be used. I want to add support in other places > in the feature. > > >> Another thing is testing. If I run regression tests, it won't use >> compression at all, because the GUC has "none" by default, right? But we >> need some testing, so how would we do that? One option would be to add a >> regression test that explicitly sets the GUC and does a hash join, but >> that won't work with lz4 (because that may not be enabled). > > > Right, it's "none" by default. My opinion is that we would like to test > every supported compression method, so I will try to add environment > variable as > you recommended. > > >> >> Another option might be to add a PG_TEST_xxx environment variable that >> determines compression to use. Something like PG_TEST_USE_UNIX_SOCKETS. >> But perhaps there's a simpler way. >> >> > # Benchmark >> > I prepared three different databases to check expectations. Each >> > dataset is described below. My testing demonstrates that my patch >> > improves the execution time of huge hash joins. >> > Also, my implementation should not >> > negatively affect performance within smaller queries. >> > The usage of memory needed for temporary files was reduced in ever= y >> > execution without a significant impact on execution time. >> > >> > *## Dataset A:* >> > Tables* >> > * >> > table_a(bigint id,text data_text,integer data_number) - 10000000 >> rows >> > table_b(bigint id, integer ref_id, numeric data_value, bytea >> > data_blob) - 10000000 rows >> > Query: SELECT * FROM table_a a JOIN table_b b ON a.id > > a.id> =3D b.id ; >> > >> > The tables contain highly compressible data. >> > The query demonstrated a reduction in the usage of the temporary >> > files ~20GB -> 3GB, based on this reduction also caused the >> execution >> > time of the query to be reduced by about ~10s. >> > >> > >> > *## Dataset B:* >> > Tables:* >> > * >> > table_a(integer id, text data_blob) - 1110000 rows >> > table_b(integer id, text data_blob) - 10000000 rows >> > Query: SELECT * FROM table_a a JOIN table_b b ON a.id > > a.id> =3D b.id ; >> > >> > The tables contain less compressible data. data_blob was generated >> > by a pseudo-random generator. >> > In this case, the data reduction was only ~50%. Also, the executio= n >> > time was reduced >> > only slightly with the enabled compression. >> > >> > The second scenario demonstrates no overhead in the case of enable= d >> > compression and extended work_mem to avoid temp file usage. >> > >> > *## Dataset C:* >> > Tables >> > customers (integer,text,text,text,text) >> > order_items(integer,integer,integer,integer,numeric(10,2)) >> > orders(integer,integer,timestamp,numeric(10,2)) >> > products(integer,text,text,numeric(10,2),integer) >> > >> > Query: SELECT p.product_id, p.name , p.price, >> > SUM(oi.quantity) AS total_quantity, AVG(oi.price) AS avg_item_pric= e >> > FROM eshop.products p JOIN eshop.order_items oi ON p.product_id = =3D >> > oi.product_id JOIN >> > eshop.orders o ON oi.order_id =3D o.order_id WHERE o.order_date > >> > '2020-01-01' AND p.price > 50 >> > GROUP BY p.product_id, p.name , p.price HAVING >> > SUM(oi.quantity) > 1000 >> > ORDER BY total_quantity DESC LIMIT 100; >> > >> > This scenario should demonstrate a more realistic usage of the >> database. >> > Enabled compression slightly reduced the temporary memory usage, b= ut >> > the execution >> > time wasn't affected by compression. >> > >> > >> > +------------+-------------------------+----------------------- >> > +------------------------------+ >> > | Dataset | Compression. | temp_bytes | Execution >> > Time (ms) | >> > +------------+-------------------------+----------------------- >> > +----------------------------- + >> > | A | Yes | 3.09 GiB >> > | 22s586ms | work_mem =3D 4MB >> > | | No | 21.89 GiB >> > | 35s | work_mem =3D 4MB >> > +------------+-------------------------+----------------------- >> > +---------------------------------------- >> > | B | Yes | 333 MB >> > | 1815.545 ms | work_mem =3D 4MB >> > | | No | 146 MB >> > | 1500.460 ms | work_mem =3D 4MB >> > | | Yes | 0 MB >> > | 3262.305 ms | work_mem =3D 80MB >> > | | No | 0 MB >> > | 3174.725 ms | work_mem =3D 80MB >> > +-------------+------------------------+------------------------ >> > +------------------------------------- >> > | C | Yes | 40 MB >> > | 1011.020 ms | work_mem =3D 1MB >> > | | No | 53 >> > MB | 1034.142 ms | work_mem =3D 1MB >> > +------------+------------------------+------------------------ >> > +-------------------------------------- >> > >> > >> >> Thanks. I'll try to do some benchmarks on my own. >> >> Are these results fro ma single run, or an average of multiple runs? > > > It is average from multiple runs. > > Do >> you maybe have a script to reproduce this, including the data generation= ? > > > I am attaching my SQL file for database preparation. I also did further > testing > with two other machines( see attachment huge_tables.rtf ). > >> >> Also, can you share some information about the machine used for this? I >> expect the impact to strongly depends on memory pressure - if the temp >> file fits into page cache (and stays there), it may not benefit from the >> compression, right? >> > > If it fits into the page cache due to compression, I would consider it as > a benefit from compression. > I performed further testing on machines with different memory sizes. > Both experiments showed that compression was beneficial for execution > time. > The execution time reduction was more significant in the case of the > machine that had > less memory available. > > Tests were performed on: > MacBook PRO M3 36GB - MacOs > Virtual machine ARM64 10GB/ 6CPU - Fedora 39 > > >> >> regards >> >> -- >> Tomas Vondra >> >> --000000000000da7efd0627f76f8d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

I've added a regression test for lz4 compression if the server = is compiled with the "--with-lz4" option.

=C2=A0 =C2=A0 -Filip-

=
ne 24. 11. 2024 v=C2=A015:53 odes=C3=ADlatel Filip Janus &l= t;fjanus@redhat.com> napsal:
<= div dir=3D"ltr">

<= br>
=C2=A0 =C2=A0 -Filip-


st 20. 11. 2024 v=C2=A01:35 odes=C3=ADlatel Tomas Vondra <tomas@vondra.me> napsa= l:
Hi,

On 11/18/24 22:58, Filip Janus wrote:
> ...
>=C2=A0 =C2=A0 =C2=A0Hi all,
>=C2=A0 =C2=A0 =C2=A0Postgresql supports data compression nowadays, but = the compression of
>=C2=A0 =C2=A0 =C2=A0temporary files has not been implemented yet. The h= uge queries can=C2=A0
>=C2=A0 =C2=A0 =C2=A0produce a significant amount of temporary data that= needs to
>=C2=A0 =C2=A0 =C2=A0be=C2=A0stored on disk=C2=A0
>=C2=A0 =C2=A0 =C2=A0and cause many expensive I/O operations.
>=C2=A0 =C2=A0 =C2=A0I am attaching a proposal of the patch to enable te= mporary files
>=C2=A0 =C2=A0 =C2=A0compression for
>=C2=A0 =C2=A0 =C2=A0hashjoins for now. Initially, I've chosen the L= Z4 compression
>=C2=A0 =C2=A0 =C2=A0algorithm. It would
>=C2=A0 =C2=A0 =C2=A0probably make better sense to start with pglz, but = I realized it late.
>

Thanks for the idea & patch. I agree this might be quite useful for
workloads generating a lot of temporary files for stuff like sorts etc.
I think it will be interesting to think about the trade offs, i.e. how
to pick the compression level - at some point the compression ratio
stops improving while paying more and more CPU time. Not sure what the
right choice is, so using default seems fine.

I agree it'd be better to start with pglz, and only then add lz4 etc. Firstly, pglz is simply the built-in compression, supported everywhere.
And it's also simpler to implement, I think.

>=C2=A0 =C2=A0 =C2=A0# Future possible improvements
>=C2=A0 =C2=A0 =C2=A0Reducing the number of memory allocations within th= e dumping and
>=C2=A0 =C2=A0 =C2=A0loading of
>=C2=A0 =C2=A0 =C2=A0the buffer. I have two ideas for solving this probl= em. I would
>=C2=A0 =C2=A0 =C2=A0either add a buffer into
>=C2=A0 =C2=A0 =C2=A0struct BufFile or provide the buffer as an argument= from the caller.
>=C2=A0 =C2=A0 =C2=A0For the sequential=C2=A0
>=C2=A0 =C2=A0 =C2=A0execution, I would prefer the second option.
>

Yes, this would be good. Doing a palloc+pfree for each compression is
going to be expensive, especially because these buffers are going to be
large - likely larger than 8kB. Which means it's not cached in the
memory context, etc.

Adding it to the BufFile is not going to fly, because that doubles the
amount of memory per file. And we already have major issues with hash
joins consuming massive amounts of memory. But at the same time the
buffer is only needed during compression, and there's only one at a
time. So I agree with passing a single buffer as an argument.

>=C2=A0 =C2=A0 =C2=A0# Future plan/open questions
>=C2=A0 =C2=A0 =C2=A0In the future, I would like to add support for pglz= and zstd.
>=C2=A0 =C2=A0 =C2=A0Further, I plan to
>=C2=A0 =C2=A0 =C2=A0extend the support of the temporary file compressio= n also for
>=C2=A0 =C2=A0 =C2=A0sorting, gist index creation, etc.
>
>=C2=A0 =C2=A0 =C2=A0Experimenting with the stream mode of compression a= lgorithms. The
>=C2=A0 =C2=A0 =C2=A0compression=C2=A0
>=C2=A0 =C2=A0 =C2=A0ratio of LZ4 in block mode seems to be satisfying, = but the stream
>=C2=A0 =C2=A0 =C2=A0mode could=C2=A0
>=C2=A0 =C2=A0 =C2=A0produce a better ratio, but it would consume more m= emory due to the
>=C2=A0 =C2=A0 =C2=A0requirement to store
>=C2=A0 =C2=A0 =C2=A0context for LZ4 stream compression.
>

One thing I realized is that this only enables temp file compression for a single place - hash join spill files. AFAIK this is because compressed files don't support random access, and the other places might need that= .

Is that correct? The patch does not explain this anywhere. If that's correct, the patch probably should mention this in a comment for the
'compress' argument added to BufFileCreateTemp(), so that it's = clear
when it's legal to set compress=3Dtrue.
=C2=A0
I will add the description there.
=C2=A0
Which other places might compress= temp files? Surely hash joins are not
the only place that could benefit from this, right?
Yes, you are definitely right. I have=C2=A0chosen the hash joi= ns as a POC because=C2=A0
there are no seeks besides seeks at the= beginning of the buffer.=C2=A0
I have focused on hashjoins, but = there are definitely also other places where
the compression coul= d be used. I want to add support in other places
in the feature.<= br>
=C2=A0
Another thing is testing. If I run regression tests, it won't use
compression at all, because the GUC has "none" by default, right?= But we
need some testing, so how would we do that? One option would be to add a regression test that explicitly sets the GUC and does a hash join, but
that won't work with lz4 (because that may not be enabled).
=C2=A0
Right, it's "none" by default. My opin= ion is that we would like to test
every supported compression met= hod, so I will try to add environment variable as
you recommended= .
=C2=A0

Another option might be to add a PG_TEST_xxx environment variable that
determines compression to use. Something like PG_TEST_USE_UNIX_SOCKETS.
But perhaps there's a simpler way.

>=C2=A0 =C2=A0 =C2=A0# Benchmark
>=C2=A0 =C2=A0 =C2=A0I prepared three different databases to check expec= tations. Each=C2=A0
>=C2=A0 =C2=A0 =C2=A0dataset is described below. My testing demonstrates= that my patch=C2=A0
>=C2=A0 =C2=A0 =C2=A0improves the execution time of huge hash joins.=C2= =A0
>=C2=A0 =C2=A0 =C2=A0Also, my implementation should not
>=C2=A0 =C2=A0 =C2=A0negatively affect performance within smaller querie= s.=C2=A0
>=C2=A0 =C2=A0 =C2=A0The usage of memory needed for temporary files was = reduced in every
>=C2=A0 =C2=A0 =C2=A0=C2=A0execution without a significant impact on exe= cution time.
>
>=C2=A0 =C2=A0 =C2=A0*## Dataset A:*
>=C2=A0 =C2=A0 =C2=A0Tables*
>=C2=A0 =C2=A0 =C2=A0*
>=C2=A0 =C2=A0 =C2=A0table_a(bigint id,text data_text,integer data_numbe= r) - 10000000 rows
>=C2=A0 =C2=A0 =C2=A0table_b(bigint id, integer ref_id, numeric data_val= ue, bytea
>=C2=A0 =C2=A0 =C2=A0data_blob) - 10000000 rows
>=C2=A0 =C2=A0 =C2=A0Query:=C2=A0 SELECT *=C2=A0 FROM table_a a JOIN tab= le_b b ON a.id= <http://
>=C2=A0 =C2=A0 =C2=A0a.id> =3D b.id <http://b.id>;
>
>=C2=A0 =C2=A0 =C2=A0The tables contain highly compressible data.
>=C2=A0 =C2=A0 =C2=A0The query demonstrated a reduction in the usage of = the temporary=C2=A0
>=C2=A0 =C2=A0 =C2=A0files ~20GB -> 3GB, based on this reduction also= caused the execution=C2=A0
>=C2=A0 =C2=A0 =C2=A0time of the query to be reduced by about ~10s.
>
>
>=C2=A0 =C2=A0 =C2=A0*## Dataset B:*
>=C2=A0 =C2=A0 =C2=A0Tables:*
>=C2=A0 =C2=A0 =C2=A0*
>=C2=A0 =C2=A0 =C2=A0table_a(integer id, text data_blob) - 1110000 rows<= br> >=C2=A0 =C2=A0 =C2=A0table_b(integer id, text data_blob) - 10000000 rows=
>=C2=A0 =C2=A0 =C2=A0Query:=C2=A0 SELECT *=C2=A0 FROM table_a a JOIN tab= le_b b ON a.id= <http://
>=C2=A0 =C2=A0 =C2=A0a.id> =3D b.id <http://b.id>;
>
>=C2=A0 =C2=A0 =C2=A0The tables contain less compressible data. data_blo= b was generated
>=C2=A0 =C2=A0 =C2=A0by a pseudo-random generator.
>=C2=A0 =C2=A0 =C2=A0In this case, the data reduction was only ~50%. Als= o, the execution
>=C2=A0 =C2=A0 =C2=A0time was reduced=C2=A0
>=C2=A0 =C2=A0 =C2=A0only slightly with the enabled compression.
>
>=C2=A0 =C2=A0 =C2=A0The second scenario demonstrates no overhead in the= case of enabled=C2=A0
>=C2=A0 =C2=A0 =C2=A0compression and extended work_mem to avoid temp fil= e usage.
>
>=C2=A0 =C2=A0 =C2=A0*## Dataset C:*
>=C2=A0 =C2=A0 =C2=A0Tables
>=C2=A0 =C2=A0 =C2=A0customers (integer,text,text,text,text)
>=C2=A0 =C2=A0 =C2=A0order_items(integer,integer,integer,integer,numeric= (10,2))
>=C2=A0 =C2=A0 =C2=A0orders(integer,integer,timestamp,numeric(10,2))
>=C2=A0 =C2=A0 =C2=A0products(integer,text,text,numeric(10,2),integer) >
>=C2=A0 =C2=A0 =C2=A0Query: SELECT p.product_id, p.name <http://p.name>, p.price,<= br> >=C2=A0 =C2=A0 =C2=A0SUM(oi.quantity) AS total_quantity, AVG(oi.price) A= S avg_item_price
>=C2=A0 =C2=A0 =C2=A0FROM eshop.products p JOIN eshop.order_items oi ON = p.product_id =3D
>=C2=A0 =C2=A0 =C2=A0oi.product_id JOIN=C2=A0
>=C2=A0 =C2=A0 =C2=A0eshop.orders o ON oi.order_id =3D o.order_id WHERE = o.order_date >
>=C2=A0 =C2=A0 =C2=A0'2020-01-01' AND p.price > 50
>=C2=A0 =C2=A0 =C2=A0GROUP BY p.product_id, p.name <http://p.name>, p.price HAVING=
>=C2=A0 =C2=A0 =C2=A0SUM(oi.quantity) > 1000
>=C2=A0 =C2=A0 =C2=A0ORDER BY total_quantity DESC LIMIT 100;
>
>=C2=A0 =C2=A0 =C2=A0This scenario should demonstrate a more realistic u= sage of the database.
>=C2=A0 =C2=A0 =C2=A0Enabled compression slightly reduced the temporary = memory usage, but
>=C2=A0 =C2=A0 =C2=A0the execution
>=C2=A0 =C2=A0 =C2=A0time wasn't affected by compression.
>
>
>=C2=A0 =C2=A0 =C2=A0+------------+-------------------------+-----------= ------------
>=C2=A0 =C2=A0 =C2=A0+------------------------------+
>=C2=A0 =C2=A0 =C2=A0| =C2=A0Dataset =C2=A0 | Compression. =C2=A0 =C2=A0= =C2=A0 | temp_bytes =C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0 | Execution
>=C2=A0 =C2=A0 =C2=A0Time (ms)=C2=A0=C2=A0 | =C2=A0 =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0+------------+-------------------------+-----------= ------------
>=C2=A0 =C2=A0 =C2=A0+----------------------------- +
>=C2=A0 =C2=A0 =C2=A0| A =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 | Yes= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 |=C2=A0 3.09 GiB =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0=C2=A0 >=C2=A0 =C2=A0 =C2=A0| 22s586ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0 | work_mem=C2=A0 =3D 4MB
>=C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 | No=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0=C2=A0 =C2=A0 |=C2=A0 21.89 GiB =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2= =A0
>=C2=A0 =C2=A0 =C2=A0| 35s=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 | work_mem=C2=A0 =3D 4MB
>=C2=A0 =C2=A0 =C2=A0+------------+-------------------------+-----------= ------------
>=C2=A0 =C2=A0 =C2=A0+----------------------------------------
>=C2=A0 =C2=A0 =C2=A0| B=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 | Yes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0 |=C2=A0=C2=A0333 MB =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
>=C2=A0 =C2=A0 =C2=A0| 1815.545 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |= work_mem =3D 4MB
>=C2=A0 =C2=A0 =C2=A0|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 146=C2=A0 MB =C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
>=C2=A0 =C2=A0 =C2=A0=C2=A0 | 1500.460 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0 | work_mem =3D 4MB
>=C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0 = =C2=A0=C2=A0 | Yes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= |=C2=A0 0 MB =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 =C2=A0
>=C2=A0 =C2=A0 =C2=A0=C2=A0 =C2=A0 |=C2=A03262.305 ms=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 80MB
>=C2=A0 =C2=A0 =C2=A0|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 0 MB =C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 =C2=A0 =C2=A0=C2=A0
>=C2=A0 =C2=A0 =C2=A0=C2=A0=C2=A0 |=C2=A03174.725 ms=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 80MB
>=C2=A0 =C2=A0 =C2=A0+-------------+------------------------+-----------= -------------
>=C2=A0 =C2=A0 =C2=A0+-------------------------------------
>=C2=A0 =C2=A0 =C2=A0| C=C2=A0=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = | Yes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | 40 MB=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0
>=C2=A0 =C2=A0 =C2=A0|=C2=A01011.020 ms=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0 | work_mem =3D 1MB
>=C2=A0 =C2=A0 =C2=A0|=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | No=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 53
>=C2=A0 =C2=A0 =C2=A0MB=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 |=C2=A0 1034.142 ms=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 | work_mem =3D 1MB
>=C2=A0 =C2=A0 =C2=A0+------------+------------------------+------------= ------------
>=C2=A0 =C2=A0 =C2=A0+--------------------------------------
>
>

Thanks. I'll try to do some benchmarks on my own.

Are these results fro ma single run, or an average of multiple runs?
=C2=A0
It is average from multiple runs.

Do
you maybe have a script to reproduce this, including the data generation?
=C2=A0
I am attaching my SQL file for database pr= eparation. I also did further testing
with two other machines( se= e attachment huge_tables.rtf ).

Also, can you share some information about the machine used for this? I
expect the impact to strongly depends on memory pressure - if the temp
file fits into page cache (and stays there), it may not benefit from the compression, right?
=C2=A0
If it fits=C2=A0i= nto the page cache due to compression, I would consider it as a benefit fro= m compression.
I performed further testing on machines with diffe= rent memory sizes.
Both experiments showed that compression was b= eneficial for execution time.=C2=A0
The execution time reduction = was more significant in the case of the machine that had
less mem= ory available.

Tests were performed on:
= MacBook PRO M3 36GB - MacOs
Virtual machine ARM64 10GB/ 6CPU - Fe= dora 39



regards

--
Tomas Vondra

--000000000000da7efd0627f76f8d-- --000000000000da7efe0627f76f8f Content-Type: application/octet-stream; name="0001-This-commit-adds-support-for-temporary-files-compres-v3.patch" Content-Disposition: attachment; filename="0001-This-commit-adds-support-for-temporary-files-compres-v3.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m418egoq0 RnJvbSBmZDRlNDJjODMwYmRmODIzMWFjN2I2YWUyMTMyNmMzOGJhYWNkYzM0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGaWxpcCA8ZmphbnVzQHJlZGhhdC5jb20+CkRhdGU6IFRodSwg MjQgT2N0IDIwMjQgMTI6MTU6MTAgKzAyMDAKU3ViamVjdDogW1BBVENIXSBUaGlzIGNvbW1pdCBh ZGRzIHN1cHBvcnQgZm9yIHRlbXBvcmFyeSBmaWxlcyBjb21wcmVzc2lvbiwgaXQKIGNhbiBiZSB1 c2VkIG9ubHkgZm9yIGhhc2hqb2lucyBub3cuCgpJdCBhbHNvIGFkZHMgR1VDIHBhcmFtZXRlciB0 ZW1wX2ZpbGVfY29tcHJlc3Npb24gdGhhdCBlbmFibGVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KRm9y IG5vdywgaXQgc3VwcG9ydHMganVzdCBsejQgYWxnb3JpdGhtcy4gSW4gdGhlIGZ1dHVyZSwgaXQK Y291bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCBwZ2x6IGFuZCB6c3RkIHN1cHBvcnQuCi0tLQogc3Jj L01ha2VmaWxlLmdsb2JhbC5pbiAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBzcmMv YmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMgICAgfCAgICAyICstCiBzcmMv YmFja2VuZC9iYWNrdXAvYmFja3VwX21hbmlmZXN0LmMgICAgICAgICAgfCAgICAyICstCiBzcmMv YmFja2VuZC9leGVjdXRvci9ub2RlSGFzaGpvaW4uYyAgICAgICAgICAgfCAgICAyICstCiBzcmMv YmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmlsZS5jICAgICAgICAgICAgfCAgMTc2ICsrLQogc3Jj L2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMgICAgICAgICAgIHwgICAyMyArCiBzcmMv YmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1wbGUgfCAgICAxICsKIHNyYy9i YWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jICAgICAgICAgICAgICB8ICAgIDIgKy0KIHNyYy9i YWNrZW5kL3V0aWxzL3NvcnQvdHVwbGVzdG9yZS5jICAgICAgICAgICB8ICAgIDIgKy0KIHNyYy9p bmNsdWRlL3N0b3JhZ2UvYnVmZmlsZS5oICAgICAgICAgICAgICAgICB8ICAgMTMgKy0KIHNyYy90 ZXN0L3JlZ3Jlc3MvR05VbWFrZWZpbGUgICAgICAgICAgICAgICAgICB8ICAgIDQgKwogc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9qb2luX2hhc2hfbHo0Lm91dCAgIHwgMTE2NiArKysrKysrKysr KysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbl9oYXNoX2x6NC5zcWwgICAgICAgIHwg IDYyNiArKysrKysrKysKIDE0IGZpbGVzIGNoYW5nZWQsIDIwMDYgaW5zZXJ0aW9ucygrKSwgMTYg ZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9qb2luX2hhc2hfbHo0Lm91dAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2pvaW5faGFzaF9sejQuc3FsCgpkaWZmIC0tZ2l0IGEvc3JjL01ha2VmaWxlLmdsb2JhbC5p biBiL3NyYy9NYWtlZmlsZS5nbG9iYWwuaW4KaW5kZXggNDJmNTBiNDk3Ni4uMDZlNzAxZmU5YyAx MDA2NDQKLS0tIGEvc3JjL01ha2VmaWxlLmdsb2JhbC5pbgorKysgYi9zcmMvTWFrZWZpbGUuZ2xv YmFsLmluCkBAIC0xOTMsNiArMTkzLDcgQEAgd2l0aF9sZGFwCT0gQHdpdGhfbGRhcEAKIHdpdGhf bGlieG1sCT0gQHdpdGhfbGlieG1sQAogd2l0aF9saWJ4c2x0CT0gQHdpdGhfbGlieHNsdEAKIHdp dGhfbGx2bQk9IEB3aXRoX2xsdm1ACit3aXRoX2x6NAk9IEB3aXRoX2x6NEAKIHdpdGhfc3lzdGVt X3R6ZGF0YSA9IEB3aXRoX3N5c3RlbV90emRhdGFACiB3aXRoX3V1aWQJPSBAd2l0aF91dWlkQAog d2l0aF96bGliCT0gQHdpdGhfemxpYkAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9n aXN0L2dpc3RidWlsZGJ1ZmZlcnMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9naXN0L2dpc3RidWls ZGJ1ZmZlcnMuYwppbmRleCA0YzIzMDFkYTAwLi45YjNiMDAxNDJhIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9hY2Nlc3MvZ2lzdC9naXN0YnVpbGRidWZmZXJzLmMKKysrIGIvc3JjL2JhY2tlbmQv YWNjZXNzL2dpc3QvZ2lzdGJ1aWxkYnVmZmVycy5jCkBAIC01NCw3ICs1NCw3IEBAIGdpc3RJbml0 QnVpbGRCdWZmZXJzKGludCBwYWdlc1BlckJ1ZmZlciwgaW50IGxldmVsU3RlcCwgaW50IG1heExl dmVsKQogCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIHRvIGhvbGQgYnVmZmVyIHBhZ2VzIHRo YXQgYXJlIHN3YXBwZWQgb3V0IG9mCiAJICogbWVtb3J5LgogCSAqLwotCWdmYmItPnBmaWxlID0g QnVmRmlsZUNyZWF0ZVRlbXAoZmFsc2UpOworCWdmYmItPnBmaWxlID0gQnVmRmlsZUNyZWF0ZVRl bXAoZmFsc2UsIGZhbHNlKTsKIAlnZmJiLT5uRmlsZUJsb2NrcyA9IDA7CiAKIAkvKiBJbml0aWFs aXplIGZyZWUgcGFnZSBtYW5hZ2VtZW50LiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYmFj a3VwL2JhY2t1cF9tYW5pZmVzdC5jIGIvc3JjL2JhY2tlbmQvYmFja3VwL2JhY2t1cF9tYW5pZmVz dC5jCmluZGV4IGEyZTJmODYzMzIuLmY4YTNlMWYwZjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2JhY2t1cC9iYWNrdXBfbWFuaWZlc3QuYworKysgYi9zcmMvYmFja2VuZC9iYWNrdXAvYmFja3Vw X21hbmlmZXN0LmMKQEAgLTY1LDcgKzY1LDcgQEAgSW5pdGlhbGl6ZUJhY2t1cE1hbmlmZXN0KGJh Y2t1cF9tYW5pZmVzdF9pbmZvICptYW5pZmVzdCwKIAkJbWFuaWZlc3QtPmJ1ZmZpbGUgPSBOVUxM OwogCWVsc2UKIAl7Ci0JCW1hbmlmZXN0LT5idWZmaWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoZmFs c2UpOworCQltYW5pZmVzdC0+YnVmZmlsZSA9IEJ1ZkZpbGVDcmVhdGVUZW1wKGZhbHNlLCBmYWxz ZSk7CiAJCW1hbmlmZXN0LT5tYW5pZmVzdF9jdHggPSBwZ19jcnlwdG9oYXNoX2NyZWF0ZShQR19T SEEyNTYpOwogCQlpZiAocGdfY3J5cHRvaGFzaF9pbml0KG1hbmlmZXN0LT5tYW5pZmVzdF9jdHgp IDwgMCkKIAkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBjaGVja3N1bSBvZiBi YWNrdXAgbWFuaWZlc3Q6ICVzIiwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25v ZGVIYXNoam9pbi5jIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUhhc2hqb2luLmMKaW5kZXgg MmY3MTcwNjA0ZC4uMWI1YzY0NDhlZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Iv bm9kZUhhc2hqb2luLmMKKysrIGIvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUhhc2hqb2luLmMK QEAgLTE0MzQsNyArMTQzNCw3IEBAIEV4ZWNIYXNoSm9pblNhdmVUdXBsZShNaW5pbWFsVHVwbGUg dHVwbGUsIHVpbnQzMiBoYXNodmFsdWUsCiAJewogCQlNZW1vcnlDb250ZXh0IG9sZGN0eCA9IE1l bW9yeUNvbnRleHRTd2l0Y2hUbyhoYXNodGFibGUtPnNwaWxsQ3h0KTsKIAotCQlmaWxlID0gQnVm RmlsZUNyZWF0ZVRlbXAoZmFsc2UpOworCQlmaWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoZmFsc2Us IHRydWUpOwogCQkqZmlsZXB0ciA9IGZpbGU7CiAKIAkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZGN0eCk7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmlsZS5jIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9maWxlL2J1ZmZpbGUuYwppbmRleCBhMjdmNTFmNjIyLi44MThl ZjM5ZDVjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2ZpbGUvYnVmZmlsZS5jCisr KyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvZmlsZS9idWZmaWxlLmMKQEAgLTU0LDYgKzU0LDE2IEBA CiAjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgogI2luY2x1ZGUgInV0aWxzL3Jlc293bmVyLmgiCiAK KyNpZmRlZiBVU0VfTFo0CisjaW5jbHVkZSA8bHo0Lmg+CisjZW5kaWYKKworI2RlZmluZSBOT19M WjRfU1VQUE9SVCgpIFwKKwllcmVwb3J0KEVSUk9SLCBcCisJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksIFwKKwkJCSBlcnJtc2coImNvbXByZXNzaW9uIG1ldGhvZCBs ejQgbm90IHN1cHBvcnRlZCIpLCBcCisJCQkgZXJyZGV0YWlsKCJUaGlzIGZ1bmN0aW9uYWxpdHkg cmVxdWlyZXMgdGhlIHNlcnZlciB0byBiZSBidWlsdCB3aXRoIGx6NCBzdXBwb3J0LiIpKSkKKwog LyoKICAqIFdlIGJyZWFrIEJ1ZkZpbGVzIGludG8gZ2lnYWJ5dGUtc2l6ZWQgc2VnbWVudHMsIHJl Z2FyZGxlc3Mgb2YgUkVMU0VHX1NJWkUuCiAgKiBUaGUgcmVhc29uIGlzIHRoYXQgd2UnZCBsaWtl IGxhcmdlIEJ1ZkZpbGVzIHRvIGJlIHNwcmVhZCBhY3Jvc3MgbXVsdGlwbGUKQEAgLTYyLDYgKzcy LDggQEAKICNkZWZpbmUgTUFYX1BIWVNJQ0FMX0ZJTEVTSVpFCTB4NDAwMDAwMDAKICNkZWZpbmUg QlVGRklMRV9TRUdfU0laRQkJKE1BWF9QSFlTSUNBTF9GSUxFU0laRSAvIEJMQ0tTWikKIAoraW50 IHRlbXBfZmlsZV9jb21wcmVzc2lvbiA9IFRFTVBfTk9ORV9DT01QUkVTU0lPTjsKKwogLyoKICAq IFRoaXMgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIGJ1ZmZlcmVkIGZpbGUgdGhhdCBjb25z aXN0cyBvZiBvbmUgb3IKICAqIG1vcmUgcGh5c2ljYWwgZmlsZXMgKGVhY2ggYWNjZXNzZWQgdGhy b3VnaCBhIHZpcnR1YWwgZmlsZSBkZXNjcmlwdG9yCkBAIC05NSw3ICsxMDcsNyBAQCBzdHJ1Y3Qg QnVmRmlsZQogCW9mZl90CQljdXJPZmZzZXQ7CQkvKiBvZmZzZXQgcGFydCBvZiBjdXJyZW50IHBv cyAqLwogCWludAkJCXBvczsJCQkvKiBuZXh0IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gYnVmZmVy ICovCiAJaW50CQkJbmJ5dGVzOwkJCS8qIHRvdGFsICMgb2YgdmFsaWQgYnl0ZXMgaW4gYnVmZmVy ICovCi0KKwlib29sCQkJY29tcHJlc3M7IC8qwqBTdGF0ZSBvZiB1c2VnZSBmaWxlIGNvbXByZXNz aW9uICovCiAJLyoKIAkgKiBYWFggU2hvdWxkIGlkZWFsbHkgdXMgUEdJT0FsaWduZWRCbG9jaywg YnV0IG1pZ2h0IG5lZWQgYSB3YXkgdG8gYXZvaWQKIAkgKiB3YXN0aW5nIHBlci1maWxlIGFsaWdu bWVudCBwYWRkaW5nIHdoZW4gc29tZSB1c2VycyBjcmVhdGUgbWFueSBmaWxlcy4KQEAgLTEyNyw2 ICsxMzksNyBAQCBtYWtlQnVmRmlsZUNvbW1vbihpbnQgbmZpbGVzKQogCWZpbGUtPmN1ck9mZnNl dCA9IDA7CiAJZmlsZS0+cG9zID0gMDsKIAlmaWxlLT5uYnl0ZXMgPSAwOworCWZpbGUtPmNvbXBy ZXNzID0gZmFsc2U7CiAKIAlyZXR1cm4gZmlsZTsKIH0KQEAgLTE4OCw5ICsyMDEsMTcgQEAgZXh0 ZW5kQnVmRmlsZShCdWZGaWxlICpmaWxlKQogICogTm90ZTogaWYgaW50ZXJYYWN0IGlzIHRydWUs IHRoZSBjYWxsZXIgaGFkIGJldHRlciBiZSBjYWxsaW5nIHVzIGluIGEKICAqIG1lbW9yeSBjb250 ZXh0LCBhbmQgd2l0aCBhIHJlc291cmNlIG93bmVyLCB0aGF0IHdpbGwgc3Vydml2ZSBhY3Jvc3MK ICAqIHRyYW5zYWN0aW9uIGJvdW5kYXJpZXMuCisgKgorICogSWYgY29tcHJlc3MgaXMgdHJ1ZSB0 aGUgdGVtcG9yYXJ5IGZpbGVzIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUKKyAqIHdyaXRpbmcg b24gZGlzay4KKyAqCisgKiBOb3RlOiBUaGUgY29tcHJlc3Npb24gZG9lcyBub3Qgc3VwcG9ydCBy YW5kb20gYWNjZXNzLiBPbmx5IHRoZSBoYXNoIGpvaW5zCisgKiB1c2UgaXQgZm9yIG5vdy4gVGhl IHNlZWsgb3BlcmF0aW9uIG90aGVyIHRoYW4gc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQor ICogYnVmZmlsZSB3aWxsIGNvcnJ1cHQgdGVtcG9yYXJ5IGRhdGEgb2Zmc2V0cy4KKyAqCiAgKi8K IEJ1ZkZpbGUgKgotQnVmRmlsZUNyZWF0ZVRlbXAoYm9vbCBpbnRlclhhY3QpCitCdWZGaWxlQ3Jl YXRlVGVtcChib29sIGludGVyWGFjdCwgYm9vbCBjb21wcmVzcykKIHsKIAlCdWZGaWxlICAgICpm aWxlOwogCUZpbGUJCXBmaWxlOwpAQCAtMjEyLDYgKzIzMywxNSBAQCBCdWZGaWxlQ3JlYXRlVGVt cChib29sIGludGVyWGFjdCkKIAlmaWxlID0gbWFrZUJ1ZkZpbGUocGZpbGUpOwogCWZpbGUtPmlz SW50ZXJYYWN0ID0gaW50ZXJYYWN0OwogCisJaWYgKHRlbXBfZmlsZV9jb21wcmVzc2lvbiAhPSBU RU1QX05PTkVfQ09NUFJFU1NJT04pCisJeworI2lmZGVmIFVTRV9MWjQKKwkJZmlsZS0+Y29tcHJl c3MgPSBjb21wcmVzczsKKyNlbHNlCisJCU5PX0xaNF9TVVBQT1JUKCk7CisjZW5kaWYKKwl9CisK IAlyZXR1cm4gZmlsZTsKIH0KIApAQCAtMjc1LDYgKzMwNSw3IEBAIEJ1ZkZpbGVDcmVhdGVGaWxl U2V0KEZpbGVTZXQgKmZpbGVzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCiAJZmlsZS0+ZmlsZXNbMF0g PSBNYWtlTmV3RmlsZVNldFNlZ21lbnQoZmlsZSwgMCk7CiAJZmlsZS0+cmVhZE9ubHkgPSBmYWxz ZTsKIAorCiAJcmV0dXJuIGZpbGU7CiB9CiAKQEAgLTQ1NSwxMyArNDg2LDcyIEBAIEJ1ZkZpbGVM b2FkQnVmZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJCUlOU1RSX1RJTUVfU0VUX1pFUk8oaW9fc3RhcnQp OwogCiAJLyoKLQkgKiBSZWFkIHdoYXRldmVyIHdlIGNhbiBnZXQsIHVwIHRvIGEgZnVsbCBidWZm ZXJsb2FkLgorCSAqIExvYWQgZGF0YSBhcyBpdCBpcyBzdG9yZWQgaW4gdGhlIHRlbXBvcmFyeSBm aWxlCiAJICovCi0JZmlsZS0+bmJ5dGVzID0gRmlsZVJlYWQodGhpc2ZpbGUsCisJaWYgKCFmaWxl LT5jb21wcmVzcykKKwl7CisKKwkJLyoKKwkgCSogUmVhZCB3aGF0ZXZlciB3ZSBjYW4gZ2V0LCB1 cCB0byBhIGZ1bGwgYnVmZmVybG9hZC4KKwkgCSovCisJCWZpbGUtPm5ieXRlcyA9IEZpbGVSZWFk KHRoaXNmaWxlLAogCQkJCQkJCWZpbGUtPmJ1ZmZlci5kYXRhLAogCQkJCQkJCXNpemVvZihmaWxl LT5idWZmZXIpLAogCQkJCQkJCWZpbGUtPmN1ck9mZnNldCwKIAkJCQkJCQlXQUlUX0VWRU5UX0JV RkZJTEVfUkVBRCk7CisJLyoKKwkgKiBSZWFkIGFuZCBkZWNvbXByZXNzIGRhdGEgZnJvbSB0aGUg dGVtcG9yYXJ5IGZpbGUKKwkgKiBUaGUgZmlyc3QgcmVhZGluZyBsb2FkcyBzaXplIG9mIHRoZSBj b21wcmVzc2VkIGJsb2NrCisJICogU2Vjb25kIHJlYWRpbmcgbG9hZHMgY29tcHJlc3NlZCBkYXRh CisJICovCisJfSBlbHNlIHsKKwkJaW50IG5yZWFkOworCQlpbnQgbmJ5dGVzOworCisJCW5yZWFk ID0gRmlsZVJlYWQodGhpc2ZpbGUsCisJCQkJCQkJJm5ieXRlcywKKwkJCQkJCQlzaXplb2YobmJ5 dGVzKSwKKwkJCQkJCQlmaWxlLT5jdXJPZmZzZXQsCisJCQkJCQkJV0FJVF9FVkVOVF9CVUZGSUxF X1JFQUQpOworCQkvKiBpZiBub3QgRU9GIGxldCdzIGNvbnRpbnVlICovCisJCWlmIChucmVhZCA+ IDApCisJCXsKKwkJCS8qCisJCQkgKiBBIGxvbmcgbGlmZSBidWZmZXIgd291bGQgbWFrZSBzZW5j ZSB0byBsaW1pdCBudW1iZXIgb2YKKwkJCSAqIG1lbW9yeSBhbGxvY2F0aW9ucworCQkJICovCisJ CQljaGFyICogYnVmZjsKKworCQkJLyoKKwkJCSAqIFJlYWQgY29tcHJlc3NlZCBkYXRhLCBjdXJP ZmZzZXQgZGlmZmVycyB3aXRoIHBvcworCQkJICogSXQgcmVhZHMgbGVzcyBkYXRhIHRoYW4gaXQg cmV0dXJucyB0byBjYWxsZXIKKwkJCSAqIFNvIHRoZSBjdXJPZmZzZXQgbXVzdCBiZSBhZHZhbmNl ZCBoZXJlIGJhc2VkIG9uIGNvbXByZXNzZWQgc2l6ZQorCQkJICovCisJCQlmaWxlLT5jdXJPZmZz ZXQrPXNpemVvZihuYnl0ZXMpOworCisJCQlidWZmID0gcGFsbG9jKG5ieXRlcyk7CisKKwkJCW5y ZWFkID0gRmlsZVJlYWQodGhpc2ZpbGUsCisJCQkJCQkJYnVmZiwKKwkJCQkJCQluYnl0ZXMsCisJ CQkJCQkJZmlsZS0+Y3VyT2Zmc2V0LAorCQkJCQkJCVdBSVRfRVZFTlRfQlVGRklMRV9SRUFEKTsK KworI2lmZGVmIFVTRV9MWjQKKwkJCWZpbGUtPm5ieXRlcyA9IExaNF9kZWNvbXByZXNzX3NhZmUo YnVmZiwKKwkJCQlmaWxlLT5idWZmZXIuZGF0YSxuYnl0ZXMsc2l6ZW9mKGZpbGUtPmJ1ZmZlcikp OworCQkJZmlsZS0+Y3VyT2Zmc2V0ICs9IG5yZWFkOworI2VuZGlmCisKKwkJCWlmIChmaWxlLT5u Ynl0ZXMgPCAwKQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RB VEFfQ09SUlVQVEVEKSwKKwkJCQkJCSBlcnJtc2dfaW50ZXJuYWwoImNvbXByZXNzZWQgbHo0IGRh dGEgaXMgY29ycnVwdCIpKSk7CisJCQlwZnJlZShidWZmKTsKKwkJfQorCisJfQorCiAJaWYgKGZp bGUtPm5ieXRlcyA8IDApCiAJewogCQlmaWxlLT5uYnl0ZXMgPSAwOwpAQCAtNDk0LDkgKzU4NCw1 NiBAQCBzdGF0aWMgdm9pZAogQnVmRmlsZUR1bXBCdWZmZXIoQnVmRmlsZSAqZmlsZSkKIHsKIAlp bnQJCQl3cG9zID0gMDsKLQlpbnQJCQlieXRlc3Rvd3JpdGU7CisJaW50CQkJYnl0ZXN0b3dyaXRl ID0gMDsKIAlGaWxlCQl0aGlzZmlsZTsKIAorCisJLyogU2F2ZSBuYnl0ZXMgdmFsdWUgYmVjYXVz ZSB0aGUgc2l6ZSBjaGFuZ2VzIGR1ZSB0byBjb21wcmVzc2lvbiAqLworCWludCBuYnl0ZXNPcmln aW5hbCA9IGZpbGUtPm5ieXRlczsKKworCWJvb2wgY29tcHJlc3Npb24gPSBmYWxzZTsKKworCWNo YXIgKiBEYXRhVG9Xcml0ZTsKKwlEYXRhVG9Xcml0ZSA9IGZpbGUtPmJ1ZmZlci5kYXRhOworCisJ LyoKKwkgKiBQcmVwYXJlIGNvbXByZXNzZWQgZGF0YSB0byB3cml0ZQorCSAqIHNpemUgb2YgY29t cHJlc3NlZCBibG9jayBuZWVkcyB0byBiZSBhZGRlZCBhdCB0aGUgYmVnZ2luaW5nIG9mIHRoZQor CSAqIGNvbXByZXNzZWQgZGF0YQorCSAqLworCisKKwlpZiAoZmlsZS0+Y29tcHJlc3MpIHsKKwkJ aW50IGNCdWZmZXJTaXplID0gMDsKKwkJY2hhciAqIGNEYXRhOworCQlpbnQgY1NpemUgPSAwOwor I2lmZGVmIFVTRV9MWjQKKwkJY0J1ZmZlclNpemUgPSBMWjRfY29tcHJlc3NCb3VuZChmaWxlLT5u Ynl0ZXMpOworI2VuZGlmCisJCS8qCisJCSAqIEEgbG9uZyBsaWZlIGJ1ZmZlciB3b3VsZCBtYWtl IHNlbmNlIHRvIGxpbWl0IG51bWJlciBvZgorCQkgKiBtZW1vcnkgYWxsb2NhdGlvbnMKKwkJICov CisJCWNvbXByZXNzaW9uID0gdHJ1ZTsKKwkJY0RhdGEgPSBwYWxsb2MoY0J1ZmZlclNpemUgKyBz aXplb2YoaW50KSk7CisjaWZkZWYgVVNFX0xaNAorCQkvKgorCQkgKiBVc2luZyBzdHJlYW0gY29t cHJlc3Npb24gd291bGQgbGVhZCB0byB0aGUgc2xpZ2h0IGltcHJvdmVtZW50IGluCisJCSAqIGNv bXByZXNzaW9uIHJhdGlvCisJCSAqLworCQljU2l6ZSA9IExaNF9jb21wcmVzc19kZWZhdWx0KGZp bGUtPmJ1ZmZlci5kYXRhLAorCQkJCWNEYXRhICsgc2l6ZW9mKGludCksZmlsZS0+bmJ5dGVzLCBj QnVmZmVyU2l6ZSk7CisjZW5kaWYKKworCQkvKiBXcml0ZSBzaXplIG9mIGNvbXByZXNzZWQgYmxv Y2sgaW4gZnJvbnQgb2YgY29tcHJlc3NlZCBkYXRhCisJCSAqIEl0J3MgdXNlZCB0byBkZXRlcm1p bmUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZCB3aXRoaW4KKwkJICogZGVjb21wcmVzc2lvbiBwcm9j ZXNzCisJCSAqLworCQltZW1jcHkoY0RhdGEsJmNTaXplLHNpemVvZihpbnQpKTsKKwkJZmlsZS0+ bmJ5dGVzPWNTaXplICsgc2l6ZW9mKGludCk7CisJCURhdGFUb1dyaXRlID0gY0RhdGE7CisJfQor CiAJLyoKIAkgKiBVbmxpa2UgQnVmRmlsZUxvYWRCdWZmZXIsIHdlIG11c3QgZHVtcCB0aGUgd2hv bGUgYnVmZmVyIGV2ZW4gaWYgaXQKIAkgKiBjcm9zc2VzIGEgY29tcG9uZW50LWZpbGUgYm91bmRh cnk7IHNvIHdlIG5lZWQgYSBsb29wLgpAQCAtNTM1LDcgKzY3Miw3IEBAIEJ1ZkZpbGVEdW1wQnVm ZmVyKEJ1ZkZpbGUgKmZpbGUpCiAJCQlJTlNUUl9USU1FX1NFVF9aRVJPKGlvX3N0YXJ0KTsKIAog CQlieXRlc3Rvd3JpdGUgPSBGaWxlV3JpdGUodGhpc2ZpbGUsCi0JCQkJCQkJCSBmaWxlLT5idWZm ZXIuZGF0YSArIHdwb3MsCisJCQkJCQkJCSBEYXRhVG9Xcml0ZSArIHdwb3MsCiAJCQkJCQkJCSBi eXRlc3Rvd3JpdGUsCiAJCQkJCQkJCSBmaWxlLT5jdXJPZmZzZXQsCiAJCQkJCQkJCSBXQUlUX0VW RU5UX0JVRkZJTEVfV1JJVEUpOwpAQCAtNTY0LDcgKzcwMSwxOSBAQCBCdWZGaWxlRHVtcEJ1ZmZl cihCdWZGaWxlICpmaWxlKQogCSAqIGxvZ2ljYWwgZmlsZSBwb3NpdGlvbiwgaWUsIG9yaWdpbmFs IHZhbHVlICsgcG9zLCBpbiBjYXNlIHRoYXQgaXMgbGVzcwogCSAqIChhcyBjb3VsZCBoYXBwZW4g ZHVlIHRvIGEgc21hbGwgYmFja3dhcmRzIHNlZWsgaW4gYSBkaXJ0eSBidWZmZXIhKQogCSAqLwot CWZpbGUtPmN1ck9mZnNldCAtPSAoZmlsZS0+bmJ5dGVzIC0gZmlsZS0+cG9zKTsKKworCisJaWYg KCFmaWxlLT5jb21wcmVzcykKKwkJZmlsZS0+Y3VyT2Zmc2V0IC09IChmaWxlLT5uYnl0ZXMgLSBm aWxlLT5wb3MpOworCWVsc2UKKwkJaWYgKG5ieXRlc09yaWdpbmFsIC0gZmlsZS0+cG9zICE9IDAp CisJCQkvKiBjdXJPZmZzZXQgbXVzdCBiZSBjb3JyZWN0ZWQgYWxzbyBpZiBjb21wcmVzc2lvbiBp cworCQkJICogZW5hYmxlZCwgbmJ5dGVzIHdhcyBjaGFuZ2VkIGJ5IGNvbXByZXNzaW9uIGJ1dCB3 ZQorCQkJICogaGF2ZSB0byB1c2UgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIG5ieXRlcworCQkJICov CisJCQlmaWxlLT5jdXJPZmZzZXQtPWJ5dGVzdG93cml0ZTsKKworCiAJaWYgKGZpbGUtPmN1ck9m ZnNldCA8IDApCS8qIGhhbmRsZSBwb3NzaWJsZSBzZWdtZW50IGNyb3NzaW5nICovCiAJewogCQlm aWxlLT5jdXJGaWxlLS07CkBAIC01NzcsNiArNzI2LDkgQEAgQnVmRmlsZUR1bXBCdWZmZXIoQnVm RmlsZSAqZmlsZSkKIAkgKi8KIAlmaWxlLT5wb3MgPSAwOwogCWZpbGUtPm5ieXRlcyA9IDA7CisK KwlpZiAoY29tcHJlc3Npb24pCisJCXBmcmVlKERhdGFUb1dyaXRlKTsKIH0KIAogLyoKQEAgLTYw Miw4ICs3NTQsMTQgQEAgQnVmRmlsZVJlYWRDb21tb24oQnVmRmlsZSAqZmlsZSwgdm9pZCAqcHRy LCBzaXplX3Qgc2l6ZSwgYm9vbCBleGFjdCwgYm9vbCBlb2ZPSykKIAl7CiAJCWlmIChmaWxlLT5w b3MgPj0gZmlsZS0+bmJ5dGVzKQogCQl7Ci0JCQkvKiBUcnkgdG8gbG9hZCBtb3JlIGRhdGEgaW50 byBidWZmZXIuICovCi0JCQlmaWxlLT5jdXJPZmZzZXQgKz0gZmlsZS0+cG9zOworCQkJLyogVHJ5 IHRvIGxvYWQgbW9yZSBkYXRhIGludG8gYnVmZmVyLgorCQkJICoKKwkJCSAqIGN1ck9mZnNldCBp cyBtb3ZlZCB3aXRoaW4gQnVmRmlsZUxvYWRCdWZmZXIKKwkJCSAqIGJlY2F1c2Ugc3RvcmVkIGRh dGEgc2l6ZSBkaWZmZXJzIGZyb20gbG9hZGVkLworCQkJICogZGVjb21wcmVzc2VkIHNpemUKKwkJ CSAqICovCisJCQlpZiAoIWZpbGUtPmNvbXByZXNzKQorCQkJCWZpbGUtPmN1ck9mZnNldCArPSBm aWxlLT5wb3M7CiAJCQlmaWxlLT5wb3MgPSAwOwogCQkJZmlsZS0+bmJ5dGVzID0gMDsKIAkJCUJ1 ZkZpbGVMb2FkQnVmZmVyKGZpbGUpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlz Yy9ndWNfdGFibGVzLmMgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYwppbmRl eCA2ODYzMDlkYjU4Li4zODIxY2FmNzYzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9t aXNjL2d1Y190YWJsZXMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMu YwpAQCAtNzMsNiArNzMsNyBAQAogI2luY2x1ZGUgInJlcGxpY2F0aW9uL3N5bmNyZXAuaCIKICNp bmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmcGFnZS5oIgor I2luY2x1ZGUgInN0b3JhZ2UvYnVmZmlsZS5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbGFyZ2Vfb2Jq ZWN0LmgiCiAjaW5jbHVkZSAic3RvcmFnZS9wZ19zaG1lbS5oIgogI2luY2x1ZGUgInN0b3JhZ2Uv cHJlZGljYXRlLmgiCkBAIC00NTQsNiArNDU1LDE3IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgY29u ZmlnX2VudW1fZW50cnkgZGVmYXVsdF90b2FzdF9jb21wcmVzc2lvbl9vcHRpb25zW10gPSB7CiAj ZW5kaWYKIAl7TlVMTCwgMCwgZmFsc2V9CiB9OworLyoKKyAqIHBnbHogYW5kIHpzdGQgc3VwcG9y dCBzaG91bGQgYmUgYWRkZWQgYXMgZnV0dXJlIGVuaGFuY2VtZW50CisgKgorICovCitzdGF0aWMg Y29uc3Qgc3RydWN0IGNvbmZpZ19lbnVtX2VudHJ5IHRlbXBfZmlsZV9jb21wcmVzc2lvbl9vcHRp b25zW10gPSB7CisJeyJubyIsIFRFTVBfTk9ORV9DT01QUkVTU0lPTiwgZmFsc2V9LAorI2lmZGVm ICBVU0VfTFo0CisJeyJsejQiLCBURU1QX0xaNF9DT01QUkVTU0lPTiwgZmFsc2V9LAorI2VuZGlm CisJe05VTEwsIDAsIGZhbHNlfQorfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfZW51 bV9lbnRyeSB3YWxfY29tcHJlc3Npb25fb3B0aW9uc1tdID0gewogCXsicGdseiIsIFdBTF9DT01Q UkVTU0lPTl9QR0xaLCBmYWxzZX0sCkBAIC00ODU2LDYgKzQ4NjgsMTcgQEAgc3RydWN0IGNvbmZp Z19lbnVtIENvbmZpZ3VyZU5hbWVzRW51bVtdID0KIAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCiAK Kwl7CisJCXsidGVtcF9maWxlX2NvbXByZXNzaW9uIiwgUEdDX1VTRVJTRVQsIENMSUVOVF9DT05O X1NUQVRFTUVOVCwKKwkJCWdldHRleHRfbm9vcCgiU2V0cyB0aGUgZGVmYXVsdCBjb21wcmVzc2lv biBtZXRob2QgZm9yIGNvbXByZXNzaWJsZSB2YWx1ZXMuIiksCisJCQlOVUxMCisJCX0sCisJCSZ0 ZW1wX2ZpbGVfY29tcHJlc3Npb24sCisJCVRFTVBfTk9ORV9DT01QUkVTU0lPTiwKKwkJdGVtcF9m aWxlX2NvbXByZXNzaW9uX29wdGlvbnMsCisJCU5VTEwsIE5VTEwsIE5VTEwKKwl9LAorCiAJewog CQl7ImRlZmF1bHRfdHJhbnNhY3Rpb25faXNvbGF0aW9uIiwgUEdDX1VTRVJTRVQsIENMSUVOVF9D T05OX1NUQVRFTUVOVCwKIAkJCWdldHRleHRfbm9vcCgiU2V0cyB0aGUgdHJhbnNhY3Rpb24gaXNv bGF0aW9uIGxldmVsIG9mIGVhY2ggbmV3IHRyYW5zYWN0aW9uLiIpLApkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvdXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlIGIvc3JjL2JhY2tlbmQv dXRpbHMvbWlzYy9wb3N0Z3Jlc3FsLmNvbmYuc2FtcGxlCmluZGV4IDY2N2UwZGM0MGEuLmU5YzBi MzYzNTIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvcG9zdGdyZXNxbC5jb25m LnNhbXBsZQorKysgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL3Bvc3RncmVzcWwuY29uZi5zYW1w bGUKQEAgLTE3Nyw2ICsxNzcsNyBAQAogCiAjbWF4X25vdGlmeV9xdWV1ZV9wYWdlcyA9IDEwNDg1 NzYJIyBsaW1pdHMgdGhlIG51bWJlciBvZiBTTFJVIHBhZ2VzIGFsbG9jYXRlZAogCQkJCQkjIGZv ciBOT1RJRlkgLyBMSVNURU4gcXVldWUKKyN0ZW1wX2ZpbGVfY29tcHJlc3Npb24gPSAnbm8nCSMg ZW5hYmxlcyB0ZW1wb3JhcnkgZmlsZXMgY29tcHJlc3Npb24KIAogIyAtIEtlcm5lbCBSZXNvdXJj ZXMgLQogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9zb3J0L2xvZ3RhcGUuYyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jCmluZGV4IDQ0YjMwZTg2YWQuLmFmNDNiM2Vi YjEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jCisrKyBiL3Ny Yy9iYWNrZW5kL3V0aWxzL3NvcnQvbG9ndGFwZS5jCkBAIC01OTIsNyArNTkyLDcgQEAgTG9naWNh bFRhcGVTZXRDcmVhdGUoYm9vbCBwcmVhbGxvY2F0ZSwgU2hhcmVkRmlsZVNldCAqZmlsZXNldCwg aW50IHdvcmtlcikKIAkJbHRzLT5wZmlsZSA9IEJ1ZkZpbGVDcmVhdGVGaWxlU2V0KCZmaWxlc2V0 LT5mcywgZmlsZW5hbWUpOwogCX0KIAllbHNlCi0JCWx0cy0+cGZpbGUgPSBCdWZGaWxlQ3JlYXRl VGVtcChmYWxzZSk7CisJCWx0cy0+cGZpbGUgPSBCdWZGaWxlQ3JlYXRlVGVtcChmYWxzZSwgZmFs c2UpOwogCiAJcmV0dXJuIGx0czsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL3Nv cnQvdHVwbGVzdG9yZS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXN0b3JlLmMKaW5k ZXggYTcyMGQ3MDIwMC4uYTk1MmYwZjRmNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMv c29ydC90dXBsZXN0b3JlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvc29ydC90dXBsZXN0b3Jl LmMKQEAgLTg2MCw3ICs4NjAsNyBAQCB0dXBsZXN0b3JlX3B1dHR1cGxlX2NvbW1vbihUdXBsZXN0 b3Jlc3RhdGUgKnN0YXRlLCB2b2lkICp0dXBsZSkKIAkJCSAqLwogCQkJb2xkY3h0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKHN0YXRlLT5jb250ZXh0LT5wYXJlbnQpOwogCi0JCQlzdGF0ZS0+bXlm aWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoc3RhdGUtPmludGVyWGFjdCk7CisJCQlzdGF0ZS0+bXlm aWxlID0gQnVmRmlsZUNyZWF0ZVRlbXAoc3RhdGUtPmludGVyWGFjdCwgZmFsc2UpOwogCiAJCQlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv c3RvcmFnZS9idWZmaWxlLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1ZmZpbGUuaAppbmRleCA1 ZjZkN2M4ZTNmLi40ODZiNTUyZTMxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1 ZmZpbGUuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1ZmZpbGUuaApAQCAtMzIsMTEgKzMy LDIyIEBACiAKIHR5cGVkZWYgc3RydWN0IEJ1ZkZpbGUgQnVmRmlsZTsKIAordHlwZWRlZiBlbnVt Cit7CisJVEVNUF9OT05FX0NPTVBSRVNTSU9OLAorI2lmZGVmIFVTRV9MWjQKKwlURU1QX0xaNF9D T01QUkVTU0lPTgorI2VuZGlmCit9IFRlbXBDb21wcmVzc2lvbjsKKworZXh0ZXJuIFBHRExMSU1Q T1JUIGludCB0ZW1wX2ZpbGVfY29tcHJlc3Npb247CisKKwogLyoKICAqIHByb3RvdHlwZXMgZm9y IGZ1bmN0aW9ucyBpbiBidWZmaWxlLmMKICAqLwogCi1leHRlcm4gQnVmRmlsZSAqQnVmRmlsZUNy ZWF0ZVRlbXAoYm9vbCBpbnRlclhhY3QpOworZXh0ZXJuIEJ1ZkZpbGUgKkJ1ZkZpbGVDcmVhdGVU ZW1wKGJvb2wgaW50ZXJYYWN0LCBib29sIGNvbXByZXNzKTsKIGV4dGVybiB2b2lkIEJ1ZkZpbGVD bG9zZShCdWZGaWxlICpmaWxlKTsKIGV4dGVybiBwZ19ub2Rpc2NhcmQgc2l6ZV90IEJ1ZkZpbGVS ZWFkKEJ1ZkZpbGUgKmZpbGUsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwogZXh0ZXJuIHZvaWQg QnVmRmlsZVJlYWRFeGFjdChCdWZGaWxlICpmaWxlLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKTsK ZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvR05VbWFrZWZpbGUgYi9zcmMvdGVzdC9yZWdy ZXNzL0dOVW1ha2VmaWxlCmluZGV4IDkwMDM0MzVhYWIuLjg1OWViNzliZDcgMTAwNjQ0Ci0tLSBh L3NyYy90ZXN0L3JlZ3Jlc3MvR05VbWFrZWZpbGUKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9HTlVt YWtlZmlsZQpAQCAtMTE0LDYgKzExNCwxMCBAQCBzdWJtYWtlLWNvbnRyaWItc3BpOiB8IHN1Ym1h a2UtbGlicGdwb3J0IHN1Ym1ha2UtZ2VuZXJhdGVkLWhlYWRlcnMKIFJFR1JFU1NfT1BUUyA9IC0t ZGxwYXRoPS4gLS1tYXgtY29uY3VycmVudC10ZXN0cz0yMCBcCiAJJChFWFRSQV9SRUdSRVNTX09Q VFMpCiAKK2lmZXEgKCQod2l0aF9sejQpLHllcykKK292ZXJyaWRlIEVYVFJBX1RFU1RTIDo9IGpv aW5faGFzaF9sejQgJChFWFRSQV9URVNUUykKK2VuZGlmCisKIGNoZWNrOiBhbGwKIAkkKHBnX3Jl Z3Jlc3NfY2hlY2spICQoUkVHUkVTU19PUFRTKSAtLXNjaGVkdWxlPSQoc3JjZGlyKS9wYXJhbGxl bF9zY2hlZHVsZSAkKE1BWENPTk5PUFQpICQoRVhUUkFfVEVTVFMpCiAKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbl9oYXNoX2x6NC5vdXQgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pvaW5faGFzaF9sejQub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwMDAuLjk2NmE1Y2Q4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pvaW5faGFzaF9sejQub3V0CkBAIC0wLDAgKzEsMTE2NiBAQAorLS0KKy0t IGV4ZXJjaXNlcyBmb3IgdGhlIGhhc2ggam9pbiBjb2RlCistLQorYmVnaW47CitzZXQgbG9jYWwg bWluX3BhcmFsbGVsX3RhYmxlX3NjYW5fc2l6ZSA9IDA7CitzZXQgbG9jYWwgcGFyYWxsZWxfc2V0 dXBfY29zdCA9IDA7CitzZXQgbG9jYWwgZW5hYmxlX2hhc2hqb2luID0gb247CitzZXQgbG9jYWwg dGVtcF9maWxlX2NvbXByZXNzaW9uID0gJ2x6NCc7CistLSBFeHRyYWN0IGJ1Y2tldCBhbmQgYmF0 Y2ggY291bnRzIGZyb20gYW4gZXhwbGFpbiBhbmFseXplIHBsYW4uICBJbgorLS0gZ2VuZXJhbCB3 ZSBjYW4ndCBtYWtlIGFzc2VydGlvbnMgYWJvdXQgaG93IG1hbnkgYmF0Y2hlcyAob3IKKy0tIGJ1 Y2tldHMpIHdpbGwgYmUgcmVxdWlyZWQgYmVjYXVzZSBpdCBjYW4gdmFyeSwgYnV0IHdlIGNhbiBp biBzb21lCistLSBzcGVjaWFsIGNhc2VzIGFuZCB3ZSBjYW4gY2hlY2sgZm9yIGdyb3d0aC4KK2Ny ZWF0ZSBvciByZXBsYWNlIGZ1bmN0aW9uIGZpbmRfaGFzaChub2RlIGpzb24pCityZXR1cm5zIGpz b24gbGFuZ3VhZ2UgcGxwZ3NxbAorYXMKKyQkCitkZWNsYXJlCisgIHgganNvbjsKKyAgY2hpbGQg anNvbjsKK2JlZ2luCisgIGlmIG5vZGUtPj4nTm9kZSBUeXBlJyA9ICdIYXNoJyB0aGVuCisgICAg cmV0dXJuIG5vZGU7CisgIGVsc2UKKyAgICBmb3IgY2hpbGQgaW4gc2VsZWN0IGpzb25fYXJyYXlf ZWxlbWVudHMobm9kZS0+J1BsYW5zJykKKyAgICBsb29wCisgICAgICB4IDo9IGZpbmRfaGFzaChj aGlsZCk7CisgICAgICBpZiB4IGlzIG5vdCBudWxsIHRoZW4KKyAgICAgICAgcmV0dXJuIHg7Cisg ICAgICBlbmQgaWY7CisgICAgZW5kIGxvb3A7CisgICAgcmV0dXJuIG51bGw7CisgIGVuZCBpZjsK K2VuZDsKKyQkOworY3JlYXRlIG9yIHJlcGxhY2UgZnVuY3Rpb24gaGFzaF9qb2luX2JhdGNoZXMo cXVlcnkgdGV4dCkKK3JldHVybnMgdGFibGUgKG9yaWdpbmFsIGludCwgZmluYWwgaW50KSBsYW5n dWFnZSBwbHBnc3FsCithcworJCQKK2RlY2xhcmUKKyAgd2hvbGVfcGxhbiBqc29uOworICBoYXNo X25vZGUganNvbjsKK2JlZ2luCisgIGZvciB3aG9sZV9wbGFuIGluCisgICAgZXhlY3V0ZSAnZXhw bGFpbiAoYW5hbHl6ZSwgZm9ybWF0ICcnanNvbicnKSAnIHx8IHF1ZXJ5CisgIGxvb3AKKyAgICBo YXNoX25vZGUgOj0gZmluZF9oYXNoKGpzb25fZXh0cmFjdF9wYXRoKHdob2xlX3BsYW4sICcwJywg J1BsYW4nKSk7CisgICAgb3JpZ2luYWwgOj0gaGFzaF9ub2RlLT4+J09yaWdpbmFsIEhhc2ggQmF0 Y2hlcyc7CisgICAgZmluYWwgOj0gaGFzaF9ub2RlLT4+J0hhc2ggQmF0Y2hlcyc7CisgICAgcmV0 dXJuIG5leHQ7CisgIGVuZCBsb29wOworZW5kOworJCQ7CistLSBNYWtlIGEgc2ltcGxlIHJlbGF0 aW9uIHdpdGggd2VsbCBkaXN0cmlidXRlZCBrZXlzIGFuZCBjb3JyZWN0bHkKKy0tIGVzdGltYXRl ZCBzaXplLgorY3JlYXRlIHRhYmxlIHNpbXBsZSBhcworICBzZWxlY3QgZ2VuZXJhdGVfc2VyaWVz KDEsIDIwMDAwKSBBUyBpZCwgJ2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEnOwor YWx0ZXIgdGFibGUgc2ltcGxlIHNldCAocGFyYWxsZWxfd29ya2VycyA9IDIpOworYW5hbHl6ZSBz aW1wbGU7CistLSBNYWtlIGEgcmVsYXRpb24gd2hvc2Ugc2l6ZSB3ZSB3aWxsIHVuZGVyLWVzdGlt YXRlLiAgV2Ugd2FudCBzdGF0cworLS0gdG8gc2F5IDEwMDAgcm93cywgYnV0IGFjdHVhbGx5IHRo ZXJlIGFyZSAyMCwwMDAgcm93cy4KK2NyZWF0ZSB0YWJsZSBiaWdnZXJfdGhhbl9pdF9sb29rcyBh cworICBzZWxlY3QgZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMDAwKSBhcyBpZCwgJ2FhYWFhYWFhYWFh YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEnOworYWx0ZXIgdGFibGUgYmlnZ2VyX3RoYW5faXRfbG9v a3Mgc2V0IChhdXRvdmFjdXVtX2VuYWJsZWQgPSAnZmFsc2UnKTsKK2FsdGVyIHRhYmxlIGJpZ2dl cl90aGFuX2l0X2xvb2tzIHNldCAocGFyYWxsZWxfd29ya2VycyA9IDIpOworYW5hbHl6ZSBiaWdn ZXJfdGhhbl9pdF9sb29rczsKK3VwZGF0ZSBwZ19jbGFzcyBzZXQgcmVsdHVwbGVzID0gMTAwMCB3 aGVyZSByZWxuYW1lID0gJ2JpZ2dlcl90aGFuX2l0X2xvb2tzJzsKKy0tIE1ha2UgYSByZWxhdGlv biB3aG9zZSBzaXplIHdlIHVuZGVyZXN0aW1hdGUgYW5kIHRoYXQgYWxzbyBoYXMgYQorLS0ga2lu ZCBvZiBza2V3IHRoYXQgYnJlYWtzIG91ciBiYXRjaGluZyBzY2hlbWUuICBXZSB3YW50IHN0YXRz IHRvIHNheQorLS0gMiByb3dzLCBidXQgYWN0dWFsbHkgdGhlcmUgYXJlIDIwLDAwMCByb3dzIHdp dGggdGhlIHNhbWUga2V5LgorY3JlYXRlIHRhYmxlIGV4dHJlbWVseV9za2V3ZWQgKGlkIGludCwg dCB0ZXh0KTsKK2FsdGVyIHRhYmxlIGV4dHJlbWVseV9za2V3ZWQgc2V0IChhdXRvdmFjdXVtX2Vu YWJsZWQgPSAnZmFsc2UnKTsKK2FsdGVyIHRhYmxlIGV4dHJlbWVseV9za2V3ZWQgc2V0IChwYXJh bGxlbF93b3JrZXJzID0gMik7CithbmFseXplIGV4dHJlbWVseV9za2V3ZWQ7CitpbnNlcnQgaW50 byBleHRyZW1lbHlfc2tld2VkCisgIHNlbGVjdCA0MiBhcyBpZCwgJ2FhYWFhYWFhYWFhYWFhYWFh YWFhYWFhYWFhYWFhYWFhYWEnCisgIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMDAwKTsKK3Vw ZGF0ZSBwZ19jbGFzcworICBzZXQgcmVsdHVwbGVzID0gMiwgcmVscGFnZXMgPSBwZ19yZWxhdGlv bl9zaXplKCdleHRyZW1lbHlfc2tld2VkJykgLyA4MTkyCisgIHdoZXJlIHJlbG5hbWUgPSAnZXh0 cmVtZWx5X3NrZXdlZCc7CistLSBNYWtlIGEgcmVsYXRpb24gd2l0aCBhIGNvdXBsZSBvZiBlbm9y bW91cyB0dXBsZXMuCitjcmVhdGUgdGFibGUgd2lkZSBhcyBzZWxlY3QgZ2VuZXJhdGVfc2VyaWVz KDEsIDIpIGFzIGlkLCBycGFkKCcnLCAzMjAwMDAsICd4JykgYXMgdDsKK2FsdGVyIHRhYmxlIHdp ZGUgc2V0IChwYXJhbGxlbF93b3JrZXJzID0gMik7CistLSBUaGUgIm9wdGltYWwiIGNhc2U6IHRo ZSBoYXNoIHRhYmxlIGZpdHMgaW4gbWVtb3J5OyB3ZSBwbGFuIGZvciAxCistLSBiYXRjaCwgd2Ug c3RpY2sgdG8gdGhhdCBudW1iZXIsIGFuZCBwZWFrIG1lbW9yeSB1c2FnZSBzdGF5cyB3aXRoaW4K Ky0tIG91ciB3b3JrX21lbSBidWRnZXQKKy0tIG5vbi1wYXJhbGxlbAorc2F2ZXBvaW50IHNldHRp bmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAwOworc2V0 IGxvY2FsIHdvcmtfbWVtID0gJzRNQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9 IDEuMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxl IHIgam9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IEFnZ3JlZ2F0ZQorICAgLT4gIEhhc2ggSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAoci5pZCA9 IHMuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgIC0+ICBI YXNoCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHMKKyg2IHJvd3MpCisK K3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsK KyBjb3VudCAKKy0tLS0tLS0KKyAyMDAwMAorKDEgcm93KQorCitzZWxlY3Qgb3JpZ2luYWwgPiAx IGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9i YXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMoCiskJAorICBzZWxlY3QgY291bnQoKikg ZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CiskJCk7CisgaW5pdGlhbGx5 X211bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hlcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0r LS0tLS0tLS0tLS0tLS0tLS0tLQorIGYgICAgICAgICAgICAgICAgICAgIHwgZgorKDEgcm93KQor Cityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxsZWwtb2JsaXZp b3VzIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxl bF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2FsIHdvcmtfbWVtID0gJzRNQic7Citz ZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsKK3NldCBsb2NhbCBlbmFibGVfcGFy YWxsZWxfaGFzaCA9IG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCop IGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZpbmFsaXplIEFnZ3Jl Z2F0ZQorICAgLT4gIEdhdGhlcgorICAgICAgICAgV29ya2VycyBQbGFubmVkOiAyCisgICAgICAg ICAtPiAgUGFydGlhbCBBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgIC0+ICBIYXNoIEpvaW4KKyAg ICAgICAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAgICAgICAgICAg ICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIHNpbXBsZSByCisgICAgICAgICAgICAg ICAgICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHNpbXBsZSBzCisoOSByb3dzKQorCitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBq b2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CisgY291bnQgCistLS0tLS0tCisgMjAwMDAKKygxIHJv dykKKworc2VsZWN0IG9yaWdpbmFsID4gMSBhcyBpbml0aWFsbHlfbXVsdGliYXRjaCwgZmluYWwg PiBvcmlnaW5hbCBhcyBpbmNyZWFzZWRfYmF0Y2hlcworICBmcm9tIGhhc2hfam9pbl9iYXRjaGVz KAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2lu ZyAoaWQpOworJCQpOworIGluaXRpYWxseV9tdWx0aWJhdGNoIHwgaW5jcmVhc2VkX2JhdGNoZXMg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0KKyBmICAgICAgICAg ICAgICAgICAgICB8IGYKKygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBwYXJh bGxlbCB3aXRoIHBhcmFsbGVsLWF3YXJlIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOwor c2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2Fs IHdvcmtfbWVtID0gJzRNQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsK K3NldCBsb2NhbCBlbmFibGVfcGFyYWxsZWxfaGFzaCA9IG9uOworZXhwbGFpbiAoY29zdHMgb2Zm KQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChp ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgRmluYWxpemUgQWdncmVnYXRlCisgICAtPiAgR2F0aGVyCisgICAg ICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAgIC0+ICBQYXJ0aWFsIEFnZ3JlZ2F0ZQor ICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIEhhc2ggSm9pbgorICAgICAgICAgICAgICAgICAg ICAgSGFzaCBDb25kOiAoci5pZCA9IHMuaWQpCisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFy YWxsZWwgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJh bGxlbCBIYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgU2VxIFNj YW4gb24gc2ltcGxlIHMKKyg5IHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSBy IGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAyMDAwMAorKDEg cm93KQorCitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5h bCA+IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNo ZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVz aW5nIChpZCk7CiskJCk7CisgaW5pdGlhbGx5X211bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hl cyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLQorIGYgICAgICAg ICAgICAgICAgICAgIHwgZgorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIFRo ZSAiZ29vZCIgY2FzZTogYmF0Y2hlcyByZXF1aXJlZCwgYnV0IHdlIHBsYW4gdGhlIHJpZ2h0IG51 bWJlcjsgd2UKKy0tIHBsYW4gZm9yIHNvbWUgbnVtYmVyIG9mIGJhdGNoZXMsIGFuZCB3ZSBzdGlj ayB0byB0aGF0IG51bWJlciwgYW5kCistLSBwZWFrIG1lbW9yeSB1c2FnZSBzYXlzIHdpdGhpbiBv dXIgd29ya19tZW0gYnVkZ2V0CistLSBub24tcGFyYWxsZWwKK3NhdmVwb2ludCBzZXR0aW5nczsK K3NldCBsb2NhbCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMDsKK3NldCBsb2Nh bCB3b3JrX21lbSA9ICcxMjhrQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEu MDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIg am9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFn Z3JlZ2F0ZQorICAgLT4gIEhhc2ggSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAoci5pZCA9IHMu aWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgIC0+ICBIYXNo CisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHMKKyg2IHJvd3MpCisKK3Nl bGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyBj b3VudCAKKy0tLS0tLS0KKyAyMDAwMAorKDEgcm93KQorCitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFz IGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRj aGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJv bSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CiskJCk7CisgaW5pdGlhbGx5X211 bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hlcyAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0t LS0tLS0tLS0tLS0tLS0tLQorIHQgICAgICAgICAgICAgICAgICAgIHwgZgorKDEgcm93KQorCity b2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxsZWwtb2JsaXZpb3Vz IGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxlbF93 b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2FsIHdvcmtfbWVtID0gJzEyOGtCJzsKK3Nl dCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworc2V0IGxvY2FsIGVuYWJsZV9wYXJh bGxlbF9oYXNoID0gb2ZmOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgY291bnQoKikg ZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CisgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRmluYWxpemUgQWdncmVn YXRlCisgICAtPiAgR2F0aGVyCisgICAgICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAg IC0+ICBQYXJ0aWFsIEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgLT4gIEhhc2ggSm9pbgorICAg ICAgICAgICAgICAgICAgICAgSGFzaCBDb25kOiAoci5pZCA9IHMuaWQpCisgICAgICAgICAgICAg ICAgICAgICAtPiAgUGFyYWxsZWwgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgICAgICAg ICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gc2ltcGxlIHMKKyg5IHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpv aW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAyMDAwMAorKDEgcm93 KQorCitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+ IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMo CiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5n IChpZCk7CiskJCk7CisgaW5pdGlhbGx5X211bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hlcyAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLQorIHQgICAgICAgICAg ICAgICAgICAgIHwgZgorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFs bGVsIHdpdGggcGFyYWxsZWwtYXdhcmUgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7Citz ZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitzZXQgbG9jYWwg d29ya19tZW0gPSAnMTkya0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7 CitzZXQgbG9jYWwgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsKK2V4cGxhaW4gKGNvc3RzIG9m ZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2luZyAo aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEZpbmFsaXplIEFnZ3JlZ2F0ZQorICAgLT4gIEdhdGhlcgorICAg ICAgICAgV29ya2VycyBQbGFubmVkOiAyCisgICAgICAgICAtPiAgUGFydGlhbCBBZ2dyZWdhdGUK KyAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBIYXNoIEpvaW4KKyAgICAgICAgICAgICAgICAg ICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAgICAgICAgICAgICAgICAgICAgLT4gIFBh cmFsbGVsIFNlcSBTY2FuIG9uIHNpbXBsZSByCisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFy YWxsZWwgSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBT Y2FuIG9uIHNpbXBsZSBzCisoOSByb3dzKQorCitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUg ciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CisgY291bnQgCistLS0tLS0tCisgMjAwMDAKKygx IHJvdykKKworc2VsZWN0IG9yaWdpbmFsID4gMSBhcyBpbml0aWFsbHlfbXVsdGliYXRjaCwgZmlu YWwgPiBvcmlnaW5hbCBhcyBpbmNyZWFzZWRfYmF0Y2hlcworICBmcm9tIGhhc2hfam9pbl9iYXRj aGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1 c2luZyAoaWQpOworJCQpOworIGluaXRpYWxseV9tdWx0aWJhdGNoIHwgaW5jcmVhc2VkX2JhdGNo ZXMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0KKyB0ICAgICAg ICAgICAgICAgICAgICB8IGYKKygxIHJvdykKKworLS0gcGFyYWxsZWwgZnVsbCBtdWx0aS1iYXRj aCBoYXNoIGpvaW4KK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9p biBzaW1wbGUgcyB1c2luZyAoaWQpOworIGNvdW50IAorLS0tLS0tLQorIDIwMDAwCisoMSByb3cp CisKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworLS0gVGhlICJiYWQiIGNhc2U6IGR1cmluZyBleGVj dXRpb24gd2UgbmVlZCB0byBpbmNyZWFzZSBudW1iZXIgb2YKKy0tIGJhdGNoZXM7IGluIHRoaXMg Y2FzZSB3ZSBwbGFuIGZvciAxIGJhdGNoLCBhbmQgaW5jcmVhc2UgYXQgbGVhc3QgYQorLS0gY291 cGxlIG9mIHRpbWVzLCBhbmQgcGVhayBtZW1vcnkgdXNhZ2Ugc3RheXMgd2l0aGluIG91ciB3b3Jr X21lbQorLS0gYnVkZ2V0CistLSBub24tcGFyYWxsZWwKK3NhdmVwb2ludCBzZXR0aW5nczsKK3Nl dCBsb2NhbCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMDsKK3NldCBsb2NhbCB3 b3JrX21lbSA9ICcxMjhrQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsK K2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIEZST00gc2ltcGxlIHIgSk9J TiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIFVTSU5HIChpZCk7CisgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEhh c2ggSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAoci5pZCA9IHMuaWQpCisgICAgICAgICAtPiAg U2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAt PiAgU2VxIFNjYW4gb24gYmlnZ2VyX3RoYW5faXRfbG9va3MgcworKDYgcm93cykKKworc2VsZWN0 IGNvdW50KCopIEZST00gc2ltcGxlIHIgSk9JTiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIFVTSU5H IChpZCk7CisgY291bnQgCistLS0tLS0tCisgMjAwMDAKKygxIHJvdykKKworc2VsZWN0IG9yaWdp bmFsID4gMSBhcyBpbml0aWFsbHlfbXVsdGliYXRjaCwgZmluYWwgPiBvcmlnaW5hbCBhcyBpbmNy ZWFzZWRfYmF0Y2hlcworICBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAgc2VsZWN0IGNv dW50KCopIEZST00gc2ltcGxlIHIgSk9JTiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIFVTSU5HIChp ZCk7CiskJCk7CisgaW5pdGlhbGx5X211bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hlcyAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLQorIGYgICAgICAgICAgICAg ICAgICAgIHwgdAorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVs IHdpdGggcGFyYWxsZWwtb2JsaXZpb3VzIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOwor c2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2Fs IHdvcmtfbWVtID0gJzEyOGtCJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4w Oworc2V0IGxvY2FsIGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworZXhwbGFpbiAoY29zdHMg b2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGJpZ2dlcl90aGFuX2l0 X2xvb2tzIHMgdXNpbmcgKGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRmluYWxpemUgQWdn cmVnYXRlCisgICAtPiAgR2F0aGVyCisgICAgICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAg ICAgIC0+ICBQYXJ0aWFsIEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgLT4gIEhhc2ggSm9pbgor ICAgICAgICAgICAgICAgICAgICAgSGFzaCBDb25kOiAoci5pZCA9IHMuaWQpCisgICAgICAgICAg ICAgICAgICAgICAtPiAgUGFyYWxsZWwgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyAgICAgICAgICAg ICAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNj YW4gb24gYmlnZ2VyX3RoYW5faXRfbG9va3MgcworKDkgcm93cykKKworc2VsZWN0IGNvdW50KCop IGZyb20gc2ltcGxlIHIgam9pbiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIHVzaW5nIChpZCk7Cisg Y291bnQgCistLS0tLS0tCisgMjAwMDAKKygxIHJvdykKKworc2VsZWN0IG9yaWdpbmFsID4gMSBh cyBpbml0aWFsbHlfbXVsdGliYXRjaCwgZmluYWwgPiBvcmlnaW5hbCBhcyBpbmNyZWFzZWRfYmF0 Y2hlcworICBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZy b20gc2ltcGxlIHIgam9pbiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIHVzaW5nIChpZCk7CiskJCk7 CisgaW5pdGlhbGx5X211bHRpYmF0Y2ggfCBpbmNyZWFzZWRfYmF0Y2hlcyAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLQorIGYgICAgICAgICAgICAgICAgICAgIHwg dAorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVsIHdpdGggcGFy YWxsZWwtYXdhcmUgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4 X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDE7CitzZXQgbG9jYWwgd29ya19tZW0gPSAn MTkya0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitzZXQgbG9jYWwg ZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0 IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIHVzaW5n IChpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZpbmFsaXpl IEFnZ3JlZ2F0ZQorICAgLT4gIEdhdGhlcgorICAgICAgICAgV29ya2VycyBQbGFubmVkOiAxCisg ICAgICAgICAtPiAgUGFydGlhbCBBZ2dyZWdhdGUKKyAgICAgICAgICAgICAgIC0+ICBQYXJhbGxl bCBIYXNoIEpvaW4KKyAgICAgICAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlk KQorICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIHNpbXBsZSBy CisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgSGFzaAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIGJpZ2dlcl90aGFuX2l0X2xvb2tz IHMKKyg5IHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gYmlnZ2Vy X3RoYW5faXRfbG9va3MgcyB1c2luZyAoaWQpOworIGNvdW50IAorLS0tLS0tLQorIDIwMDAwCiso MSByb3cpCisKK3NlbGVjdCBvcmlnaW5hbCA+IDEgYXMgaW5pdGlhbGx5X211bHRpYmF0Y2gsIGZp bmFsID4gb3JpZ2luYWwgYXMgaW5jcmVhc2VkX2JhdGNoZXMKKyAgZnJvbSBoYXNoX2pvaW5fYmF0 Y2hlcygKKyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gYmlnZ2VyX3Ro YW5faXRfbG9va3MgcyB1c2luZyAoaWQpOworJCQpOworIGluaXRpYWxseV9tdWx0aWJhdGNoIHwg aW5jcmVhc2VkX2JhdGNoZXMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0t LS0tLS0KKyBmICAgICAgICAgICAgICAgICAgICB8IHQKKygxIHJvdykKKworcm9sbGJhY2sgdG8g c2V0dGluZ3M7CistLSBUaGUgInVnbHkiIGNhc2U6IGluY3JlYXNpbmcgdGhlIG51bWJlciBvZiBi YXRjaGVzIGR1cmluZyBleGVjdXRpb24KKy0tIGRvZXNuJ3QgaGVscCwgc28gc3RvcCB0cnlpbmcg dG8gZml0IGluIHdvcmtfbWVtIGFuZCBob3BlIGZvciB0aGUKKy0tIGJlc3Q7IGluIHRoaXMgY2Fz ZSB3ZSBwbGFuIGZvciAxIGJhdGNoLCBpbmNyZWFzZXMganVzdCBvbmNlIGFuZAorLS0gdGhlbiBz dG9wIGluY3JlYXNpbmcgYmVjYXVzZSB0aGF0IGRpZG4ndCBoZWxwIGF0IGFsbCwgc28gd2UgYmxv dworLS0gcmlnaHQgdGhyb3VnaCB0aGUgd29ya19tZW0gYnVkZ2V0IGFuZCBob3BlIGZvciB0aGUg YmVzdC4uLgorLS0gbm9uLXBhcmFsbGVsCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwg bWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDA7CitzZXQgbG9jYWwgd29ya19tZW0g PSAnMTI4a0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitleHBsYWlu IChjb3N0cyBvZmYpCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gZXh0cmVt ZWx5X3NrZXdlZCBzIHVzaW5nIChpZCk7CisgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4g ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgIEhh c2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNpbXBsZSBy CisgICAgICAgICAtPiAgSGFzaAorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGV4dHJl bWVseV9za2V3ZWQgcworKDYgcm93cykKKworc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIg am9pbiBleHRyZW1lbHlfc2tld2VkIHMgdXNpbmcgKGlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAy MDAwMAorKDEgcm93KQorCitzZWxlY3QgKiBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAg c2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlfc2tld2VkIHMgdXNp bmcgKGlkKTsKKyQkKTsKKyBvcmlnaW5hbCB8IGZpbmFsIAorLS0tLS0tLS0tLSstLS0tLS0tCisg ICAgICAgIDEgfCAgICAgMgorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBh cmFsbGVsIHdpdGggcGFyYWxsZWwtb2JsaXZpb3VzIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRp bmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0 IGxvY2FsIHdvcmtfbWVtID0gJzEyOGtCJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVy ID0gMS4wOworc2V0IGxvY2FsIGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworZXhwbGFpbiAo Y29zdHMgb2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGV4dHJlbWVs eV9za2V3ZWQgcyB1c2luZyAoaWQpOworICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgR2F0aGVyCisgICAg ICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAg ICAgICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAgICAgICAgICAgICAgLT4gIFBhcmFs bGVsIFNlcSBTY2FuIG9uIHNpbXBsZSByCisgICAgICAgICAgICAgICAtPiAgSGFzaAorICAgICAg ICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGV4dHJlbWVseV9za2V3ZWQgcworKDggcm93 cykKKworc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlfc2tld2Vk IHMgdXNpbmcgKGlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAyMDAwMAorKDEgcm93KQorCitzZWxl Y3QgKiBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20g c2ltcGxlIHIgam9pbiBleHRyZW1lbHlfc2tld2VkIHMgdXNpbmcgKGlkKTsKKyQkKTsKKyBvcmln aW5hbCB8IGZpbmFsIAorLS0tLS0tLS0tLSstLS0tLS0tCisgICAgICAgIDEgfCAgICAgMgorKDEg cm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxsZWwt YXdhcmUgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4X3BhcmFs bGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDE7CitzZXQgbG9jYWwgd29ya19tZW0gPSAnMTI4a0In Oworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitzZXQgbG9jYWwgZW5hYmxl X3BhcmFsbGVsX2hhc2ggPSBvbjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50 KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlfc2tld2VkIHMgdXNpbmcgKGlkKTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEdhdGhlcgorICAgICAgICAgV29y a2VycyBQbGFubmVkOiAxCisgICAgICAgICAtPiAgUGFyYWxsZWwgSGFzaCBKb2luCisgICAgICAg ICAgICAgICBIYXNoIENvbmQ6IChyLmlkID0gcy5pZCkKKyAgICAgICAgICAgICAgIC0+ICBQYXJh bGxlbCBTZXEgU2NhbiBvbiBzaW1wbGUgcgorICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIEhh c2gKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiBleHRyZW1l bHlfc2tld2VkIHMKKyg4IHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpv aW4gZXh0cmVtZWx5X3NrZXdlZCBzIHVzaW5nIChpZCk7CisgY291bnQgCistLS0tLS0tCisgMjAw MDAKKygxIHJvdykKKworc2VsZWN0ICogZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQkCisgIHNl bGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gZXh0cmVtZWx5X3NrZXdlZCBzIHVzaW5n IChpZCk7CiskJCk7Cisgb3JpZ2luYWwgfCBmaW5hbCAKKy0tLS0tLS0tLS0rLS0tLS0tLQorICAg ICAgICAxIHwgICAgIDQKKygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBBIGNv dXBsZSBvZiBvdGhlciBoYXNoIGpvaW4gdGVzdHMgdW5yZWxhdGVkIHRvIHdvcmtfbWVtIG1hbmFn ZW1lbnQuCistLSBDaGVjayB0aGF0IEVYUExBSU4gQU5BTFlaRSBoYXMgZGF0YSBldmVuIGlmIHRo ZSBsZWFkZXIgZG9lc24ndCBwYXJ0aWNpcGF0ZQorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxv Y2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2FsIHdvcmtf bWVtID0gJzRNQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsKK3NldCBs b2NhbCBwYXJhbGxlbF9sZWFkZXJfcGFydGljaXBhdGlvbiA9IG9mZjsKK3NlbGVjdCAqIGZyb20g aGFzaF9qb2luX2JhdGNoZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBq b2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CiskJCk7Cisgb3JpZ2luYWwgfCBmaW5hbCAKKy0tLS0t LS0tLS0rLS0tLS0tLQorICAgICAgICAxIHwgICAgIDEKKygxIHJvdykKKworcm9sbGJhY2sgdG8g c2V0dGluZ3M7CistLSBFeGVyY2lzZSByZXNjYW5zLiAgV2UnbGwgdHVybiBvZmYgcGFyYWxsZWxf bGVhZGVyX3BhcnRpY2lwYXRpb24gc28KKy0tIHRoYXQgd2UgY2FuIGNoZWNrIHRoYXQgaW5zdHJ1 bWVudGF0aW9uIGNvbWVzIGJhY2sgY29ycmVjdGx5LgorY3JlYXRlIHRhYmxlIGpvaW5fZm9vIGFz IHNlbGVjdCBnZW5lcmF0ZV9zZXJpZXMoMSwgMykgYXMgaWQsICd4eHh4eCc6OnRleHQgYXMgdDsK K2FsdGVyIHRhYmxlIGpvaW5fZm9vIHNldCAocGFyYWxsZWxfd29ya2VycyA9IDApOworY3JlYXRl IHRhYmxlIGpvaW5fYmFyIGFzIHNlbGVjdCBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMDApIGFzIGlk LCAneHh4eHgnOjp0ZXh0IGFzIHQ7CithbHRlciB0YWJsZSBqb2luX2JhciBzZXQgKHBhcmFsbGVs X3dvcmtlcnMgPSAyKTsKKy0tIG11bHRpLWJhdGNoIHdpdGggcmVzY2FuLCBwYXJhbGxlbC1vYmxp dmlvdXMKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBlbmFibGVfcGFyYWxsZWxfaGFzaCA9IG9m ZjsKK3NldCBwYXJhbGxlbF9sZWFkZXJfcGFydGljaXBhdGlvbiA9IG9mZjsKK3NldCBtaW5fcGFy YWxsZWxfdGFibGVfc2Nhbl9zaXplID0gMDsKK3NldCBwYXJhbGxlbF9zZXR1cF9jb3N0ID0gMDsK K3NldCBwYXJhbGxlbF90dXBsZV9jb3N0ID0gMDsKK3NldCBtYXhfcGFyYWxsZWxfd29ya2Vyc19w ZXJfZ2F0aGVyID0gMjsKK3NldCBlbmFibGVfbWF0ZXJpYWwgPSBvZmY7CitzZXQgZW5hYmxlX21l cmdlam9pbiA9IG9mZjsKK3NldCB3b3JrX21lbSA9ICc2NGtCJzsKK3NldCBoYXNoX21lbV9tdWx0 aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJv bSBqb2luX2ZvbworICAgIGxlZnQgam9pbiAoc2VsZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9i YXIgYjEgam9pbiBqb2luX2JhciBiMiB1c2luZyAoaWQpKSBzcworICAgIG9uIGpvaW5fZm9vLmlk IDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zvby5pZCA+IHNzLmlkIC0gMTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisg ICAtPiAgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAgICAgICBKb2luIEZpbHRlcjogKChqb2lu X2Zvby5pZCA8IChiMS5pZCArIDEpKSBBTkQgKGpvaW5fZm9vLmlkID4gKGIxLmlkIC0gMSkpKQor ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGpvaW5fZm9vCisgICAgICAgICAtPiAgR2F0aGVyCisg ICAgICAgICAgICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAgICAgICAgIC0+ICBIYXNo IEpvaW4KKyAgICAgICAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKGIxLmlkID0gYjIuaWQpCisg ICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgU2VxIFNjYW4gb24gam9pbl9iYXIgYjEK KyAgICAgICAgICAgICAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gam9pbl9iYXIgYjIKKygxMSByb3dzKQorCitzZWxlY3QgY291bnQo KikgZnJvbSBqb2luX2ZvbworICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpv aW5fYmFyIGIxIGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgb24gam9pbl9mb28u aWQgPCBzcy5pZCArIDEgYW5kIGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOworIGNvdW50IAorLS0t LS0tLQorICAgICAzCisoMSByb3cpCisKK3NlbGVjdCBmaW5hbCA+IDEgYXMgbXVsdGliYXRjaAor ICBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gam9p bl9mb28KKyAgICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFyIGIx IGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgICBvbiBqb2luX2Zvby5pZCA8IHNz LmlkICsgMSBhbmQgam9pbl9mb28uaWQgPiBzcy5pZCAtIDE7CiskJCk7CisgbXVsdGliYXRjaCAK Ky0tLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBz aW5nbGUtYmF0Y2ggd2l0aCByZXNjYW4sIHBhcmFsbGVsLW9ibGl2aW91cworc2F2ZXBvaW50IHNl dHRpbmdzOworc2V0IGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworc2V0IHBhcmFsbGVsX2xl YWRlcl9wYXJ0aWNpcGF0aW9uID0gb2ZmOworc2V0IG1pbl9wYXJhbGxlbF90YWJsZV9zY2FuX3Np emUgPSAwOworc2V0IHBhcmFsbGVsX3NldHVwX2Nvc3QgPSAwOworc2V0IHBhcmFsbGVsX3R1cGxl X2Nvc3QgPSAwOworc2V0IG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0 IGVuYWJsZV9tYXRlcmlhbCA9IG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luID0gb2ZmOworc2V0 IHdvcmtfbWVtID0gJzRNQic7CitzZXQgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsKK2V4cGxh aW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAgICBsZWZ0 IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9pbl9iYXIg YjIgdXNpbmcgKGlkKSkgc3MKKyAgICBvbiBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBhbmQgam9p bl9mb28uaWQgPiBzcy5pZCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIE5lc3RlZCBMb29wIExl ZnQgSm9pbgorICAgICAgICAgSm9pbiBGaWx0ZXI6ICgoam9pbl9mb28uaWQgPCAoYjEuaWQgKyAx KSkgQU5EIChqb2luX2Zvby5pZCA+IChiMS5pZCAtIDEpKSkKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiBqb2luX2ZvbworICAgICAgICAgLT4gIEdhdGhlcgorICAgICAgICAgICAgICAgV29ya2Vy cyBQbGFubmVkOiAyCisgICAgICAgICAgICAgICAtPiAgSGFzaCBKb2luCisgICAgICAgICAgICAg ICAgICAgICBIYXNoIENvbmQ6IChiMS5pZCA9IGIyLmlkKQorICAgICAgICAgICAgICAgICAgICAg LT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9uIGpvaW5fYmFyIGIxCisgICAgICAgICAgICAgICAgICAg ICAtPiAgSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGpv aW5fYmFyIGIyCisoMTEgcm93cykKKworc2VsZWN0IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAg bGVmdCBqb2luIChzZWxlY3QgYjEuaWQsIGIxLnQgZnJvbSBqb2luX2JhciBiMSBqb2luIGpvaW5f YmFyIGIyIHVzaW5nIChpZCkpIHNzCisgIG9uIGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBq b2luX2Zvby5pZCA+IHNzLmlkIC0gMTsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMworKDEgcm93 KQorCitzZWxlY3QgZmluYWwgPiAxIGFzIG11bHRpYmF0Y2gKKyAgZnJvbSBoYXNoX2pvaW5fYmF0 Y2hlcygKKyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIGpvaW5fZm9vCisgICAgbGVmdCBqb2lu IChzZWxlY3QgYjEuaWQsIGIxLnQgZnJvbSBqb2luX2JhciBiMSBqb2luIGpvaW5fYmFyIGIyIHVz aW5nIChpZCkpIHNzCisgICAgb24gam9pbl9mb28uaWQgPCBzcy5pZCArIDEgYW5kIGpvaW5fZm9v LmlkID4gc3MuaWQgLSAxOworJCQpOworIG11bHRpYmF0Y2ggCistLS0tLS0tLS0tLS0KKyBmCiso MSByb3cpCisKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworLS0gbXVsdGktYmF0Y2ggd2l0aCByZXNj YW4sIHBhcmFsbGVsLWF3YXJlCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgZW5hYmxlX3BhcmFs bGVsX2hhc2ggPSBvbjsKK3NldCBwYXJhbGxlbF9sZWFkZXJfcGFydGljaXBhdGlvbiA9IG9mZjsK K3NldCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplID0gMDsKK3NldCBwYXJhbGxlbF9zZXR1 cF9jb3N0ID0gMDsKK3NldCBwYXJhbGxlbF90dXBsZV9jb3N0ID0gMDsKK3NldCBtYXhfcGFyYWxs ZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsKK3NldCBlbmFibGVfbWF0ZXJpYWwgPSBvZmY7Citz ZXQgZW5hYmxlX21lcmdlam9pbiA9IG9mZjsKK3NldCB3b3JrX21lbSA9ICc2NGtCJzsKK3NldCBo YXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3Qg Y291bnQoKikgZnJvbSBqb2luX2ZvbworICAgIGxlZnQgam9pbiAoc2VsZWN0IGIxLmlkLCBiMS50 IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBiMiB1c2luZyAoaWQpKSBzcworICAgIG9u IGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zvby5pZCA+IHNzLmlkIC0gMTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg QWdncmVnYXRlCisgICAtPiAgTmVzdGVkIExvb3AgTGVmdCBKb2luCisgICAgICAgICBKb2luIEZp bHRlcjogKChqb2luX2Zvby5pZCA8IChiMS5pZCArIDEpKSBBTkQgKGpvaW5fZm9vLmlkID4gKGIx LmlkIC0gMSkpKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGpvaW5fZm9vCisgICAgICAgICAt PiAgR2F0aGVyCisgICAgICAgICAgICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAgICAg ICAgIC0+ICBQYXJhbGxlbCBIYXNoIEpvaW4KKyAgICAgICAgICAgICAgICAgICAgIEhhc2ggQ29u ZDogKGIxLmlkID0gYjIuaWQpCisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgU2Vx IFNjYW4gb24gam9pbl9iYXIgYjEKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBI YXNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgU2VxIFNjYW4gb24g am9pbl9iYXIgYjIKKygxMSByb3dzKQorCitzZWxlY3QgY291bnQoKikgZnJvbSBqb2luX2Zvbwor ICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9p bl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgb24gam9pbl9mb28uaWQgPCBzcy5pZCArIDEgYW5k IGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOworIGNvdW50IAorLS0tLS0tLQorICAgICAzCisoMSBy b3cpCisKK3NlbGVjdCBmaW5hbCA+IDEgYXMgbXVsdGliYXRjaAorICBmcm9tIGhhc2hfam9pbl9i YXRjaGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAgICBsZWZ0IGpv aW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9pbl9iYXIgYjIg dXNpbmcgKGlkKSkgc3MKKyAgICBvbiBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBhbmQgam9pbl9m b28uaWQgPiBzcy5pZCAtIDE7CiskJCk7CisgbXVsdGliYXRjaCAKKy0tLS0tLS0tLS0tLQorIHQK KygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBzaW5nbGUtYmF0Y2ggd2l0aCBy ZXNjYW4sIHBhcmFsbGVsLWF3YXJlCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgZW5hYmxlX3Bh cmFsbGVsX2hhc2ggPSBvbjsKK3NldCBwYXJhbGxlbF9sZWFkZXJfcGFydGljaXBhdGlvbiA9IG9m ZjsKK3NldCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplID0gMDsKK3NldCBwYXJhbGxlbF9z ZXR1cF9jb3N0ID0gMDsKK3NldCBwYXJhbGxlbF90dXBsZV9jb3N0ID0gMDsKK3NldCBtYXhfcGFy YWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsKK3NldCBlbmFibGVfbWF0ZXJpYWwgPSBvZmY7 CitzZXQgZW5hYmxlX21lcmdlam9pbiA9IG9mZjsKK3NldCB3b3JrX21lbSA9ICc0TUInOworc2V0 IGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVj dCBjb3VudCgqKSBmcm9tIGpvaW5fZm9vCisgICAgbGVmdCBqb2luIChzZWxlY3QgYjEuaWQsIGIx LnQgZnJvbSBqb2luX2JhciBiMSBqb2luIGpvaW5fYmFyIGIyIHVzaW5nIChpZCkpIHNzCisgICAg b24gam9pbl9mb28uaWQgPCBzcy5pZCArIDEgYW5kIGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBBZ2dyZWdhdGUKKyAgIC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIEpvaW4g RmlsdGVyOiAoKGpvaW5fZm9vLmlkIDwgKGIxLmlkICsgMSkpIEFORCAoam9pbl9mb28uaWQgPiAo YjEuaWQgLSAxKSkpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gam9pbl9mb28KKyAgICAgICAg IC0+ICBHYXRoZXIKKyAgICAgICAgICAgICAgIFdvcmtlcnMgUGxhbm5lZDogMgorICAgICAgICAg ICAgICAgLT4gIFBhcmFsbGVsIEhhc2ggSm9pbgorICAgICAgICAgICAgICAgICAgICAgSGFzaCBD b25kOiAoYjEuaWQgPSBiMi5pZCkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBT ZXEgU2NhbiBvbiBqb2luX2JhciBiMQorICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVs IEhhc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBv biBqb2luX2JhciBiMgorKDExIHJvd3MpCisKK3NlbGVjdCBjb3VudCgqKSBmcm9tIGpvaW5fZm9v CisgIGxlZnQgam9pbiAoc2VsZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9iYXIgYjEgam9pbiBq b2luX2JhciBiMiB1c2luZyAoaWQpKSBzcworICBvbiBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBh bmQgam9pbl9mb28uaWQgPiBzcy5pZCAtIDE7CisgY291bnQgCistLS0tLS0tCisgICAgIDMKKygx IHJvdykKKworc2VsZWN0IGZpbmFsID4gMSBhcyBtdWx0aWJhdGNoCisgIGZyb20gaGFzaF9qb2lu X2JhdGNoZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBqb2luX2ZvbworICAgIGxlZnQg am9pbiAoc2VsZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBi MiB1c2luZyAoaWQpKSBzcworICAgIG9uIGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2lu X2Zvby5pZCA+IHNzLmlkIC0gMTsKKyQkKTsKKyBtdWx0aWJhdGNoIAorLS0tLS0tLS0tLS0tCisg ZgorKDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIEEgZnVsbCBvdXRlciBqb2lu IHdoZXJlIGV2ZXJ5IHJlY29yZCBpcyBtYXRjaGVkLgorLS0gbm9uLXBhcmFsbGVsCitzYXZlcG9p bnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9 IDA7CitleHBsYWluIChjb3N0cyBvZmYpCisgICAgIHNlbGVjdCAgY291bnQoKikgZnJvbSBzaW1w bGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBIYXNoIEZ1bGwgSm9pbgorICAgICAgICAg SGFzaCBDb25kOiAoci5pZCA9IHMuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxl IHIKKyAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2lt cGxlIHMKKyg2IHJvd3MpCisKK3NlbGVjdCAgY291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91 dGVyIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyAyMDAwMAor KDEgcm93KQorCityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIHBhcmFsbGVsaXNtIG5vdCBwb3Nz aWJsZSB3aXRoIHBhcmFsbGVsLW9ibGl2aW91cyBmdWxsIGhhc2ggam9pbgorc2F2ZXBvaW50IHNl dHRpbmdzOworc2V0IGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworc2V0IGxvY2FsIG1heF9w YXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICAg ICBzZWxlY3QgIGNvdW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBz IHVzaW5nIChpZCk7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAt PiAgSGFzaCBGdWxsIEpvaW4KKyAgICAgICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAg ICAgICAgLT4gIFNlcSBTY2FuIG9uIHNpbXBsZSByCisgICAgICAgICAtPiAgSGFzaAorICAgICAg ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNpbXBsZSBzCisoNiByb3dzKQorCitzZWxlY3QgIGNv dW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7 CisgY291bnQgCistLS0tLS0tCisgMjAwMDAKKygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGlu Z3M7CistLSBwYXJhbGxlbGlzbSBpcyBwb3NzaWJsZSB3aXRoIHBhcmFsbGVsLWF3YXJlIGZ1bGwg aGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dv cmtlcnNfcGVyX2dhdGhlciA9IDI7CitleHBsYWluIChjb3N0cyBvZmYpCisgICAgIHNlbGVjdCAg Y291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlk KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBGaW5hbGl6ZSBBZ2dyZWdhdGUKKyAgIC0+ICBHYXRoZXIKKyAgICAg ICAgIFdvcmtlcnMgUGxhbm5lZDogMgorICAgICAgICAgLT4gIFBhcnRpYWwgQWdncmVnYXRlCisg ICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgSGFzaCBGdWxsIEpvaW4KKyAgICAgICAgICAgICAg ICAgICAgIEhhc2ggQ29uZDogKHIuaWQgPSBzLmlkKQorICAgICAgICAgICAgICAgICAgICAgLT4g IFBhcmFsbGVsIFNlcSBTY2FuIG9uIHNpbXBsZSByCisgICAgICAgICAgICAgICAgICAgICAtPiAg UGFyYWxsZWwgSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNl cSBTY2FuIG9uIHNpbXBsZSBzCisoOSByb3dzKQorCitzZWxlY3QgIGNvdW50KCopIGZyb20gc2lt cGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CisgY291bnQgCistLS0t LS0tCisgMjAwMDAKKygxIHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBBIGZ1bGwg b3V0ZXIgam9pbiB3aGVyZSBldmVyeSByZWNvcmQgaXMgbm90IG1hdGNoZWQuCistLSBub24tcGFy YWxsZWwKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBsb2NhbCBtYXhfcGFyYWxsZWxfd29ya2Vy c19wZXJfZ2F0aGVyID0gMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgICAgc2VsZWN0ICBjb3Vu dCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUgcyBvbiAoci5pZCA9IDAg LSBzLmlkKTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBI YXNoIEZ1bGwgSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAoKDAgLSBzLmlkKSA9IHIuaWQpCisg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHMKKyAgICAgICAgIC0+ICBIYXNoCisgICAg ICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyg2IHJvd3MpCisKK3NlbGVjdCAg Y291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgb24gKHIuaWQg PSAwIC0gcy5pZCk7CisgY291bnQgCistLS0tLS0tCisgNDAwMDAKKygxIHJvdykKKworcm9sbGJh Y2sgdG8gc2V0dGluZ3M7CistLSBwYXJhbGxlbGlzbSBub3QgcG9zc2libGUgd2l0aCBwYXJhbGxl bC1vYmxpdmlvdXMgZnVsbCBoYXNoIGpvaW4KK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBlbmFi bGVfcGFyYWxsZWxfaGFzaCA9IG9mZjsKK3NldCBsb2NhbCBtYXhfcGFyYWxsZWxfd29ya2Vyc19w ZXJfZ2F0aGVyID0gMjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgICAgc2VsZWN0ICBjb3VudCgq KSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUgcyBvbiAoci5pZCA9IDAgLSBz LmlkKTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBIYXNo IEZ1bGwgSm9pbgorICAgICAgICAgSGFzaCBDb25kOiAoKDAgLSBzLmlkKSA9IHIuaWQpCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHMKKyAgICAgICAgIC0+ICBIYXNoCisgICAgICAg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ltcGxlIHIKKyg2IHJvd3MpCisKK3NlbGVjdCAgY291 bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgb24gKHIuaWQgPSAw IC0gcy5pZCk7CisgY291bnQgCistLS0tLS0tCisgNDAwMDAKKygxIHJvdykKKworcm9sbGJhY2sg dG8gc2V0dGluZ3M7CistLSBwYXJhbGxlbGlzbSBpcyBwb3NzaWJsZSB3aXRoIHBhcmFsbGVsLWF3 YXJlIGZ1bGwgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4X3Bh cmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitleHBsYWluIChjb3N0cyBvZmYpCisgICAg IHNlbGVjdCAgY291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMg b24gKHIuaWQgPSAwIC0gcy5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgRmluYWxpemUgQWdncmVnYXRlCisg ICAtPiAgR2F0aGVyCisgICAgICAgICBXb3JrZXJzIFBsYW5uZWQ6IDIKKyAgICAgICAgIC0+ICBQ YXJ0aWFsIEFnZ3JlZ2F0ZQorICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIEhhc2ggRnVsbCBK b2luCisgICAgICAgICAgICAgICAgICAgICBIYXNoIENvbmQ6ICgoMCAtIHMuaWQpID0gci5pZCkK KyAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiBzaW1wbGUgcwor ICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIEhhc2gKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiBzaW1wbGUgcgorKDkgcm93cykKKwor c2VsZWN0ICBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUgcyBv biAoci5pZCA9IDAgLSBzLmlkKTsKKyBjb3VudCAKKy0tLS0tLS0KKyA0MDAwMAorKDEgcm93KQor Cityb2xsYmFjayB0byBzZXR0aW5nczsKKy0tIGV4ZXJjaXNlIHNwZWNpYWwgY29kZSBwYXRocyBm b3IgaHVnZSB0dXBsZXMgKG5vdGUgdXNlIG9mIG5vbi1zdHJpY3QKKy0tIGV4cHJlc3Npb24gYW5k IGxlZnQgam9pbiByZXF1aXJlZCB0byBnZXQgdGhlIGRldG9hc3RlZCB0dXBsZSBpbnRvCistLSB0 aGUgaGFzaCB0YWJsZSkKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxsZWwtYXdhcmUgaGFzaCBqb2lu IChoaXRzIEV4ZWNQYXJhbGxlbEhhc2hMb2FkVHVwbGUgYW5kCistLSBzdHNfcHV0dHVwbGUgb3Zl cnNpemVkIHR1cGxlIGNhc2VzIGJlY2F1c2UgaXQncyBtdWx0aS1iYXRjaCkKK3NhdmVwb2ludCBz ZXR0aW5nczsKK3NldCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsKK3NldCBl bmFibGVfcGFyYWxsZWxfaGFzaCA9IG9uOworc2V0IHdvcmtfbWVtID0gJzEyOGtCJzsKK3NldCBo YXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3Qg bGVuZ3RoKG1heChzLnQpKQorICBmcm9tIHdpZGUgbGVmdCBqb2luIChzZWxlY3QgaWQsIGNvYWxl c2NlKHQsICcnKSB8fCAnJyBhcyB0IGZyb20gd2lkZSkgcyB1c2luZyAoaWQpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEZpbmFsaXplIEFnZ3JlZ2F0ZQorICAgLT4gIEdhdGhlcgorICAgICAgICAgV29y a2VycyBQbGFubmVkOiAyCisgICAgICAgICAtPiAgUGFydGlhbCBBZ2dyZWdhdGUKKyAgICAgICAg ICAgICAgIC0+ICBQYXJhbGxlbCBIYXNoIExlZnQgSm9pbgorICAgICAgICAgICAgICAgICAgICAg SGFzaCBDb25kOiAod2lkZS5pZCA9IHdpZGVfMS5pZCkKKyAgICAgICAgICAgICAgICAgICAgIC0+ ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiB3aWRlCisgICAgICAgICAgICAgICAgICAgICAtPiAgUGFy YWxsZWwgSGFzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBT Y2FuIG9uIHdpZGUgd2lkZV8xCisoOSByb3dzKQorCitzZWxlY3QgbGVuZ3RoKG1heChzLnQpKQor ZnJvbSB3aWRlIGxlZnQgam9pbiAoc2VsZWN0IGlkLCBjb2FsZXNjZSh0LCAnJykgfHwgJycgYXMg dCBmcm9tIHdpZGUpIHMgdXNpbmcgKGlkKTsKKyBsZW5ndGggCistLS0tLS0tLQorIDMyMDAwMAor KDEgcm93KQorCitzZWxlY3QgZmluYWwgPiAxIGFzIG11bHRpYmF0Y2gKKyAgZnJvbSBoYXNoX2pv aW5fYmF0Y2hlcygKKyQkCisgIHNlbGVjdCBsZW5ndGgobWF4KHMudCkpCisgIGZyb20gd2lkZSBs ZWZ0IGpvaW4gKHNlbGVjdCBpZCwgY29hbGVzY2UodCwgJycpIHx8ICcnIGFzIHQgZnJvbSB3aWRl KSBzIHVzaW5nIChpZCk7CiskJCk7CisgbXVsdGliYXRjaCAKKy0tLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CistLSBIYXNoIGpvaW4gcmV1c2VzIHRoZSBI T1Qgc3RhdHVzIGJpdCB0byBpbmRpY2F0ZSBtYXRjaCBzdGF0dXMuIFRoaXMgY2FuIG9ubHkKKy0t IGJlIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMgaWYgYWxsIHRoZSBoYXNo IGpvaW4gdHVwbGUgbWF0Y2gKKy0tIGJpdHMgYXJlIHJlc2V0IGJlZm9yZSByZXVzZS4gVGhpcyBp cyBkb25lIHVwb24gbG9hZGluZyB0aGVtIGludG8gdGhlCistLSBoYXNodGFibGUuCitTQVZFUE9J TlQgc2V0dGluZ3M7CitTRVQgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsKK1NFVCBtaW5fcGFy YWxsZWxfdGFibGVfc2Nhbl9zaXplID0gMDsKK1NFVCBwYXJhbGxlbF9zZXR1cF9jb3N0ID0gMDsK K1NFVCBwYXJhbGxlbF90dXBsZV9jb3N0ID0gMDsKK0NSRUFURSBUQUJMRSBoanRlc3RfbWF0Y2hi aXRzX3QxKGlkIGludCk7CitDUkVBVEUgVEFCTEUgaGp0ZXN0X21hdGNoYml0c190MihpZCBpbnQp OworSU5TRVJUIElOVE8gaGp0ZXN0X21hdGNoYml0c190MSBWQUxVRVMgKDEpOworSU5TRVJUIElO VE8gaGp0ZXN0X21hdGNoYml0c190MiBWQUxVRVMgKDIpOworLS0gVXBkYXRlIHNob3VsZCBjcmVh dGUgYSBIT1QgdHVwbGUuIElmIHRoaXMgc3RhdHVzIGJpdCBpc24ndCBjbGVhcmVkLCB3ZSB3b24n dAorLS0gY29ycmVjdGx5IGVtaXQgdGhlIE5VTEwtZXh0ZW5kZWQgdW5tYXRjaGluZyB0dXBsZSBp biBmdWxsIGhhc2ggam9pbi4KK1VQREFURSBoanRlc3RfbWF0Y2hiaXRzX3QyIHNldCBpZCA9IDI7 CitTRUxFQ1QgKiBGUk9NIGhqdGVzdF9tYXRjaGJpdHNfdDEgdDEgRlVMTCBKT0lOIGhqdGVzdF9t YXRjaGJpdHNfdDIgdDIgT04gdDEuaWQgPSB0Mi5pZAorICBPUkRFUiBCWSB0MS5pZDsKKyBpZCB8 IGlkIAorLS0tLSstLS0tCisgIDEgfCAgIAorICAgIHwgIDIKKygyIHJvd3MpCisKKy0tIFRlc3Qg c2VyaWFsIGZ1bGwgaGFzaCBqb2luLgorLS0gUmVzZXR0aW5nIHBhcmFsbGVsX3NldHVwX2Nvc3Qg c2hvdWxkIGZvcmNlIGEgc2VyaWFsIHBsYW4uCistLSBKdXN0IHRvIGJlIHNhZmUsIGhvd2V2ZXIs IHNldCBlbmFibGVfcGFyYWxsZWxfaGFzaCB0byBvZmYsIGFzIHBhcmFsbGVsIGZ1bGwKKy0tIGhh c2ggam9pbnMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggc2hhcmVkIGhhc2h0YWJsZXMuCitSRVNF VCBwYXJhbGxlbF9zZXR1cF9jb3N0OworU0VUIGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOwor U0VMRUNUICogRlJPTSBoanRlc3RfbWF0Y2hiaXRzX3QxIHQxIEZVTEwgSk9JTiBoanRlc3RfbWF0 Y2hiaXRzX3QyIHQyIE9OIHQxLmlkID0gdDIuaWQ7CisgaWQgfCBpZCAKKy0tLS0rLS0tLQorICAx IHwgICAKKyAgICB8ICAyCisoMiByb3dzKQorCitST0xMQkFDSyBUTyBzZXR0aW5nczsKK3JvbGxi YWNrOworLS0gVmVyaWZ5IHRoYXQgaGFzaCBrZXkgZXhwcmVzc2lvbnMgcmVmZXJlbmNlIHRoZSBj b3JyZWN0CistLSBub2Rlcy4gSGFzaGpvaW4ncyBoYXNoa2V5cyBuZWVkIHRvIHJlZmVyZW5jZSBp dHMgb3V0ZXIgcGxhbiwgSGFzaCdzCistLSBuZWVkIHRvIHJlZmVyZW5jZSBIYXNoJ3Mgb3V0ZXIg cGxhbiAod2hpY2ggaXMgYmVsb3cgSGFzaEpvaW4ncworLS0gaW5uZXIgcGxhbikuIEl0J3Mgbm90 IHRyaXZpYWwgdG8gdmVyaWZ5IHRoYXQgdGhlIHJlZmVyZW5jZXMgYXJlCistLSBjb3JyZWN0ICh3 ZSBkb24ndCBkaXNwbGF5IHRoZSBoYXNoa2V5cyB0aGVtc2VsdmVzKSwgYnV0IGlmIHRoZQorLS0g aGFzaGtleXMgY29udGFpbiBzdWJwbGFuIHJlZmVyZW5jZXMsIHRob3NlIHdpbGwgYmUgZGlzcGxh eWVkLiBGb3JjZQorLS0gc3VicGxhbnMgdG8gYXBwZWFyIGp1c3QgYWJvdXQgZXZlcnl3aGVyZS4K Ky0tCistLSBCdWcgcmVwb3J0OgorLS0gaHR0cHM6Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2Fn ZS1pZC9DQVBwSGZkdkdWZWdGX1RLS1JpQnJTbWF0SkwyZFI5dXdGQ3VSJTJCdGVRXzh0RVhVOG14 ZyU0MG1haWwuZ21haWwuY29tCistLQorQkVHSU47CitTRVQgTE9DQUwgZW5hYmxlX3NvcnQgPSBP RkY7IC0tIGF2b2lkIG1lcmdlam9pbnMKK1NFVCBMT0NBTCBmcm9tX2NvbGxhcHNlX2xpbWl0ID0g MTsgLS0gYWxsb3dzIGVhc3kgY2hhbmdpbmcgb2Ygam9pbiBvcmRlcgorQ1JFQVRFIFRBQkxFIGhq dGVzdF8xIChhIHRleHQsIGIgaW50LCBpZCBpbnQsIGMgYm9vbCk7CitDUkVBVEUgVEFCTEUgaGp0 ZXN0XzIgKGEgYm9vbCwgaWQgaW50LCBiIHRleHQsIGMgaW50KTsKK0lOU0VSVCBJTlRPIGhqdGVz dF8xKGEsIGIsIGlkLCBjKSBWQUxVRVMgKCd0ZXh0JywgMiwgMSwgZmFsc2UpOyAtLSBtYXRjaGVz CitJTlNFUlQgSU5UTyBoanRlc3RfMShhLCBiLCBpZCwgYykgVkFMVUVTICgndGV4dCcsIDEsIDIs IGZhbHNlKTsgLS0gZmFpbHMgaWQgam9pbiBjb25kaXRpb24KK0lOU0VSVCBJTlRPIGhqdGVzdF8x KGEsIGIsIGlkLCBjKSBWQUxVRVMgKCd0ZXh0JywgMjAsIDEsIGZhbHNlKTsgLS0gZmFpbHMgPCA1 MAorSU5TRVJUIElOVE8gaGp0ZXN0XzEoYSwgYiwgaWQsIGMpIFZBTFVFUyAoJ3RleHQnLCAxLCAx LCBmYWxzZSk7IC0tIGZhaWxzIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNFTEVDVCBoanRl c3RfMi5jKjUpCitJTlNFUlQgSU5UTyBoanRlc3RfMihhLCBpZCwgYiwgYykgVkFMVUVTICh0cnVl LCAxLCAnYW5vdGhlcicsIDIpOyAtLSBtYXRjaGVzCitJTlNFUlQgSU5UTyBoanRlc3RfMihhLCBp ZCwgYiwgYykgVkFMVUVTICh0cnVlLCAzLCAnYW5vdGhlcicsIDcpOyAtLSBmYWlscyBpZCBqb2lu IGNvbmRpdGlvbgorSU5TRVJUIElOVE8gaGp0ZXN0XzIoYSwgaWQsIGIsIGMpIFZBTFVFUyAodHJ1 ZSwgMSwgJ2Fub3RoZXInLCA5MCk7ICAtLSBmYWlscyA8IDU1CitJTlNFUlQgSU5UTyBoanRlc3Rf MihhLCBpZCwgYiwgYykgVkFMVUVTICh0cnVlLCAxLCAnYW5vdGhlcicsIDMpOyAtLSBmYWlscyAo U0VMRUNUIGhqdGVzdF8xLmIgKiA1KSA9IChTRUxFQ1QgaGp0ZXN0XzIuYyo1KQorSU5TRVJUIElO VE8gaGp0ZXN0XzIoYSwgaWQsIGIsIGMpIFZBTFVFUyAodHJ1ZSwgMSwgJ3RleHQnLCAxKTsgLS0g IGZhaWxzIGhqdGVzdF8xLmEgPD4gaGp0ZXN0XzIuYjsKK0VYUExBSU4gKENPU1RTIE9GRiwgVkVS Qk9TRSkKK1NFTEVDVCBoanRlc3RfMS5hIGExLCBoanRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxl b2lkOjpyZWdjbGFzcyB0MSwgaGp0ZXN0XzIudGFibGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhq dGVzdF8xLCBoanRlc3RfMgorV0hFUkUKKyAgICBoanRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVS RSBoanRlc3RfMi5pZCA9IDEpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNF TEVDVCBoanRlc3RfMi5jKjUpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAK KyAgICBBTkQgKFNFTEVDVCBoanRlc3RfMi5jICogNSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5h IDw+IGhqdGVzdF8yLmI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAg T3V0cHV0OiBoanRlc3RfMS5hLCBoanRlc3RfMi5hLCAoaGp0ZXN0XzEudGFibGVvaWQpOjpyZWdj bGFzcywgKGhqdGVzdF8yLnRhYmxlb2lkKTo6cmVnY2xhc3MKKyAgIEhhc2ggQ29uZDogKChoanRl c3RfMS5pZCA9IChTdWJQbGFuIDEpKSBBTkQgKChTdWJQbGFuIDIpID0gKFN1YlBsYW4gMykpKQor ICAgSm9pbiBGaWx0ZXI6IChoanRlc3RfMS5hIDw+IGhqdGVzdF8yLmIpCisgICAtPiAgU2VxIFNj YW4gb24gcHVibGljLmhqdGVzdF8xCisgICAgICAgICBPdXRwdXQ6IGhqdGVzdF8xLmEsIGhqdGVz dF8xLnRhYmxlb2lkLCBoanRlc3RfMS5pZCwgaGp0ZXN0XzEuYgorICAgICAgICAgRmlsdGVyOiAo KFN1YlBsYW4gNCkgPCA1MCkKKyAgICAgICAgIFN1YlBsYW4gNAorICAgICAgICAgICAtPiAgUmVz dWx0CisgICAgICAgICAgICAgICAgIE91dHB1dDogKGhqdGVzdF8xLmIgKiA1KQorICAgLT4gIEhh c2gKKyAgICAgICAgIE91dHB1dDogaGp0ZXN0XzIuYSwgaGp0ZXN0XzIudGFibGVvaWQsIGhqdGVz dF8yLmlkLCBoanRlc3RfMi5jLCBoanRlc3RfMi5iCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24g cHVibGljLmhqdGVzdF8yCisgICAgICAgICAgICAgICBPdXRwdXQ6IGhqdGVzdF8yLmEsIGhqdGVz dF8yLnRhYmxlb2lkLCBoanRlc3RfMi5pZCwgaGp0ZXN0XzIuYywgaGp0ZXN0XzIuYgorICAgICAg ICAgICAgICAgRmlsdGVyOiAoKFN1YlBsYW4gNSkgPCA1NSkKKyAgICAgICAgICAgICAgIFN1YlBs YW4gNQorICAgICAgICAgICAgICAgICAtPiAgUmVzdWx0CisgICAgICAgICAgICAgICAgICAgICAg IE91dHB1dDogKGhqdGVzdF8yLmMgKiA1KQorICAgICAgICAgU3ViUGxhbiAxCisgICAgICAgICAg IC0+ICBSZXN1bHQKKyAgICAgICAgICAgICAgICAgT3V0cHV0OiAxCisgICAgICAgICAgICAgICAg IE9uZS1UaW1lIEZpbHRlcjogKGhqdGVzdF8yLmlkID0gMSkKKyAgICAgICAgIFN1YlBsYW4gMwor ICAgICAgICAgICAtPiAgUmVzdWx0CisgICAgICAgICAgICAgICAgIE91dHB1dDogKGhqdGVzdF8y LmMgKiA1KQorICAgU3ViUGxhbiAyCisgICAgIC0+ICBSZXN1bHQKKyAgICAgICAgICAgT3V0cHV0 OiAoaGp0ZXN0XzEuYiAqIDUpCisoMjggcm93cykKKworU0VMRUNUIGhqdGVzdF8xLmEgYTEsIGhq dGVzdF8yLmEgYTIsaGp0ZXN0XzEudGFibGVvaWQ6OnJlZ2NsYXNzIHQxLCBoanRlc3RfMi50YWJs ZW9pZDo6cmVnY2xhc3MgdDIKK0ZST00gaGp0ZXN0XzEsIGhqdGVzdF8yCitXSEVSRQorICAgIGhq dGVzdF8xLmlkID0gKFNFTEVDVCAxIFdIRVJFIGhqdGVzdF8yLmlkID0gMSkKKyAgICBBTkQgKFNF TEVDVCBoanRlc3RfMS5iICogNSkgPSAoU0VMRUNUIGhqdGVzdF8yLmMqNSkKKyAgICBBTkQgKFNF TEVDVCBoanRlc3RfMS5iICogNSkgPCA1MAorICAgIEFORCAoU0VMRUNUIGhqdGVzdF8yLmMgKiA1 KSA8IDU1CisgICAgQU5EIGhqdGVzdF8xLmEgPD4gaGp0ZXN0XzIuYjsKKyAgYTEgIHwgYTIgfCAg ICB0MSAgICB8ICAgIHQyICAgIAorLS0tLS0tKy0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tCisg dGV4dCB8IHQgIHwgaGp0ZXN0XzEgfCBoanRlc3RfMgorKDEgcm93KQorCitFWFBMQUlOIChDT1NU UyBPRkYsIFZFUkJPU0UpCitTRUxFQ1QgaGp0ZXN0XzEuYSBhMSwgaGp0ZXN0XzIuYSBhMixoanRl c3RfMS50YWJsZW9pZDo6cmVnY2xhc3MgdDEsIGhqdGVzdF8yLnRhYmxlb2lkOjpyZWdjbGFzcyB0 MgorRlJPTSBoanRlc3RfMiwgaGp0ZXN0XzEKK1dIRVJFCisgICAgaGp0ZXN0XzEuaWQgPSAoU0VM RUNUIDEgV0hFUkUgaGp0ZXN0XzIuaWQgPSAxKQorICAgIEFORCAoU0VMRUNUIGhqdGVzdF8xLmIg KiA1KSA9IChTRUxFQ1QgaGp0ZXN0XzIuYyo1KQorICAgIEFORCAoU0VMRUNUIGhqdGVzdF8xLmIg KiA1KSA8IDUwCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzIuYyAqIDUpIDwgNTUKKyAgICBBTkQg aGp0ZXN0XzEuYSA8PiBoanRlc3RfMi5iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNo IEpvaW4KKyAgIE91dHB1dDogaGp0ZXN0XzEuYSwgaGp0ZXN0XzIuYSwgKGhqdGVzdF8xLnRhYmxl b2lkKTo6cmVnY2xhc3MsIChoanRlc3RfMi50YWJsZW9pZCk6OnJlZ2NsYXNzCisgICBIYXNoIENv bmQ6ICgoKFN1YlBsYW4gMSkgPSBoanRlc3RfMS5pZCkgQU5EICgoU3ViUGxhbiAzKSA9IChTdWJQ bGFuIDIpKSkKKyAgIEpvaW4gRmlsdGVyOiAoaGp0ZXN0XzEuYSA8PiBoanRlc3RfMi5iKQorICAg LT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5oanRlc3RfMgorICAgICAgICAgT3V0cHV0OiBoanRlc3Rf Mi5hLCBoanRlc3RfMi50YWJsZW9pZCwgaGp0ZXN0XzIuaWQsIGhqdGVzdF8yLmMsIGhqdGVzdF8y LmIKKyAgICAgICAgIEZpbHRlcjogKChTdWJQbGFuIDUpIDwgNTUpCisgICAgICAgICBTdWJQbGFu IDUKKyAgICAgICAgICAgLT4gIFJlc3VsdAorICAgICAgICAgICAgICAgICBPdXRwdXQ6IChoanRl c3RfMi5jICogNSkKKyAgIC0+ICBIYXNoCisgICAgICAgICBPdXRwdXQ6IGhqdGVzdF8xLmEsIGhq dGVzdF8xLnRhYmxlb2lkLCBoanRlc3RfMS5pZCwgaGp0ZXN0XzEuYgorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHB1YmxpYy5oanRlc3RfMQorICAgICAgICAgICAgICAgT3V0cHV0OiBoanRlc3Rf MS5hLCBoanRlc3RfMS50YWJsZW9pZCwgaGp0ZXN0XzEuaWQsIGhqdGVzdF8xLmIKKyAgICAgICAg ICAgICAgIEZpbHRlcjogKChTdWJQbGFuIDQpIDwgNTApCisgICAgICAgICAgICAgICBTdWJQbGFu IDQKKyAgICAgICAgICAgICAgICAgLT4gIFJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgICBP dXRwdXQ6IChoanRlc3RfMS5iICogNSkKKyAgICAgICAgIFN1YlBsYW4gMgorICAgICAgICAgICAt PiAgUmVzdWx0CisgICAgICAgICAgICAgICAgIE91dHB1dDogKGhqdGVzdF8xLmIgKiA1KQorICAg U3ViUGxhbiAxCisgICAgIC0+ICBSZXN1bHQKKyAgICAgICAgICAgT3V0cHV0OiAxCisgICAgICAg ICAgIE9uZS1UaW1lIEZpbHRlcjogKGhqdGVzdF8yLmlkID0gMSkKKyAgIFN1YlBsYW4gMworICAg ICAtPiAgUmVzdWx0CisgICAgICAgICAgIE91dHB1dDogKGhqdGVzdF8yLmMgKiA1KQorKDI4IHJv d3MpCisKK1NFTEVDVCBoanRlc3RfMS5hIGExLCBoanRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxl b2lkOjpyZWdjbGFzcyB0MSwgaGp0ZXN0XzIudGFibGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhq dGVzdF8yLCBoanRlc3RfMQorV0hFUkUKKyAgICBoanRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVS RSBoanRlc3RfMi5pZCA9IDEpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNF TEVDVCBoanRlc3RfMi5jKjUpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAK KyAgICBBTkQgKFNFTEVDVCBoanRlc3RfMi5jICogNSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5h IDw+IGhqdGVzdF8yLmI7CisgIGExICB8IGEyIHwgICAgdDEgICAgfCAgICB0MiAgICAKKy0tLS0t LSstLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLQorIHRleHQgfCB0ICB8IGhqdGVzdF8xIHwgaGp0 ZXN0XzIKKygxIHJvdykKKworUk9MTEJBQ0s7CistLSBWZXJpZnkgdGhhdCB3ZSBiZWhhdmUgc2Fu ZWx5IHdoZW4gdGhlIGlubmVyIGhhc2gga2V5cyBjb250YWluIHBhcmFtZXRlcnMKKy0tICh0aGF0 IGlzLCBvdXRlciBvciBsYXRlcmFsIHJlZmVyZW5jZXMpLiAgVGhpcyBzaXR1YXRpb24gaGFzIHRv IGRlZmVhdAorLS0gcmUtdXNlIG9mIHRoZSBpbm5lciBoYXNoIHRhYmxlIGFjcm9zcyByZXNjYW5z LgorYmVnaW47CitzZXQgbG9jYWwgZW5hYmxlX2hhc2hqb2luID0gb247CitleHBsYWluIChjb3N0 cyBvZmYpCitzZWxlY3QgaTgucTIsIHNzLiogZnJvbQoraW50OF90YmwgaTgsCitsYXRlcmFsIChz ZWxlY3QgdDEuZml2ZXRob3VzLCBpNC5mMSBmcm9tIHRlbmsxIHQxIGpvaW4gaW50NF90YmwgaTQK KyAgICAgICAgIG9uIHQxLmZpdmV0aG91cyA9IGk0LmYxK2k4LnEyIG9yZGVyIGJ5IDEsMikgc3M7 CisgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgLT4gIFNlcSBTY2FuIG9uIGludDhfdGJsIGk4Cisg ICAtPiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IHQxLmZpdmV0aG91cywgaTQuZjEKKyAgICAg ICAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgICAgICAgIEhhc2ggQ29uZDogKHQxLmZpdmV0aG91 cyA9IChpNC5mMSArIGk4LnEyKSkKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5r MSB0MQorICAgICAgICAgICAgICAgLT4gIEhhc2gKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBT ZXEgU2NhbiBvbiBpbnQ0X3RibCBpNAorKDkgcm93cykKKworc2VsZWN0IGk4LnEyLCBzcy4qIGZy b20KK2ludDhfdGJsIGk4LAorbGF0ZXJhbCAoc2VsZWN0IHQxLmZpdmV0aG91cywgaTQuZjEgZnJv bSB0ZW5rMSB0MSBqb2luIGludDRfdGJsIGk0CisgICAgICAgICBvbiB0MS5maXZldGhvdXMgPSBp NC5mMStpOC5xMiBvcmRlciBieSAxLDIpIHNzOworIHEyICB8IGZpdmV0aG91cyB8IGYxIAorLS0t LS0rLS0tLS0tLS0tLS0rLS0tLQorIDQ1NiB8ICAgICAgIDQ1NiB8ICAwCisgNDU2IHwgICAgICAg NDU2IHwgIDAKKyAxMjMgfCAgICAgICAxMjMgfCAgMAorIDEyMyB8ICAgICAgIDEyMyB8ICAwCiso NCByb3dzKQorCityb2xsYmFjazsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pv aW5faGFzaF9sejQuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbl9oYXNoX2x6NC5zcWwK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uMWQxOWMxOTgwZQotLS0gL2Rl di9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW5faGFzaF9sejQuc3FsCkBAIC0w LDAgKzEsNjI2IEBACistLQorLS0gZXhlcmNpc2VzIGZvciB0aGUgaGFzaCBqb2luIGNvZGUKKy0t CisKK2JlZ2luOworCitzZXQgbG9jYWwgbWluX3BhcmFsbGVsX3RhYmxlX3NjYW5fc2l6ZSA9IDA7 CitzZXQgbG9jYWwgcGFyYWxsZWxfc2V0dXBfY29zdCA9IDA7CitzZXQgbG9jYWwgZW5hYmxlX2hh c2hqb2luID0gb247CitzZXQgbG9jYWwgdGVtcF9maWxlX2NvbXByZXNzaW9uID0gJ2x6NCc7CisK Ky0tIEV4dHJhY3QgYnVja2V0IGFuZCBiYXRjaCBjb3VudHMgZnJvbSBhbiBleHBsYWluIGFuYWx5 emUgcGxhbi4gIEluCistLSBnZW5lcmFsIHdlIGNhbid0IG1ha2UgYXNzZXJ0aW9ucyBhYm91dCBo b3cgbWFueSBiYXRjaGVzIChvcgorLS0gYnVja2V0cykgd2lsbCBiZSByZXF1aXJlZCBiZWNhdXNl IGl0IGNhbiB2YXJ5LCBidXQgd2UgY2FuIGluIHNvbWUKKy0tIHNwZWNpYWwgY2FzZXMgYW5kIHdl IGNhbiBjaGVjayBmb3IgZ3Jvd3RoLgorY3JlYXRlIG9yIHJlcGxhY2UgZnVuY3Rpb24gZmluZF9o YXNoKG5vZGUganNvbikKK3JldHVybnMganNvbiBsYW5ndWFnZSBwbHBnc3FsCithcworJCQKK2Rl Y2xhcmUKKyAgeCBqc29uOworICBjaGlsZCBqc29uOworYmVnaW4KKyAgaWYgbm9kZS0+PidOb2Rl IFR5cGUnID0gJ0hhc2gnIHRoZW4KKyAgICByZXR1cm4gbm9kZTsKKyAgZWxzZQorICAgIGZvciBj aGlsZCBpbiBzZWxlY3QganNvbl9hcnJheV9lbGVtZW50cyhub2RlLT4nUGxhbnMnKQorICAgIGxv b3AKKyAgICAgIHggOj0gZmluZF9oYXNoKGNoaWxkKTsKKyAgICAgIGlmIHggaXMgbm90IG51bGwg dGhlbgorICAgICAgICByZXR1cm4geDsKKyAgICAgIGVuZCBpZjsKKyAgICBlbmQgbG9vcDsKKyAg ICByZXR1cm4gbnVsbDsKKyAgZW5kIGlmOworZW5kOworJCQ7CitjcmVhdGUgb3IgcmVwbGFjZSBm dW5jdGlvbiBoYXNoX2pvaW5fYmF0Y2hlcyhxdWVyeSB0ZXh0KQorcmV0dXJucyB0YWJsZSAob3Jp Z2luYWwgaW50LCBmaW5hbCBpbnQpIGxhbmd1YWdlIHBscGdzcWwKK2FzCiskJAorZGVjbGFyZQor ICB3aG9sZV9wbGFuIGpzb247CisgIGhhc2hfbm9kZSBqc29uOworYmVnaW4KKyAgZm9yIHdob2xl X3BsYW4gaW4KKyAgICBleGVjdXRlICdleHBsYWluIChhbmFseXplLCBmb3JtYXQgJydqc29uJycp ICcgfHwgcXVlcnkKKyAgbG9vcAorICAgIGhhc2hfbm9kZSA6PSBmaW5kX2hhc2goanNvbl9leHRy YWN0X3BhdGgod2hvbGVfcGxhbiwgJzAnLCAnUGxhbicpKTsKKyAgICBvcmlnaW5hbCA6PSBoYXNo X25vZGUtPj4nT3JpZ2luYWwgSGFzaCBCYXRjaGVzJzsKKyAgICBmaW5hbCA6PSBoYXNoX25vZGUt Pj4nSGFzaCBCYXRjaGVzJzsKKyAgICByZXR1cm4gbmV4dDsKKyAgZW5kIGxvb3A7CitlbmQ7Cisk JDsKKworLS0gTWFrZSBhIHNpbXBsZSByZWxhdGlvbiB3aXRoIHdlbGwgZGlzdHJpYnV0ZWQga2V5 cyBhbmQgY29ycmVjdGx5CistLSBlc3RpbWF0ZWQgc2l6ZS4KK2NyZWF0ZSB0YWJsZSBzaW1wbGUg YXMKKyAgc2VsZWN0IGdlbmVyYXRlX3NlcmllcygxLCAyMDAwMCkgQVMgaWQsICdhYWFhYWFhYWFh YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhJzsKK2FsdGVyIHRhYmxlIHNpbXBsZSBzZXQgKHBhcmFs bGVsX3dvcmtlcnMgPSAyKTsKK2FuYWx5emUgc2ltcGxlOworCistLSBNYWtlIGEgcmVsYXRpb24g d2hvc2Ugc2l6ZSB3ZSB3aWxsIHVuZGVyLWVzdGltYXRlLiAgV2Ugd2FudCBzdGF0cworLS0gdG8g c2F5IDEwMDAgcm93cywgYnV0IGFjdHVhbGx5IHRoZXJlIGFyZSAyMCwwMDAgcm93cy4KK2NyZWF0 ZSB0YWJsZSBiaWdnZXJfdGhhbl9pdF9sb29rcyBhcworICBzZWxlY3QgZ2VuZXJhdGVfc2VyaWVz KDEsIDIwMDAwKSBhcyBpZCwgJ2FhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEnOwor YWx0ZXIgdGFibGUgYmlnZ2VyX3RoYW5faXRfbG9va3Mgc2V0IChhdXRvdmFjdXVtX2VuYWJsZWQg PSAnZmFsc2UnKTsKK2FsdGVyIHRhYmxlIGJpZ2dlcl90aGFuX2l0X2xvb2tzIHNldCAocGFyYWxs ZWxfd29ya2VycyA9IDIpOworYW5hbHl6ZSBiaWdnZXJfdGhhbl9pdF9sb29rczsKK3VwZGF0ZSBw Z19jbGFzcyBzZXQgcmVsdHVwbGVzID0gMTAwMCB3aGVyZSByZWxuYW1lID0gJ2JpZ2dlcl90aGFu X2l0X2xvb2tzJzsKKworLS0gTWFrZSBhIHJlbGF0aW9uIHdob3NlIHNpemUgd2UgdW5kZXJlc3Rp bWF0ZSBhbmQgdGhhdCBhbHNvIGhhcyBhCistLSBraW5kIG9mIHNrZXcgdGhhdCBicmVha3Mgb3Vy IGJhdGNoaW5nIHNjaGVtZS4gIFdlIHdhbnQgc3RhdHMgdG8gc2F5CistLSAyIHJvd3MsIGJ1dCBh Y3R1YWxseSB0aGVyZSBhcmUgMjAsMDAwIHJvd3Mgd2l0aCB0aGUgc2FtZSBrZXkuCitjcmVhdGUg dGFibGUgZXh0cmVtZWx5X3NrZXdlZCAoaWQgaW50LCB0IHRleHQpOworYWx0ZXIgdGFibGUgZXh0 cmVtZWx5X3NrZXdlZCBzZXQgKGF1dG92YWN1dW1fZW5hYmxlZCA9ICdmYWxzZScpOworYWx0ZXIg dGFibGUgZXh0cmVtZWx5X3NrZXdlZCBzZXQgKHBhcmFsbGVsX3dvcmtlcnMgPSAyKTsKK2FuYWx5 emUgZXh0cmVtZWx5X3NrZXdlZDsKK2luc2VydCBpbnRvIGV4dHJlbWVseV9za2V3ZWQKKyAgc2Vs ZWN0IDQyIGFzIGlkLCAnYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYScKKyAgZnJv bSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwMDApOwordXBkYXRlIHBnX2NsYXNzCisgIHNldCByZWx0 dXBsZXMgPSAyLCByZWxwYWdlcyA9IHBnX3JlbGF0aW9uX3NpemUoJ2V4dHJlbWVseV9za2V3ZWQn KSAvIDgxOTIKKyAgd2hlcmUgcmVsbmFtZSA9ICdleHRyZW1lbHlfc2tld2VkJzsKKworLS0gTWFr ZSBhIHJlbGF0aW9uIHdpdGggYSBjb3VwbGUgb2YgZW5vcm1vdXMgdHVwbGVzLgorY3JlYXRlIHRh YmxlIHdpZGUgYXMgc2VsZWN0IGdlbmVyYXRlX3NlcmllcygxLCAyKSBhcyBpZCwgcnBhZCgnJywg MzIwMDAwLCAneCcpIGFzIHQ7CithbHRlciB0YWJsZSB3aWRlIHNldCAocGFyYWxsZWxfd29ya2Vy cyA9IDIpOworCistLSBUaGUgIm9wdGltYWwiIGNhc2U6IHRoZSBoYXNoIHRhYmxlIGZpdHMgaW4g bWVtb3J5OyB3ZSBwbGFuIGZvciAxCistLSBiYXRjaCwgd2Ugc3RpY2sgdG8gdGhhdCBudW1iZXIs IGFuZCBwZWFrIG1lbW9yeSB1c2FnZSBzdGF5cyB3aXRoaW4KKy0tIG91ciB3b3JrX21lbSBidWRn ZXQKKworLS0gbm9uLXBhcmFsbGVsCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4 X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDA7CitzZXQgbG9jYWwgd29ya19tZW0gPSAn NE1CJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVz aW5nIChpZCk7CitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVz aW5nIChpZCk7CitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBm aW5hbCA+IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2Jh dGNoZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBz IHVzaW5nIChpZCk7CiskJCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworLS0gcGFyYWxsZWwg d2l0aCBwYXJhbGxlbC1vYmxpdmlvdXMgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7Citz ZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitzZXQgbG9jYWwg d29ya19tZW0gPSAnNE1CJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOwor c2V0IGxvY2FsIGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworZXhwbGFpbiAoY29zdHMgb2Zm KQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChp ZCk7CitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChp ZCk7CitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+ IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMo CiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5n IChpZCk7CiskJCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworLS0gcGFyYWxsZWwgd2l0aCBw YXJhbGxlbC1hd2FyZSBoYXNoIGpvaW4KK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBsb2NhbCBt YXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsKK3NldCBsb2NhbCB3b3JrX21lbSA9 ICc0TUInOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitzZXQgbG9jYWwg ZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0 IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworc2VsZWN0 IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworc2VsZWN0 IG9yaWdpbmFsID4gMSBhcyBpbml0aWFsbHlfbXVsdGliYXRjaCwgZmluYWwgPiBvcmlnaW5hbCBh cyBpbmNyZWFzZWRfYmF0Y2hlcworICBmcm9tIGhhc2hfam9pbl9iYXRjaGVzKAorJCQKKyAgc2Vs ZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworJCQp Oworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIFRoZSAiZ29vZCIgY2FzZTogYmF0Y2hlcyBy ZXF1aXJlZCwgYnV0IHdlIHBsYW4gdGhlIHJpZ2h0IG51bWJlcjsgd2UKKy0tIHBsYW4gZm9yIHNv bWUgbnVtYmVyIG9mIGJhdGNoZXMsIGFuZCB3ZSBzdGljayB0byB0aGF0IG51bWJlciwgYW5kCist LSBwZWFrIG1lbW9yeSB1c2FnZSBzYXlzIHdpdGhpbiBvdXIgd29ya19tZW0gYnVkZ2V0CisKKy0t IG5vbi1wYXJhbGxlbAorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxl bF93b3JrZXJzX3Blcl9nYXRoZXIgPSAwOworc2V0IGxvY2FsIHdvcmtfbWVtID0gJzEyOGtCJzsK K3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29zdHMgb2Zm KQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChp ZCk7CitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5nIChp ZCk7CitzZWxlY3Qgb3JpZ2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+ IG9yaWdpbmFsIGFzIGluY3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMo CiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIHNpbXBsZSBzIHVzaW5n IChpZCk7CiskJCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworLS0gcGFyYWxsZWwgd2l0aCBw YXJhbGxlbC1vYmxpdmlvdXMgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9j YWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitzZXQgbG9jYWwgd29ya19t ZW0gPSAnMTI4a0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitzZXQg bG9jYWwgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpCisg IHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsK K3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsK K3NlbGVjdCBvcmlnaW5hbCA+IDEgYXMgaW5pdGlhbGx5X211bHRpYmF0Y2gsIGZpbmFsID4gb3Jp Z2luYWwgYXMgaW5jcmVhc2VkX2JhdGNoZXMKKyAgZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQk CisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlk KTsKKyQkKTsKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworCistLSBwYXJhbGxlbCB3aXRoIHBhcmFs bGVsLWF3YXJlIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9w YXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2FsIHdvcmtfbWVtID0gJzE5 MmtCJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworc2V0IGxvY2FsIGVu YWJsZV9wYXJhbGxlbF9oYXNoID0gb247CitleHBsYWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCBj b3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCBj b3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCBv cmlnaW5hbCA+IDEgYXMgaW5pdGlhbGx5X211bHRpYmF0Y2gsIGZpbmFsID4gb3JpZ2luYWwgYXMg aW5jcmVhc2VkX2JhdGNoZXMKKyAgZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQkCisgIHNlbGVj dCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyQkKTsK Ky0tIHBhcmFsbGVsIGZ1bGwgbXVsdGktYmF0Y2ggaGFzaCBqb2luCitzZWxlY3QgY291bnQoKikg ZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKK3JvbGxi YWNrIHRvIHNldHRpbmdzOworCistLSBUaGUgImJhZCIgY2FzZTogZHVyaW5nIGV4ZWN1dGlvbiB3 ZSBuZWVkIHRvIGluY3JlYXNlIG51bWJlciBvZgorLS0gYmF0Y2hlczsgaW4gdGhpcyBjYXNlIHdl IHBsYW4gZm9yIDEgYmF0Y2gsIGFuZCBpbmNyZWFzZSBhdCBsZWFzdCBhCistLSBjb3VwbGUgb2Yg dGltZXMsIGFuZCBwZWFrIG1lbW9yeSB1c2FnZSBzdGF5cyB3aXRoaW4gb3VyIHdvcmtfbWVtCist LSBidWRnZXQKKworLS0gbm9uLXBhcmFsbGVsCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9j YWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDA7CitzZXQgbG9jYWwgd29ya19t ZW0gPSAnMTI4a0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitleHBs YWluIChjb3N0cyBvZmYpCisgIHNlbGVjdCBjb3VudCgqKSBGUk9NIHNpbXBsZSByIEpPSU4gYmln Z2VyX3RoYW5faXRfbG9va3MgcyBVU0lORyAoaWQpOworc2VsZWN0IGNvdW50KCopIEZST00gc2lt cGxlIHIgSk9JTiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIFVTSU5HIChpZCk7CitzZWxlY3Qgb3Jp Z2luYWwgPiAxIGFzIGluaXRpYWxseV9tdWx0aWJhdGNoLCBmaW5hbCA+IG9yaWdpbmFsIGFzIGlu Y3JlYXNlZF9iYXRjaGVzCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMoCiskJAorICBzZWxlY3Qg Y291bnQoKikgRlJPTSBzaW1wbGUgciBKT0lOIGJpZ2dlcl90aGFuX2l0X2xvb2tzIHMgVVNJTkcg KGlkKTsKKyQkKTsKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworCistLSBwYXJhbGxlbCB3aXRoIHBh cmFsbGVsLW9ibGl2aW91cyBoYXNoIGpvaW4KK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBsb2Nh bCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsKK3NldCBsb2NhbCB3b3JrX21l bSA9ICcxMjhrQic7CitzZXQgbG9jYWwgaGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsKK3NldCBs b2NhbCBlbmFibGVfcGFyYWxsZWxfaGFzaCA9IG9mZjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAg c2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBiaWdnZXJfdGhhbl9pdF9sb29rcyBz IHVzaW5nIChpZCk7CitzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGJpZ2dlcl90 aGFuX2l0X2xvb2tzIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCBvcmlnaW5hbCA+IDEgYXMgaW5pdGlh bGx5X211bHRpYmF0Y2gsIGZpbmFsID4gb3JpZ2luYWwgYXMgaW5jcmVhc2VkX2JhdGNoZXMKKyAg ZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBs ZSByIGpvaW4gYmlnZ2VyX3RoYW5faXRfbG9va3MgcyB1c2luZyAoaWQpOworJCQpOworcm9sbGJh Y2sgdG8gc2V0dGluZ3M7CisKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxsZWwtYXdhcmUgaGFzaCBq b2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNf cGVyX2dhdGhlciA9IDE7CitzZXQgbG9jYWwgd29ya19tZW0gPSAnMTkya0InOworc2V0IGxvY2Fs IGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitzZXQgbG9jYWwgZW5hYmxlX3BhcmFsbGVsX2hh c2ggPSBvbjsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2lt cGxlIHIgam9pbiBiaWdnZXJfdGhhbl9pdF9sb29rcyBzIHVzaW5nIChpZCk7CitzZWxlY3QgY291 bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGJpZ2dlcl90aGFuX2l0X2xvb2tzIHMgdXNpbmcgKGlk KTsKK3NlbGVjdCBvcmlnaW5hbCA+IDEgYXMgaW5pdGlhbGx5X211bHRpYmF0Y2gsIGZpbmFsID4g b3JpZ2luYWwgYXMgaW5jcmVhc2VkX2JhdGNoZXMKKyAgZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygK KyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gYmlnZ2VyX3RoYW5faXRf bG9va3MgcyB1c2luZyAoaWQpOworJCQpOworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIFRo ZSAidWdseSIgY2FzZTogaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIGJhdGNoZXMgZHVyaW5nIGV4 ZWN1dGlvbgorLS0gZG9lc24ndCBoZWxwLCBzbyBzdG9wIHRyeWluZyB0byBmaXQgaW4gd29ya19t ZW0gYW5kIGhvcGUgZm9yIHRoZQorLS0gYmVzdDsgaW4gdGhpcyBjYXNlIHdlIHBsYW4gZm9yIDEg YmF0Y2gsIGluY3JlYXNlcyBqdXN0IG9uY2UgYW5kCistLSB0aGVuIHN0b3AgaW5jcmVhc2luZyBi ZWNhdXNlIHRoYXQgZGlkbid0IGhlbHAgYXQgYWxsLCBzbyB3ZSBibG93CistLSByaWdodCB0aHJv dWdoIHRoZSB3b3JrX21lbSBidWRnZXQgYW5kIGhvcGUgZm9yIHRoZSBiZXN0Li4uCisKKy0tIG5v bi1wYXJhbGxlbAorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9wYXJhbGxlbF93 b3JrZXJzX3Blcl9nYXRoZXIgPSAwOworc2V0IGxvY2FsIHdvcmtfbWVtID0gJzEyOGtCJzsKK3Nl dCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29zdHMgb2ZmKQor ICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGV4dHJlbWVseV9za2V3ZWQgcyB1 c2luZyAoaWQpOworc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlf c2tld2VkIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCAqIGZyb20gaGFzaF9qb2luX2JhdGNoZXMoCisk JAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGV4dHJlbWVseV9za2V3ZWQg cyB1c2luZyAoaWQpOworJCQpOworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIHBhcmFsbGVs IHdpdGggcGFyYWxsZWwtb2JsaXZpb3VzIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOwor c2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGxvY2Fs IHdvcmtfbWVtID0gJzEyOGtCJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4w Oworc2V0IGxvY2FsIGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2ZmOworZXhwbGFpbiAoY29zdHMg b2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGV4dHJlbWVseV9za2V3 ZWQgcyB1c2luZyAoaWQpOworc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRy ZW1lbHlfc2tld2VkIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCAqIGZyb20gaGFzaF9qb2luX2JhdGNo ZXMoCiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBzaW1wbGUgciBqb2luIGV4dHJlbWVseV9z a2V3ZWQgcyB1c2luZyAoaWQpOworJCQpOworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIHBh cmFsbGVsIHdpdGggcGFyYWxsZWwtYXdhcmUgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7 CitzZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDE7CitzZXQgbG9j YWwgd29ya19tZW0gPSAnMTI4a0InOworc2V0IGxvY2FsIGhhc2hfbWVtX211bHRpcGxpZXIgPSAx LjA7CitzZXQgbG9jYWwgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsKK2V4cGxhaW4gKGNvc3Rz IG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlfc2tl d2VkIHMgdXNpbmcgKGlkKTsKK3NlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGpvaW4gZXh0 cmVtZWx5X3NrZXdlZCBzIHVzaW5nIChpZCk7CitzZWxlY3QgKiBmcm9tIGhhc2hfam9pbl9iYXRj aGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gc2ltcGxlIHIgam9pbiBleHRyZW1lbHlf c2tld2VkIHMgdXNpbmcgKGlkKTsKKyQkKTsKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworCistLSBB IGNvdXBsZSBvZiBvdGhlciBoYXNoIGpvaW4gdGVzdHMgdW5yZWxhdGVkIHRvIHdvcmtfbWVtIG1h bmFnZW1lbnQuCisKKy0tIENoZWNrIHRoYXQgRVhQTEFJTiBBTkFMWVpFIGhhcyBkYXRhIGV2ZW4g aWYgdGhlIGxlYWRlciBkb2Vzbid0IHBhcnRpY2lwYXRlCitzYXZlcG9pbnQgc2V0dGluZ3M7Citz ZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitzZXQgbG9jYWwg d29ya19tZW0gPSAnNE1CJzsKK3NldCBsb2NhbCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOwor c2V0IGxvY2FsIHBhcmFsbGVsX2xlYWRlcl9wYXJ0aWNpcGF0aW9uID0gb2ZmOworc2VsZWN0ICog ZnJvbSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIHNpbXBs ZSByIGpvaW4gc2ltcGxlIHMgdXNpbmcgKGlkKTsKKyQkKTsKK3JvbGxiYWNrIHRvIHNldHRpbmdz OworCistLSBFeGVyY2lzZSByZXNjYW5zLiAgV2UnbGwgdHVybiBvZmYgcGFyYWxsZWxfbGVhZGVy X3BhcnRpY2lwYXRpb24gc28KKy0tIHRoYXQgd2UgY2FuIGNoZWNrIHRoYXQgaW5zdHJ1bWVudGF0 aW9uIGNvbWVzIGJhY2sgY29ycmVjdGx5LgorCitjcmVhdGUgdGFibGUgam9pbl9mb28gYXMgc2Vs ZWN0IGdlbmVyYXRlX3NlcmllcygxLCAzKSBhcyBpZCwgJ3h4eHh4Jzo6dGV4dCBhcyB0OworYWx0 ZXIgdGFibGUgam9pbl9mb28gc2V0IChwYXJhbGxlbF93b3JrZXJzID0gMCk7CitjcmVhdGUgdGFi bGUgam9pbl9iYXIgYXMgc2VsZWN0IGdlbmVyYXRlX3NlcmllcygxLCAxMDAwMCkgYXMgaWQsICd4 eHh4eCc6OnRleHQgYXMgdDsKK2FsdGVyIHRhYmxlIGpvaW5fYmFyIHNldCAocGFyYWxsZWxfd29y a2VycyA9IDIpOworCistLSBtdWx0aS1iYXRjaCB3aXRoIHJlc2NhbiwgcGFyYWxsZWwtb2JsaXZp b3VzCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvZmY7 CitzZXQgcGFyYWxsZWxfbGVhZGVyX3BhcnRpY2lwYXRpb24gPSBvZmY7CitzZXQgbWluX3BhcmFs bGVsX3RhYmxlX3NjYW5fc2l6ZSA9IDA7CitzZXQgcGFyYWxsZWxfc2V0dXBfY29zdCA9IDA7Citz ZXQgcGFyYWxsZWxfdHVwbGVfY29zdCA9IDA7CitzZXQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVy X2dhdGhlciA9IDI7CitzZXQgZW5hYmxlX21hdGVyaWFsID0gb2ZmOworc2V0IGVuYWJsZV9tZXJn ZWpvaW4gPSBvZmY7CitzZXQgd29ya19tZW0gPSAnNjRrQic7CitzZXQgaGFzaF9tZW1fbXVsdGlw bGllciA9IDEuMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0IGNvdW50KCopIGZyb20g am9pbl9mb28KKyAgICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFy IGIxIGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgICBvbiBqb2luX2Zvby5pZCA8 IHNzLmlkICsgMSBhbmQgam9pbl9mb28uaWQgPiBzcy5pZCAtIDE7CitzZWxlY3QgY291bnQoKikg ZnJvbSBqb2luX2ZvbworICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5f YmFyIGIxIGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgb24gam9pbl9mb28uaWQg PCBzcy5pZCArIDEgYW5kIGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOworc2VsZWN0IGZpbmFsID4g MSBhcyBtdWx0aWJhdGNoCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMoCiskJAorICBzZWxlY3Qg Y291bnQoKikgZnJvbSBqb2luX2ZvbworICAgIGxlZnQgam9pbiAoc2VsZWN0IGIxLmlkLCBiMS50 IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBiMiB1c2luZyAoaWQpKSBzcworICAgIG9u IGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zvby5pZCA+IHNzLmlkIC0gMTsKKyQk KTsKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworCistLSBzaW5nbGUtYmF0Y2ggd2l0aCByZXNjYW4s IHBhcmFsbGVsLW9ibGl2aW91cworc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGVuYWJsZV9wYXJh bGxlbF9oYXNoID0gb2ZmOworc2V0IHBhcmFsbGVsX2xlYWRlcl9wYXJ0aWNpcGF0aW9uID0gb2Zm Oworc2V0IG1pbl9wYXJhbGxlbF90YWJsZV9zY2FuX3NpemUgPSAwOworc2V0IHBhcmFsbGVsX3Nl dHVwX2Nvc3QgPSAwOworc2V0IHBhcmFsbGVsX3R1cGxlX2Nvc3QgPSAwOworc2V0IG1heF9wYXJh bGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGVuYWJsZV9tYXRlcmlhbCA9IG9mZjsK K3NldCBlbmFibGVfbWVyZ2Vqb2luID0gb2ZmOworc2V0IHdvcmtfbWVtID0gJzRNQic7CitzZXQg aGFzaF9tZW1fbXVsdGlwbGllciA9IDEuMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0 IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAgICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEu dCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAgICBv biBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBhbmQgam9pbl9mb28uaWQgPiBzcy5pZCAtIDE7Citz ZWxlY3QgY291bnQoKikgZnJvbSBqb2luX2ZvbworICBsZWZ0IGpvaW4gKHNlbGVjdCBiMS5pZCwg YjEudCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9pbl9iYXIgYjIgdXNpbmcgKGlkKSkgc3MKKyAg b24gam9pbl9mb28uaWQgPCBzcy5pZCArIDEgYW5kIGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOwor c2VsZWN0IGZpbmFsID4gMSBhcyBtdWx0aWJhdGNoCisgIGZyb20gaGFzaF9qb2luX2JhdGNoZXMo CiskJAorICBzZWxlY3QgY291bnQoKikgZnJvbSBqb2luX2ZvbworICAgIGxlZnQgam9pbiAoc2Vs ZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBiMiB1c2luZyAo aWQpKSBzcworICAgIG9uIGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zvby5pZCA+ IHNzLmlkIC0gMTsKKyQkKTsKK3JvbGxiYWNrIHRvIHNldHRpbmdzOworCistLSBtdWx0aS1iYXRj aCB3aXRoIHJlc2NhbiwgcGFyYWxsZWwtYXdhcmUKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBl bmFibGVfcGFyYWxsZWxfaGFzaCA9IG9uOworc2V0IHBhcmFsbGVsX2xlYWRlcl9wYXJ0aWNpcGF0 aW9uID0gb2ZmOworc2V0IG1pbl9wYXJhbGxlbF90YWJsZV9zY2FuX3NpemUgPSAwOworc2V0IHBh cmFsbGVsX3NldHVwX2Nvc3QgPSAwOworc2V0IHBhcmFsbGVsX3R1cGxlX2Nvc3QgPSAwOworc2V0 IG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworc2V0IGVuYWJsZV9tYXRlcmlh bCA9IG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luID0gb2ZmOworc2V0IHdvcmtfbWVtID0gJzY0 a0InOworc2V0IGhhc2hfbWVtX211bHRpcGxpZXIgPSAxLjA7CitleHBsYWluIChjb3N0cyBvZmYp CisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIGpvaW5fZm9vCisgICAgbGVmdCBqb2luIChzZWxlY3Qg YjEuaWQsIGIxLnQgZnJvbSBqb2luX2JhciBiMSBqb2luIGpvaW5fYmFyIGIyIHVzaW5nIChpZCkp IHNzCisgICAgb24gam9pbl9mb28uaWQgPCBzcy5pZCArIDEgYW5kIGpvaW5fZm9vLmlkID4gc3Mu aWQgLSAxOworc2VsZWN0IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAgbGVmdCBqb2luIChzZWxl Y3QgYjEuaWQsIGIxLnQgZnJvbSBqb2luX2JhciBiMSBqb2luIGpvaW5fYmFyIGIyIHVzaW5nIChp ZCkpIHNzCisgIG9uIGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zvby5pZCA+IHNz LmlkIC0gMTsKK3NlbGVjdCBmaW5hbCA+IDEgYXMgbXVsdGliYXRjaAorICBmcm9tIGhhc2hfam9p bl9iYXRjaGVzKAorJCQKKyAgc2VsZWN0IGNvdW50KCopIGZyb20gam9pbl9mb28KKyAgICBsZWZ0 IGpvaW4gKHNlbGVjdCBiMS5pZCwgYjEudCBmcm9tIGpvaW5fYmFyIGIxIGpvaW4gam9pbl9iYXIg YjIgdXNpbmcgKGlkKSkgc3MKKyAgICBvbiBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBhbmQgam9p bl9mb28uaWQgPiBzcy5pZCAtIDE7CiskJCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworLS0g c2luZ2xlLWJhdGNoIHdpdGggcmVzY2FuLCBwYXJhbGxlbC1hd2FyZQorc2F2ZXBvaW50IHNldHRp bmdzOworc2V0IGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb247CitzZXQgcGFyYWxsZWxfbGVhZGVy X3BhcnRpY2lwYXRpb24gPSBvZmY7CitzZXQgbWluX3BhcmFsbGVsX3RhYmxlX3NjYW5fc2l6ZSA9 IDA7CitzZXQgcGFyYWxsZWxfc2V0dXBfY29zdCA9IDA7CitzZXQgcGFyYWxsZWxfdHVwbGVfY29z dCA9IDA7CitzZXQgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7CitzZXQgZW5h YmxlX21hdGVyaWFsID0gb2ZmOworc2V0IGVuYWJsZV9tZXJnZWpvaW4gPSBvZmY7CitzZXQgd29y a19tZW0gPSAnNE1CJzsKK3NldCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAo Y29zdHMgb2ZmKQorICBzZWxlY3QgY291bnQoKikgZnJvbSBqb2luX2ZvbworICAgIGxlZnQgam9p biAoc2VsZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBiMiB1 c2luZyAoaWQpKSBzcworICAgIG9uIGpvaW5fZm9vLmlkIDwgc3MuaWQgKyAxIGFuZCBqb2luX2Zv by5pZCA+IHNzLmlkIC0gMTsKK3NlbGVjdCBjb3VudCgqKSBmcm9tIGpvaW5fZm9vCisgIGxlZnQg am9pbiAoc2VsZWN0IGIxLmlkLCBiMS50IGZyb20gam9pbl9iYXIgYjEgam9pbiBqb2luX2JhciBi MiB1c2luZyAoaWQpKSBzcworICBvbiBqb2luX2Zvby5pZCA8IHNzLmlkICsgMSBhbmQgam9pbl9m b28uaWQgPiBzcy5pZCAtIDE7CitzZWxlY3QgZmluYWwgPiAxIGFzIG11bHRpYmF0Y2gKKyAgZnJv bSBoYXNoX2pvaW5fYmF0Y2hlcygKKyQkCisgIHNlbGVjdCBjb3VudCgqKSBmcm9tIGpvaW5fZm9v CisgICAgbGVmdCBqb2luIChzZWxlY3QgYjEuaWQsIGIxLnQgZnJvbSBqb2luX2JhciBiMSBqb2lu IGpvaW5fYmFyIGIyIHVzaW5nIChpZCkpIHNzCisgICAgb24gam9pbl9mb28uaWQgPCBzcy5pZCAr IDEgYW5kIGpvaW5fZm9vLmlkID4gc3MuaWQgLSAxOworJCQpOworcm9sbGJhY2sgdG8gc2V0dGlu Z3M7CisKKy0tIEEgZnVsbCBvdXRlciBqb2luIHdoZXJlIGV2ZXJ5IHJlY29yZCBpcyBtYXRjaGVk LgorCistLSBub24tcGFyYWxsZWwKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBsb2NhbCBtYXhf cGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAg ICAgc2VsZWN0ICBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUg cyB1c2luZyAoaWQpOworc2VsZWN0ICBjb3VudCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIg am9pbiBzaW1wbGUgcyB1c2luZyAoaWQpOworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIHBh cmFsbGVsaXNtIG5vdCBwb3NzaWJsZSB3aXRoIHBhcmFsbGVsLW9ibGl2aW91cyBmdWxsIGhhc2gg am9pbgorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGVuYWJsZV9wYXJhbGxlbF9oYXNoID0gb2Zm Oworc2V0IGxvY2FsIG1heF9wYXJhbGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworZXhwbGFp biAoY29zdHMgb2ZmKQorICAgICBzZWxlY3QgIGNvdW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBv dXRlciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7CitzZWxlY3QgIGNvdW50KCopIGZyb20gc2lt cGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBzIHVzaW5nIChpZCk7Cityb2xsYmFjayB0byBz ZXR0aW5nczsKKworLS0gcGFyYWxsZWxpc20gaXMgcG9zc2libGUgd2l0aCBwYXJhbGxlbC1hd2Fy ZSBmdWxsIGhhc2ggam9pbgorc2F2ZXBvaW50IHNldHRpbmdzOworc2V0IGxvY2FsIG1heF9wYXJh bGxlbF93b3JrZXJzX3Blcl9nYXRoZXIgPSAyOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICAgICBz ZWxlY3QgIGNvdW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBzIHVz aW5nIChpZCk7CitzZWxlY3QgIGNvdW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBvdXRlciBqb2lu IHNpbXBsZSBzIHVzaW5nIChpZCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworLS0gQSBmdWxs IG91dGVyIGpvaW4gd2hlcmUgZXZlcnkgcmVjb3JkIGlzIG5vdCBtYXRjaGVkLgorCistLSBub24t cGFyYWxsZWwKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBsb2NhbCBtYXhfcGFyYWxsZWxfd29y a2Vyc19wZXJfZ2F0aGVyID0gMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgICAgc2VsZWN0ICBj b3VudCgqKSBmcm9tIHNpbXBsZSByIGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUgcyBvbiAoci5pZCA9 IDAgLSBzLmlkKTsKK3NlbGVjdCAgY291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpv aW4gc2ltcGxlIHMgb24gKHIuaWQgPSAwIC0gcy5pZCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsK KworLS0gcGFyYWxsZWxpc20gbm90IHBvc3NpYmxlIHdpdGggcGFyYWxsZWwtb2JsaXZpb3VzIGZ1 bGwgaGFzaCBqb2luCitzYXZlcG9pbnQgc2V0dGluZ3M7CitzZXQgZW5hYmxlX3BhcmFsbGVsX2hh c2ggPSBvZmY7CitzZXQgbG9jYWwgbWF4X3BhcmFsbGVsX3dvcmtlcnNfcGVyX2dhdGhlciA9IDI7 CitleHBsYWluIChjb3N0cyBvZmYpCisgICAgIHNlbGVjdCAgY291bnQoKikgZnJvbSBzaW1wbGUg ciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgb24gKHIuaWQgPSAwIC0gcy5pZCk7CitzZWxlY3Qg IGNvdW50KCopIGZyb20gc2ltcGxlIHIgZnVsbCBvdXRlciBqb2luIHNpbXBsZSBzIG9uIChyLmlk ID0gMCAtIHMuaWQpOworcm9sbGJhY2sgdG8gc2V0dGluZ3M7CisKKy0tIHBhcmFsbGVsaXNtIGlz IHBvc3NpYmxlIHdpdGggcGFyYWxsZWwtYXdhcmUgZnVsbCBoYXNoIGpvaW4KK3NhdmVwb2ludCBz ZXR0aW5nczsKK3NldCBsb2NhbCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyID0gMjsK K2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgICAgc2VsZWN0ICBjb3VudCgqKSBmcm9tIHNpbXBsZSBy IGZ1bGwgb3V0ZXIgam9pbiBzaW1wbGUgcyBvbiAoci5pZCA9IDAgLSBzLmlkKTsKK3NlbGVjdCAg Y291bnQoKikgZnJvbSBzaW1wbGUgciBmdWxsIG91dGVyIGpvaW4gc2ltcGxlIHMgb24gKHIuaWQg PSAwIC0gcy5pZCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworCistLSBleGVyY2lzZSBzcGVj aWFsIGNvZGUgcGF0aHMgZm9yIGh1Z2UgdHVwbGVzIChub3RlIHVzZSBvZiBub24tc3RyaWN0Cist LSBleHByZXNzaW9uIGFuZCBsZWZ0IGpvaW4gcmVxdWlyZWQgdG8gZ2V0IHRoZSBkZXRvYXN0ZWQg dHVwbGUgaW50bworLS0gdGhlIGhhc2ggdGFibGUpCisKKy0tIHBhcmFsbGVsIHdpdGggcGFyYWxs ZWwtYXdhcmUgaGFzaCBqb2luIChoaXRzIEV4ZWNQYXJhbGxlbEhhc2hMb2FkVHVwbGUgYW5kCist LSBzdHNfcHV0dHVwbGUgb3ZlcnNpemVkIHR1cGxlIGNhc2VzIGJlY2F1c2UgaXQncyBtdWx0aS1i YXRjaCkKK3NhdmVwb2ludCBzZXR0aW5nczsKK3NldCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJf Z2F0aGVyID0gMjsKK3NldCBlbmFibGVfcGFyYWxsZWxfaGFzaCA9IG9uOworc2V0IHdvcmtfbWVt ID0gJzEyOGtCJzsKK3NldCBoYXNoX21lbV9tdWx0aXBsaWVyID0gMS4wOworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgbGVuZ3RoKG1heChzLnQpKQorICBmcm9tIHdpZGUgbGVmdCBqb2lu IChzZWxlY3QgaWQsIGNvYWxlc2NlKHQsICcnKSB8fCAnJyBhcyB0IGZyb20gd2lkZSkgcyB1c2lu ZyAoaWQpOworc2VsZWN0IGxlbmd0aChtYXgocy50KSkKK2Zyb20gd2lkZSBsZWZ0IGpvaW4gKHNl bGVjdCBpZCwgY29hbGVzY2UodCwgJycpIHx8ICcnIGFzIHQgZnJvbSB3aWRlKSBzIHVzaW5nIChp ZCk7CitzZWxlY3QgZmluYWwgPiAxIGFzIG11bHRpYmF0Y2gKKyAgZnJvbSBoYXNoX2pvaW5fYmF0 Y2hlcygKKyQkCisgIHNlbGVjdCBsZW5ndGgobWF4KHMudCkpCisgIGZyb20gd2lkZSBsZWZ0IGpv aW4gKHNlbGVjdCBpZCwgY29hbGVzY2UodCwgJycpIHx8ICcnIGFzIHQgZnJvbSB3aWRlKSBzIHVz aW5nIChpZCk7CiskJCk7Cityb2xsYmFjayB0byBzZXR0aW5nczsKKworCistLSBIYXNoIGpvaW4g cmV1c2VzIHRoZSBIT1Qgc3RhdHVzIGJpdCB0byBpbmRpY2F0ZSBtYXRjaCBzdGF0dXMuIFRoaXMg Y2FuIG9ubHkKKy0tIGJlIGd1YXJhbnRlZWQgdG8gcHJvZHVjZSBjb3JyZWN0IHJlc3VsdHMgaWYg YWxsIHRoZSBoYXNoIGpvaW4gdHVwbGUgbWF0Y2gKKy0tIGJpdHMgYXJlIHJlc2V0IGJlZm9yZSBy ZXVzZS4gVGhpcyBpcyBkb25lIHVwb24gbG9hZGluZyB0aGVtIGludG8gdGhlCistLSBoYXNodGFi bGUuCitTQVZFUE9JTlQgc2V0dGluZ3M7CitTRVQgZW5hYmxlX3BhcmFsbGVsX2hhc2ggPSBvbjsK K1NFVCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplID0gMDsKK1NFVCBwYXJhbGxlbF9zZXR1 cF9jb3N0ID0gMDsKK1NFVCBwYXJhbGxlbF90dXBsZV9jb3N0ID0gMDsKK0NSRUFURSBUQUJMRSBo anRlc3RfbWF0Y2hiaXRzX3QxKGlkIGludCk7CitDUkVBVEUgVEFCTEUgaGp0ZXN0X21hdGNoYml0 c190MihpZCBpbnQpOworSU5TRVJUIElOVE8gaGp0ZXN0X21hdGNoYml0c190MSBWQUxVRVMgKDEp OworSU5TRVJUIElOVE8gaGp0ZXN0X21hdGNoYml0c190MiBWQUxVRVMgKDIpOworLS0gVXBkYXRl IHNob3VsZCBjcmVhdGUgYSBIT1QgdHVwbGUuIElmIHRoaXMgc3RhdHVzIGJpdCBpc24ndCBjbGVh cmVkLCB3ZSB3b24ndAorLS0gY29ycmVjdGx5IGVtaXQgdGhlIE5VTEwtZXh0ZW5kZWQgdW5tYXRj aGluZyB0dXBsZSBpbiBmdWxsIGhhc2ggam9pbi4KK1VQREFURSBoanRlc3RfbWF0Y2hiaXRzX3Qy IHNldCBpZCA9IDI7CitTRUxFQ1QgKiBGUk9NIGhqdGVzdF9tYXRjaGJpdHNfdDEgdDEgRlVMTCBK T0lOIGhqdGVzdF9tYXRjaGJpdHNfdDIgdDIgT04gdDEuaWQgPSB0Mi5pZAorICBPUkRFUiBCWSB0 MS5pZDsKKy0tIFRlc3Qgc2VyaWFsIGZ1bGwgaGFzaCBqb2luLgorLS0gUmVzZXR0aW5nIHBhcmFs bGVsX3NldHVwX2Nvc3Qgc2hvdWxkIGZvcmNlIGEgc2VyaWFsIHBsYW4uCistLSBKdXN0IHRvIGJl IHNhZmUsIGhvd2V2ZXIsIHNldCBlbmFibGVfcGFyYWxsZWxfaGFzaCB0byBvZmYsIGFzIHBhcmFs bGVsIGZ1bGwKKy0tIGhhc2ggam9pbnMgYXJlIG9ubHkgc3VwcG9ydGVkIHdpdGggc2hhcmVkIGhh c2h0YWJsZXMuCitSRVNFVCBwYXJhbGxlbF9zZXR1cF9jb3N0OworU0VUIGVuYWJsZV9wYXJhbGxl bF9oYXNoID0gb2ZmOworU0VMRUNUICogRlJPTSBoanRlc3RfbWF0Y2hiaXRzX3QxIHQxIEZVTEwg Sk9JTiBoanRlc3RfbWF0Y2hiaXRzX3QyIHQyIE9OIHQxLmlkID0gdDIuaWQ7CitST0xMQkFDSyBU TyBzZXR0aW5nczsKKworcm9sbGJhY2s7CisKKy0tIFZlcmlmeSB0aGF0IGhhc2gga2V5IGV4cHJl c3Npb25zIHJlZmVyZW5jZSB0aGUgY29ycmVjdAorLS0gbm9kZXMuIEhhc2hqb2luJ3MgaGFzaGtl eXMgbmVlZCB0byByZWZlcmVuY2UgaXRzIG91dGVyIHBsYW4sIEhhc2gncworLS0gbmVlZCB0byBy ZWZlcmVuY2UgSGFzaCdzIG91dGVyIHBsYW4gKHdoaWNoIGlzIGJlbG93IEhhc2hKb2luJ3MKKy0t IGlubmVyIHBsYW4pLiBJdCdzIG5vdCB0cml2aWFsIHRvIHZlcmlmeSB0aGF0IHRoZSByZWZlcmVu Y2VzIGFyZQorLS0gY29ycmVjdCAod2UgZG9uJ3QgZGlzcGxheSB0aGUgaGFzaGtleXMgdGhlbXNl bHZlcyksIGJ1dCBpZiB0aGUKKy0tIGhhc2hrZXlzIGNvbnRhaW4gc3VicGxhbiByZWZlcmVuY2Vz LCB0aG9zZSB3aWxsIGJlIGRpc3BsYXllZC4gRm9yY2UKKy0tIHN1YnBsYW5zIHRvIGFwcGVhciBq dXN0IGFib3V0IGV2ZXJ5d2hlcmUuCistLQorLS0gQnVnIHJlcG9ydDoKKy0tIGh0dHBzOi8vd3d3 LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvQ0FQcEhmZHZHVmVnRl9US0tSaUJyU21hdEpMMmRS OXV3RkN1UiUyQnRlUV84dEVYVThteGclNDBtYWlsLmdtYWlsLmNvbQorLS0KK0JFR0lOOworU0VU IExPQ0FMIGVuYWJsZV9zb3J0ID0gT0ZGOyAtLSBhdm9pZCBtZXJnZWpvaW5zCitTRVQgTE9DQUwg ZnJvbV9jb2xsYXBzZV9saW1pdCA9IDE7IC0tIGFsbG93cyBlYXN5IGNoYW5naW5nIG9mIGpvaW4g b3JkZXIKKworQ1JFQVRFIFRBQkxFIGhqdGVzdF8xIChhIHRleHQsIGIgaW50LCBpZCBpbnQsIGMg Ym9vbCk7CitDUkVBVEUgVEFCTEUgaGp0ZXN0XzIgKGEgYm9vbCwgaWQgaW50LCBiIHRleHQsIGMg aW50KTsKKworSU5TRVJUIElOVE8gaGp0ZXN0XzEoYSwgYiwgaWQsIGMpIFZBTFVFUyAoJ3RleHQn LCAyLCAxLCBmYWxzZSk7IC0tIG1hdGNoZXMKK0lOU0VSVCBJTlRPIGhqdGVzdF8xKGEsIGIsIGlk LCBjKSBWQUxVRVMgKCd0ZXh0JywgMSwgMiwgZmFsc2UpOyAtLSBmYWlscyBpZCBqb2luIGNvbmRp dGlvbgorSU5TRVJUIElOVE8gaGp0ZXN0XzEoYSwgYiwgaWQsIGMpIFZBTFVFUyAoJ3RleHQnLCAy MCwgMSwgZmFsc2UpOyAtLSBmYWlscyA8IDUwCitJTlNFUlQgSU5UTyBoanRlc3RfMShhLCBiLCBp ZCwgYykgVkFMVUVTICgndGV4dCcsIDEsIDEsIGZhbHNlKTsgLS0gZmFpbHMgKFNFTEVDVCBoanRl c3RfMS5iICogNSkgPSAoU0VMRUNUIGhqdGVzdF8yLmMqNSkKKworSU5TRVJUIElOVE8gaGp0ZXN0 XzIoYSwgaWQsIGIsIGMpIFZBTFVFUyAodHJ1ZSwgMSwgJ2Fub3RoZXInLCAyKTsgLS0gbWF0Y2hl cworSU5TRVJUIElOVE8gaGp0ZXN0XzIoYSwgaWQsIGIsIGMpIFZBTFVFUyAodHJ1ZSwgMywgJ2Fu b3RoZXInLCA3KTsgLS0gZmFpbHMgaWQgam9pbiBjb25kaXRpb24KK0lOU0VSVCBJTlRPIGhqdGVz dF8yKGEsIGlkLCBiLCBjKSBWQUxVRVMgKHRydWUsIDEsICdhbm90aGVyJywgOTApOyAgLS0gZmFp bHMgPCA1NQorSU5TRVJUIElOVE8gaGp0ZXN0XzIoYSwgaWQsIGIsIGMpIFZBTFVFUyAodHJ1ZSwg MSwgJ2Fub3RoZXInLCAzKTsgLS0gZmFpbHMgKFNFTEVDVCBoanRlc3RfMS5iICogNSkgPSAoU0VM RUNUIGhqdGVzdF8yLmMqNSkKK0lOU0VSVCBJTlRPIGhqdGVzdF8yKGEsIGlkLCBiLCBjKSBWQUxV RVMgKHRydWUsIDEsICd0ZXh0JywgMSk7IC0tICBmYWlscyBoanRlc3RfMS5hIDw+IGhqdGVzdF8y LmI7CisKK0VYUExBSU4gKENPU1RTIE9GRiwgVkVSQk9TRSkKK1NFTEVDVCBoanRlc3RfMS5hIGEx LCBoanRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxlb2lkOjpyZWdjbGFzcyB0MSwgaGp0ZXN0XzIu dGFibGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhqdGVzdF8xLCBoanRlc3RfMgorV0hFUkUKKyAg ICBoanRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVSRSBoanRlc3RfMi5pZCA9IDEpCisgICAgQU5E IChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNFTEVDVCBoanRlc3RfMi5jKjUpCisgICAgQU5E IChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAKKyAgICBBTkQgKFNFTEVDVCBoanRlc3RfMi5j ICogNSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5hIDw+IGhqdGVzdF8yLmI7CisKK1NFTEVDVCBo anRlc3RfMS5hIGExLCBoanRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxlb2lkOjpyZWdjbGFzcyB0 MSwgaGp0ZXN0XzIudGFibGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhqdGVzdF8xLCBoanRlc3Rf MgorV0hFUkUKKyAgICBoanRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVSRSBoanRlc3RfMi5pZCA9 IDEpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNFTEVDVCBoanRlc3RfMi5j KjUpCisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAKKyAgICBBTkQgKFNFTEVD VCBoanRlc3RfMi5jICogNSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5hIDw+IGhqdGVzdF8yLmI7 CisKK0VYUExBSU4gKENPU1RTIE9GRiwgVkVSQk9TRSkKK1NFTEVDVCBoanRlc3RfMS5hIGExLCBo anRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxlb2lkOjpyZWdjbGFzcyB0MSwgaGp0ZXN0XzIudGFi bGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhqdGVzdF8yLCBoanRlc3RfMQorV0hFUkUKKyAgICBo anRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVSRSBoanRlc3RfMi5pZCA9IDEpCisgICAgQU5EIChT RUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNFTEVDVCBoanRlc3RfMi5jKjUpCisgICAgQU5EIChT RUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAKKyAgICBBTkQgKFNFTEVDVCBoanRlc3RfMi5jICog NSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5hIDw+IGhqdGVzdF8yLmI7CisKK1NFTEVDVCBoanRl c3RfMS5hIGExLCBoanRlc3RfMi5hIGEyLGhqdGVzdF8xLnRhYmxlb2lkOjpyZWdjbGFzcyB0MSwg aGp0ZXN0XzIudGFibGVvaWQ6OnJlZ2NsYXNzIHQyCitGUk9NIGhqdGVzdF8yLCBoanRlc3RfMQor V0hFUkUKKyAgICBoanRlc3RfMS5pZCA9IChTRUxFQ1QgMSBXSEVSRSBoanRlc3RfMi5pZCA9IDEp CisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpID0gKFNFTEVDVCBoanRlc3RfMi5jKjUp CisgICAgQU5EIChTRUxFQ1QgaGp0ZXN0XzEuYiAqIDUpIDwgNTAKKyAgICBBTkQgKFNFTEVDVCBo anRlc3RfMi5jICogNSkgPCA1NQorICAgIEFORCBoanRlc3RfMS5hIDw+IGhqdGVzdF8yLmI7CisK K1JPTExCQUNLOworCistLSBWZXJpZnkgdGhhdCB3ZSBiZWhhdmUgc2FuZWx5IHdoZW4gdGhlIGlu bmVyIGhhc2gga2V5cyBjb250YWluIHBhcmFtZXRlcnMKKy0tICh0aGF0IGlzLCBvdXRlciBvciBs YXRlcmFsIHJlZmVyZW5jZXMpLiAgVGhpcyBzaXR1YXRpb24gaGFzIHRvIGRlZmVhdAorLS0gcmUt dXNlIG9mIHRoZSBpbm5lciBoYXNoIHRhYmxlIGFjcm9zcyByZXNjYW5zLgorYmVnaW47CitzZXQg bG9jYWwgZW5hYmxlX2hhc2hqb2luID0gb247CisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVj dCBpOC5xMiwgc3MuKiBmcm9tCitpbnQ4X3RibCBpOCwKK2xhdGVyYWwgKHNlbGVjdCB0MS5maXZl dGhvdXMsIGk0LmYxIGZyb20gdGVuazEgdDEgam9pbiBpbnQ0X3RibCBpNAorICAgICAgICAgb24g dDEuZml2ZXRob3VzID0gaTQuZjEraTgucTIgb3JkZXIgYnkgMSwyKSBzczsKKworc2VsZWN0IGk4 LnEyLCBzcy4qIGZyb20KK2ludDhfdGJsIGk4LAorbGF0ZXJhbCAoc2VsZWN0IHQxLmZpdmV0aG91 cywgaTQuZjEgZnJvbSB0ZW5rMSB0MSBqb2luIGludDRfdGJsIGk0CisgICAgICAgICBvbiB0MS5m aXZldGhvdXMgPSBpNC5mMStpOC5xMiBvcmRlciBieSAxLDIpIHNzOworCityb2xsYmFjazsKLS0g CjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --000000000000da7efe0627f76f8f--