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 1uMlZY-0037aY-6I for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Jun 2025 10:42:17 +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 1uMlZW-00B2oD-AW for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Jun 2025 10:42:14 +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 1uMlXh-00Ay78-8r for pgsql-hackers@lists.postgresql.org; Wed, 04 Jun 2025 10:40:22 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uMlXa-0009XR-0f for pgsql-hackers@lists.postgresql.org; Wed, 04 Jun 2025 10:40:20 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1749033610; bh=bUShlOUEQpPjIXRqJDlIQFGGoPxlebk/TRUIVJ0vJ7U=; h=Message-ID:Date:User-Agent:From:Subject:To:Cc:References: In-Reply-To:From; b=2l5WKcIS3OrwculwzFKnLhwR9jtJzycZ+H8F1zuDe51vCsrsIjeZHrn+n9NKcI5nn wBCAigAxYBJnoZoOcEj6z4tpmaoRVpy38lChR2sBJySO3eU0vmzQ/lh8iqMuXIn949 BOBFDKe5jFXuUKpXVMPfUs139i3WsKL+eO1G91NjPK1vhPwPPvczL7NKaKvWhFs+cC 36AppYnO4iIvy/d2Xw1IrTISh91kb2gr1ouPvwkSDv/vYcm+0QpJx3dpTrlDJ9m45o /EypyRauJp1cimVZxQHUkVCBgSQigfBYkwvVKRyTJ6mXUddeUnyEMEGEtFeU+48QOP EX2BPFcLZTbyw== Received: from [10.0.85.1] (unknown [151.236.12.133]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.rybakina@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 7588B60AE0; Wed, 4 Jun 2025 13:40:09 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------yC8vzk7sBnEJcjlUuBHe61TV" Message-ID: <87a6fcbf-929a-408a-9471-28be3080254a@postgrespro.ru> Date: Wed, 4 Jun 2025 13:40:07 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird From: Alena Rybakina Subject: Re: pull-up subquery if JOIN-ON contains refs to upper-query To: Ilia Evdokimov , PostgreSQL Hackers , Peter Petrov , David Rowley Cc: Ranier Vilela References: <0b1f670d-b39d-4966-bf32-f0d502ebc564@postgrespro.ru> <46bc4eaf-58c5-42ab-8041-d3380a0768de@postgrespro.ru> <9b041978-06e3-4a50-8a5d-dacbb054f23e@tantorlabs.com> <8d7cbbf6-ddc0-4696-8af2-a68d740e14f2@postgrespro.ru> <6078f7e1-4b29-4b31-bd28-b84149e404e4@postgrespro.ru> <975a3736-a8b5-49b3-8009-4d4e86867aa1@postgrespro.ru> <0adbf75a-2059-4bb7-b878-c33892dbc1f0@tantorlabs.com> <300d7bb0-345c-4c0b-a0ef-4de573fcc94b@postgrespro.ru> <32446f52-1b18-499a-a77b-d6b66ad0f4cf@tantorlabs.com> Content-Language: en-US In-Reply-To: <32446f52-1b18-499a-a77b-d6b66ad0f4cf@tantorlabs.com> X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2025/06/04 07:04:00 #27536071 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------yC8vzk7sBnEJcjlUuBHe61TV Content-Type: multipart/alternative; boundary="------------8z1ACqt9u8qReC3CtzA9B44U" --------------8z1ACqt9u8qReC3CtzA9B44U Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, all! I updated the patch and it looks nice. All the problems have been solved. On 03.04.2025 16:56, Ilia Evdokimov wrote: > > On 02.04.2025 19:39, Alena Rybakina wrote: >> >> I see that I need to add a walker that, when traversing the tree, >> determines whether there are conditions under which pull-up is >> impossible - the presence of >> volatility of functions and other restrictions, and leave the >> transformation for the var objects that I added before, I described >> it here. >> > > I have some concerns about pulling up every clause from the subquery > with one column. In particular, not every clause is safe or beneficial > to pull up: OR-clauses, CASE expressions, nested sublinks could > significantly change how the planner estimates the number of rows or > applies filters, especially when they are not true join predicates. > Pulling them up might lead to worse plans, or even change the > semantics in subtle ways. I think before applying such > transformations, we should make sure they are not only safe but > actually improve the resulting plan. There may indeed be cases where a query plan without pull-up is worse than with pull-up. For example, as shown below, with pull-up we don't need to scan two tables and perform a join, since the subquery returns 0 rows (no matching tuples in the inner sequential scan in a parameterized Nested Loop). However, this cannot be detected at the current planning stage - we simply don't have that information yet. Do you have any ideas on how to solve this problem? So far, the only approach I see is to try an alternative plan but I'm still learning this. For example: create table t(x int); create table t1(x int); create table t2(x int); insert into t2 select id from generate_series(20001,30000) as id; insert into t1 select id from generate_series(10001,20000) as id; insert into t select id from generate_series(1,10000) as id; vacuum analyze; explain analyze select * from t where exists (select * from t1 join t2 on t.x = t1.x); with my patch:                                                                QUERY PLAN ----------------------------------------------------------------------------------------------------------------------------------------  Hash Join  (cost=1500540.00..1500822.50 rows=10000 width=4) (actual time=70694.658..70694.662 rows=0.00 loops=1)    Hash Cond: (t.x = t1.x)    Buffers: shared hit=135 *->* *Seq Scan on t*  (cost=0.00..145.00 rows=10000 width=4) (actual time=0.009..1.545 *rows=10000.00* loops=1)          Buffers: shared hit=45    ->  Hash  (cost=1500415.00..1500415.00 rows=10000 width=4) (actual time=70690.524..70690.526 rows=10000.00 loops=1)          Buckets: 16384  Batches: 1  Memory Usage: 480kB          Buffers: shared hit=90          ->  HashAggregate  (cost=1500315.00..1500415.00 rows=10000 width=4) (actual time=70683.143..70686.590 rows=10000.00 loops=1)                Group Key: t1.x                Batches: 1  Memory Usage: 793kB                Buffers: shared hit=90 *->* *Nested Loop* (cost=0.00..1250315.00 rows=100000000 width=4) (actual time=0.019..25650.447 *rows=100000000.00* loops=1)                      Buffers: shared hit=90 *->  Seq Scan on t1* (cost=0.00..145.00 rows=10000 width=4) (actual time=0.006..4.931 *rows=10000.00* loops=1)                            Buffers: shared hit=45                      ->  Materialize  (cost=0.00..195.00 rows=10000 width=0) (actual time=0.000..0.875 rows=10000.00 loops=10000)                            Storage: Memory  Maximum Storage: 519kB                            Buffers: shared hit=45                            ->  Seq Scan on t2  (cost=0.00..145.00 rows=10000 width=0) (actual time=0.007..1.246 rows=10000.00 loops=1)                                  Buffers: shared hit=45  Planning:    Buffers: shared hit=36 read=3  Planning Time: 0.375 ms *Execution Time: 70695.154 ms* without my patch:                                                         QUERY PLAN --------------------------------------------------------------------------------------------------------------------------- *Seq Scan on t*  (cost=0.00..309.30 rows=5738 width=4) (actual time=68268.562..68268.565 *rows=0.00* loops=1)    Filter: EXISTS(SubPlan 1)    Rows Removed by Filter: 10000    Buffers: shared hit=900045    SubPlan 1      -> *Nested Loop*  (cost=0.00..8524.27 rows=654075 width=0) (actual time=6.823..6.823 *rows=0.00* loops=10000)            Buffers: shared hit=900000            ->  Seq Scan on t2  (cost=0.00..159.75 rows=11475 width=0) (actual time=0.011..1.660 rows=10000.00 loops=10000)                  Buffers: shared hit=450000            ->  Materialize  (cost=0.00..188.72 rows=57 width=0) (actual time=0.000..0.000 rows=0.00 loops=100000000)                  Storage: Memory  Maximum Storage: 17kB                  Buffers: shared hit=450000                  ->  Seq Scan on t1  (cost=0.00..188.44 rows=57 width=0) (actual time=2.403..2.403 *rows=0.00* loops=10000)                        Filter: (t.x = x)                        Rows Removed by Filter: 10000                        Buffers: shared hit=450000  Planning:    Buffers: shared hit=40 read=16  Planning Time: 0.487 ms  Execution Time: *68268.600 ms* -- Regards, Alena Rybakina Postgres Professional --------------8z1ACqt9u8qReC3CtzA9B44U Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi, all! I updated the patch and it looks nice. All the problems have been solved.

On 03.04.2025 16:56, Ilia Evdokimov wrote:

On 02.04.2025 19:39, Alena Rybakina wrote:

I see that I need to add a walker that, when traversing the tree, determines whether there are conditions under which pull-up is impossible - the presence of
volatility of functions and other restrictions, and leave the transformation for the var objects that I added before, I described it here.


I have some concerns about pulling up every clause from the subquery with one column. In particular, not every clause is safe or beneficial to pull up: OR-clauses, CASE expressions, nested sublinks could significantly change how the planner estimates the number of rows or applies filters, especially when they are not true join predicates. Pulling them up might lead to worse plans, or even change the semantics in subtle ways. I think before applying such transformations, we should make sure they are not only safe but actually improve the resulting plan.

There may indeed be cases where a query plan without pull-up is worse than with pull-up. 

For example, as shown below, with pull-up we don't need to scan two tables and perform a join, since the subquery returns 0 rows (no matching tuples in the inner sequential scan in a parameterized Nested Loop).
However, this cannot be detected at the current planning stage - we simply don't have that information yet. 

Do you have any ideas on how to solve this problem? So far, the only approach I see is to try an alternative plan but I'm still learning this.

For example:


create table t(x int);
create table t1(x int);
create table t2(x int);

insert into t2 select id from generate_series(20001,30000) as id;
insert into t1 select id from generate_series(10001,20000) as id;
insert into t select id from generate_series(1,10000) as id;
vacuum analyze;
explain analyze select * from t where exists (select * from t1 join t2 on t.x = t1.x);

with my patch:
                                                               QUERY PLAN                                                               
----------------------------------------------------------------------------------------------------------------------------------------
 Hash Join  (cost=1500540.00..1500822.50 rows=10000 width=4) (actual time=70694.658..70694.662 rows=0.00 loops=1)
   Hash Cond: (t.x = t1.x)
   Buffers: shared hit=135
   ->  Seq Scan on t  (cost=0.00..145.00 rows=10000 width=4) (actual time=0.009..1.545 rows=10000.00 loops=1)
         Buffers: shared hit=45
   ->  Hash  (cost=1500415.00..1500415.00 rows=10000 width=4) (actual time=70690.524..70690.526 rows=10000.00 loops=1)
         Buckets: 16384  Batches: 1  Memory Usage: 480kB
         Buffers: shared hit=90
         ->  HashAggregate  (cost=1500315.00..1500415.00 rows=10000 width=4) (actual time=70683.143..70686.590 rows=10000.00 loops=1)
               Group Key: t1.x
               Batches: 1  Memory Usage: 793kB
               Buffers: shared hit=90
               ->  Nested Loop  (cost=0.00..1250315.00 rows=100000000 width=4) (actual time=0.019..25650.447 rows=100000000.00 loops=1)
                     Buffers: shared hit=90
                     ->  Seq Scan on t1  (cost=0.00..145.00 rows=10000 width=4) (actual time=0.006..4.931 rows=10000.00 loops=1)
                           Buffers: shared hit=45
                     ->  Materialize  (cost=0.00..195.00 rows=10000 width=0) (actual time=0.000..0.875 rows=10000.00 loops=10000)
                           Storage: Memory  Maximum Storage: 519kB
                           Buffers: shared hit=45
                           ->  Seq Scan on t2  (cost=0.00..145.00 rows=10000 width=0) (actual time=0.007..1.246 rows=10000.00 loops=1)
                                 Buffers: shared hit=45
 Planning:
   Buffers: shared hit=36 read=3
 Planning Time: 0.375 ms
 Execution Time: 70695.154 ms


without my patch:

                                                        QUERY PLAN                                                         
---------------------------------------------------------------------------------------------------------------------------
 Seq Scan on t  (cost=0.00..309.30 rows=5738 width=4) (actual time=68268.562..68268.565 rows=0.00 loops=1)
   Filter: EXISTS(SubPlan 1)
   Rows Removed by Filter: 10000
   Buffers: shared hit=900045
   SubPlan 1
     ->  Nested Loop  (cost=0.00..8524.27 rows=654075 width=0) (actual time=6.823..6.823 rows=0.00 loops=10000)
           Buffers: shared hit=900000
           ->  Seq Scan on t2  (cost=0.00..159.75 rows=11475 width=0) (actual time=0.011..1.660 rows=10000.00 loops=10000)
                 Buffers: shared hit=450000
           ->  Materialize  (cost=0.00..188.72 rows=57 width=0) (actual time=0.000..0.000 rows=0.00 loops=100000000)
                 Storage: Memory  Maximum Storage: 17kB
                 Buffers: shared hit=450000
                 ->  Seq Scan on t1  (cost=0.00..188.44 rows=57 width=0) (actual time=2.403..2.403 rows=0.00 loops=10000)
                       Filter: (t.x = x)
                       Rows Removed by Filter: 10000
                       Buffers: shared hit=450000
 Planning:
   Buffers: shared hit=40 read=16
 Planning Time: 0.487 ms
 Execution Time: 68268.600 ms


-- 
Regards,
Alena Rybakina
Postgres Professional
--------------8z1ACqt9u8qReC3CtzA9B44U-- --------------yC8vzk7sBnEJcjlUuBHe61TV Content-Type: text/x-patch; charset=UTF-8; name="v4-0001-Teach-the-planner-to-convert-EXISTS-and-NOT-EXISTS-s.patch" Content-Disposition: attachment; filename*0="v4-0001-Teach-the-planner-to-convert-EXISTS-and-NOT-EXISTS-s"; filename*1=".patch" Content-Transfer-Encoding: base64 RnJvbSA5NDdiNTI1MWJjMmFmYjJkZmIyMjUzMTZiNzk2YWUxZTA5MTVkOTU3IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbGVuYSBSeWJha2luYSA8YS5yeWJha2luYUBwb3N0 Z3Jlc3Byby5ydT4KRGF0ZTogVHVlLCAzIEp1biAyMDI1IDE4OjQ0OjExICswMzAwClN1Ympl Y3Q6IFtQQVRDSF0gVGVhY2ggdGhlIHBsYW5uZXIgdG8gY29udmVydCBFWElTVFMgYW5kIE5P VCBFWElTVFMgc3VicXVlcmllcwogaW50byBzZW1pIGFuZCBhbnRpIGpvaW5zLiBUbyBkbyB0 aGlzLCB3ZSBwdXQgYWxsIHBvdGVudGlhbCBleHByZXNzaW9ucyBmcm9tCiB0aGUgcXVhbCBs aXN0IGFuZCBqb2luIGxpc3QgaW50byB0aGUgY29tbW9uIGxpc3QgYW5kIGNoZWNrIGVhY2gg ZXhwcmVzc2lvbgogb25lIGJ5IG9uZSB0byBzZWUgaWYgdGhleSBhcmUgc3VpdGFibGUgZm9y IHRyYW5zZm9ybWF0aW9uLgoKQXV0aG9yczogQWxlbmEgUnliYWtpbmEgPGxlbmEucmliYWNr aW5hQHlhbmRleC5ydT4KUmV2aWV3ZWQtYnk6IFJhbmllciBWaWxlbGEgPHJhbmllci52ZkBn bWFpbC5jb20+LCBJbGlhIEV2ZG9raW1vdiA8aWx5YS5ldmRva2ltb3ZAdGFudG9ybGFicy5j b20+LAoJICAgICBQZXRlciBQZXRyb3YgPHAucGV0cm92QHBvc3RncmVzcHJvLnJ1PgotLS0K IHNyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jICB8IDExMyArKysrLQog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0IHwgNjM3ICsrKysrKysr KysrKysrKysrKysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Vic2VsZWN0LnNxbCAg ICAgIHwgMzY3ICsrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDEwOTUgaW5zZXJ0 aW9ucygrKSwgMjIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BsYW4vc3Vic2VsZWN0LmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9z dWJzZWxlY3QuYwppbmRleCBlN2NiM2ZlZGU2Ni4uZDZkMzVkMzQzMGQgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jCisrKyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci9wbGFuL3N1YnNlbGVjdC5jCkBAIC0xNDU4LDYgKzE0NTgsMTAgQEAg Y29udmVydF9FWElTVFNfc3VibGlua190b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJM aW5rICpzdWJsaW5rLAogCWludAkJCXZhcm5vOwogCVJlbGlkcwkJY2xhdXNlX3Zhcm5vczsK IAlSZWxpZHMJCXVwcGVyX3Zhcm5vczsKKwlMaXN0Q2VsbCAqbGM7CisJTGlzdCAqbmV3V2hl cmUgPSBOSUw7CisJTGlzdCAqYWxsX2NsYXVzZXMgPSBOSUw7CisJYm9vbCB1cHBlcl9yZWZl cmVuY2VfZXhpc3RzID0gZmFsc2U7CiAKIAlBc3NlcnQoc3VibGluay0+c3ViTGlua1R5cGUg PT0gRVhJU1RTX1NVQkxJTkspOwogCkBAIC0xNDg3LDMyICsxNDkxLDcxIEBAIGNvbnZlcnRf RVhJU1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3Vi bGluaywKIAlpZiAoIXNpbXBsaWZ5X0VYSVNUU19xdWVyeShyb290LCBzdWJzZWxlY3QpKQog CQlyZXR1cm4gTlVMTDsKIAotCS8qCi0JICogU2VwYXJhdGUgb3V0IHRoZSBXSEVSRSBjbGF1 c2UuICAoV2UgY291bGQgdGhlb3JldGljYWxseSBhbHNvIHJlbW92ZQotCSAqIHRvcC1sZXZl bCBwbGFpbiBKT0lOL09OIGNsYXVzZXMsIGJ1dCBpdCdzIHByb2JhYmx5IG5vdCB3b3J0aCB0 aGUKLQkgKiB0cm91YmxlLikKLQkgKi8KLQl3aGVyZUNsYXVzZSA9IHN1YnNlbGVjdC0+am9p bnRyZWUtPnF1YWxzOworCWlmIChzdWJzZWxlY3QtPmpvaW50cmVlLT5xdWFscykKKwkJYWxs X2NsYXVzZXMgPSBsYXBwZW5kKGFsbF9jbGF1c2VzLCBzdWJzZWxlY3QtPmpvaW50cmVlLT5x dWFscyk7CisKIAlzdWJzZWxlY3QtPmpvaW50cmVlLT5xdWFscyA9IE5VTEw7CiAKLQkvKgot CSAqIFRoZSByZXN0IG9mIHRoZSBzdWItc2VsZWN0IG11c3Qgbm90IHJlZmVyIHRvIGFueSBW YXJzIG9mIHRoZSBwYXJlbnQKLQkgKiBxdWVyeS4gIChWYXJzIG9mIGhpZ2hlciBsZXZlbHMg c2hvdWxkIGJlIG9rYXksIHRob3VnaC4pCi0JICovCi0JaWYgKGNvbnRhaW5fdmFyc19vZl9s ZXZlbCgoTm9kZSAqKSBzdWJzZWxlY3QsIDEpKQotCQlyZXR1cm4gTlVMTDsKKwkvKiBHYXRo ZXIgYWxsIGNsYXVzZXMgaW4gbWFpbiBsaXN0IGZvciB0aGUgZnVydGhlciBjb25zaWRlcmF0 aW9uICovCisJYWxsX2NsYXVzZXMgPSBsaXN0X2NvbmNhdChhbGxfY2xhdXNlcywgc3Vic2Vs ZWN0LT5qb2ludHJlZS0+ZnJvbWxpc3QpOwogCiAJLyoKLQkgKiBPbiB0aGUgb3RoZXIgaGFu ZCwgdGhlIFdIRVJFIGNsYXVzZSBtdXN0IGNvbnRhaW4gc29tZSBWYXJzIG9mIHRoZQotCSAq IHBhcmVudCBxdWVyeSwgZWxzZSBpdCdzIG5vdCBnb25uYSBiZSBhIGpvaW4uCisJICogV2Ug d2lsbCBhYmxlIHRvIHJlbW92ZSB0b3AtbGV2ZWwgcGxhaW4gSk9JTi9PTiBjbGF1c2VzIGlm IHRoZXkgYXJlIG5vdCBvdXRlciBqb2luLgogCSAqLwotCWlmICghY29udGFpbl92YXJzX29m X2xldmVsKHdoZXJlQ2xhdXNlLCAxKSkKLQkJcmV0dXJuIE5VTEw7CisJZm9yZWFjaCAobGMs IGFsbF9jbGF1c2VzKQorCXsKKwkJTm9kZSAqamUgPSAoKE5vZGUgKikgbGZpcnN0KGxjKSk7 CisKKwkJd2hlcmVDbGF1c2UgPSBjb3B5T2JqZWN0KGplKTsKKworCQlpZiAoSXNBKHdoZXJl Q2xhdXNlLCBSYW5nZVRibFJlZikpCisJCQljb250aW51ZTsKKworCQlpZiAoSXNBKHdoZXJl Q2xhdXNlLCBKb2luRXhwcikpCisJCXsKKwkJCWlmICgoKEpvaW5FeHByICopIHdoZXJlQ2xh dXNlKS0+am9pbnR5cGUgIT0gSk9JTl9JTk5FUikKKwkJCXsKKwkJCQkvKgorCSAJCQkgKiBD bGF1c2VzIG11c3Qgbm90IHJlZmVyIHRvIGFueSBWYXJzIG9mIHRoZSBwYXJlbnQKKwkgCQkJ ICogcXVlcnkuICAoVmFycyBvZiBoaWdoZXIgbGV2ZWxzIHNob3VsZCBiZSBva2F5LCB0aG91 Z2guKQorCSAJCQkgKi8KKwkJCQlpZiAoY29udGFpbl92YXJzX29mX2xldmVsKHdoZXJlQ2xh dXNlLCAxKSkKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJZWxzZQorCQkJCQljb250aW51ZTsK KwkJCX0KKwkJCWVsc2UgaWYgKCgoSm9pbkV4cHIgKikgd2hlcmVDbGF1c2UpLT5xdWFscyAh PSBOVUxMKQorCQkJCXdoZXJlQ2xhdXNlID0gKChKb2luRXhwciAqKSB3aGVyZUNsYXVzZSkt PnF1YWxzOworCQl9CisKKwkJLyoKKwkJKiBXZSBkb24ndCByaXNrIG9wdGltaXppbmcgaWYg dGhlIFdIRVJFIGNsYXVzZSBpcyB2b2xhdGlsZSwgZWl0aGVyLgorCQkqLworCQlpZiAoY29u dGFpbl92b2xhdGlsZV9mdW5jdGlvbnMod2hlcmVDbGF1c2UpKQorCQkJcmV0dXJuIE5VTEw7 CisKKwkJLyoKKwkJKiBDbGVhbiB1cCB0aGUgV0hFUkUgY2xhdXNlIGJ5IGRvaW5nIGNvbnN0 LXNpbXBsaWZpY2F0aW9uIGV0YyBvbiBpdC4KKwkJKi8KKwkJd2hlcmVDbGF1c2UgPSBldmFs X2NvbnN0X2V4cHJlc3Npb25zKHJvb3QsIHdoZXJlQ2xhdXNlKTsKKwkJd2hlcmVDbGF1c2Ug PSAoTm9kZSAqKSBjYW5vbmljYWxpemVfcXVhbCgoRXhwciAqKSB3aGVyZUNsYXVzZSwgZmFs c2UpOworCisJCWlmKCFJc0Eod2hlcmVDbGF1c2UsIEpvaW5FeHByKSkKKwkJCW5ld1doZXJl ID0gbGFwcGVuZChuZXdXaGVyZSwgd2hlcmVDbGF1c2UpOworCQllbHNlCisJCQlyZXR1cm4g TlVMTDsKKworCQlpZiAoY29udGFpbl92YXJzX29mX2xldmVsKChOb2RlICopIHdoZXJlQ2xh dXNlLCAxKSkKKwkJCXVwcGVyX3JlZmVyZW5jZV9leGlzdHMgPSB0cnVlOworCX0KKworCWxp c3RfZnJlZShhbGxfY2xhdXNlcyk7CiAKIAkvKgotCSAqIFdlIGRvbid0IHJpc2sgb3B0aW1p emluZyBpZiB0aGUgV0hFUkUgY2xhdXNlIGlzIHZvbGF0aWxlLCBlaXRoZXIuCisJICogVGhl cmUgYXJlIG5vIFdIRVJFIGNsYXVzZSBjb250YWluaW5nIHNvbWUgVmFycyBvZiB0aGUKKwkg KiBwYXJlbnQgcXVlcnksIHNvIGl0J3Mgbm90IGdvbm5hIGJlIGEgam9pbi4KIAkgKi8KLQlp ZiAoY29udGFpbl92b2xhdGlsZV9mdW5jdGlvbnMod2hlcmVDbGF1c2UpKQorCWlmKCF1cHBl cl9yZWZlcmVuY2VfZXhpc3RzKQogCQlyZXR1cm4gTlVMTDsKIAogCS8qCkBAIC0xNTM3LDcg KzE1ODAsNiBAQCBjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pvaW4oUGxhbm5lckluZm8g KnJvb3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJICovCiAJcnRvZmZzZXQgPSBsaXN0X2xlbmd0 aChwYXJzZS0+cnRhYmxlKTsKIAlPZmZzZXRWYXJOb2RlcygoTm9kZSAqKSBzdWJzZWxlY3Qs IHJ0b2Zmc2V0LCAwKTsKLQlPZmZzZXRWYXJOb2Rlcyh3aGVyZUNsYXVzZSwgcnRvZmZzZXQs IDApOwogCiAJLyoKIAkgKiBVcHBlci1sZXZlbCB2YXJzIGluIHN1YnF1ZXJ5IHdpbGwgbm93 IGJlIG9uZSBsZXZlbCBjbG9zZXIgdG8gdGhlaXIKQEAgLTE1NDUsNyArMTU4Nyw5IEBAIGNv bnZlcnRfRVhJU1RTX3N1YmxpbmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGlu ayAqc3VibGluaywKIAkgKiBiZWNvbWVzIGxldmVsIHplcm8uCiAJICovCiAJSW5jcmVtZW50 VmFyU3VibGV2ZWxzVXAoKE5vZGUgKikgc3Vic2VsZWN0LCAtMSwgMSk7Ci0JSW5jcmVtZW50 VmFyU3VibGV2ZWxzVXAod2hlcmVDbGF1c2UsIC0xLCAxKTsKKworCU9mZnNldFZhck5vZGVz KChOb2RlICopIG5ld1doZXJlLCBydG9mZnNldCwgMCk7CisJSW5jcmVtZW50VmFyU3VibGV2 ZWxzVXAoKE5vZGUgKikgbmV3V2hlcmUsIC0xLCAxKTsKIAogCS8qCiAJICogTm93IHRoYXQg dGhlIFdIRVJFIGNsYXVzZSBpcyBhZGp1c3RlZCB0byBtYXRjaCB0aGUgcGFyZW50IHF1ZXJ5 CkBAIC0xNTUzLDcgKzE1OTcsNyBAQCBjb252ZXJ0X0VYSVNUU19zdWJsaW5rX3RvX2pvaW4o UGxhbm5lckluZm8gKnJvb3QsIFN1YkxpbmsgKnN1YmxpbmssCiAJICogVGhlIG9uZXMgPD0g cnRvZmZzZXQgYmVsb25nIHRvIHRoZSB1cHBlciBxdWVyeTsgdGhlIG9uZXMgPiBydG9mZnNl dCBkbwogCSAqIG5vdC4KIAkgKi8KLQljbGF1c2VfdmFybm9zID0gcHVsbF92YXJub3Mocm9v dCwgd2hlcmVDbGF1c2UpOworCWNsYXVzZV92YXJub3MgPSBwdWxsX3Zhcm5vcyhyb290LCAo Tm9kZSAqKSBuZXdXaGVyZSk7CiAJdXBwZXJfdmFybm9zID0gTlVMTDsKIAl2YXJubyA9IC0x OwogCXdoaWxlICgodmFybm8gPSBibXNfbmV4dF9tZW1iZXIoY2xhdXNlX3Zhcm5vcywgdmFy bm8pKSA+PSAwKQpAQCAtMTU3MSw2ICsxNjE1LDMxIEBAIGNvbnZlcnRfRVhJU1RTX3N1Ymxp bmtfdG9fam9pbihQbGFubmVySW5mbyAqcm9vdCwgU3ViTGluayAqc3VibGluaywKIAlpZiAo IWJtc19pc19zdWJzZXQodXBwZXJfdmFybm9zLCBhdmFpbGFibGVfcmVscykpCiAJCXJldHVy biBOVUxMOwogCisJLyoKKwkgKiBJbiBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCBhdHRlbXB0LCBy ZXBsYWNlcyBpdCB3aXRoIHRoZSBjb3JyZWN0IGNvbmRpdGlvbi4KKwkgKiBXZSB3ZXJlIHN1 cmUgdGhhdCBpbm5lciByZWxhdGlvbnMgYXJlIGluZGVwZW5kZW50LCBzbyB3ZSBjb25maWRl bnRseQorCSAqIGNhbiByZXBsYWNlIHRoZWlyIGpvaW4gY29uZGl0aW9uIG9uIHRydWUuCisJ ICovCisJZm9yZWFjaChsYywgc3Vic2VsZWN0LT5qb2ludHJlZS0+ZnJvbWxpc3QpCisJewor CQlOb2RlICpub2RlID0gbGZpcnN0KGxjKTsKKworCQlpZiAoSXNBKG5vZGUsIFJhbmdlVGJs UmVmKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgoSXNBKG5vZGUsIEpvaW5FeHByKSAmJiAo KEpvaW5FeHByICopbm9kZSktPmpvaW50eXBlICE9IEpPSU5fSU5ORVIpKQorCQkJY29udGlu dWU7CisKKwkJaWYgKElzQShub2RlLCBKb2luRXhwcikgJiYgKChKb2luRXhwciAqKSBub2Rl KS0+cXVhbHMgIT0gTlVMTCkKKwkJCSgoSm9pbkV4cHIgKikgbm9kZSktPnF1YWxzID0gKE5v ZGUgKikgbWFrZUNvbnN0KEJPT0xPSUQsCisJCQkJCQkJCQkJCQkJCQkJLTEsCisJCQkJCQkJ CQkJCQkJCQkJSW52YWxpZE9pZCwKKwkJCQkJCQkJCQkJCQkJCQlzaXplb2YoYm9vbCksCisJ CQkJCQkJCQkJCQkJCQkJKERhdHVtKSAxLAorCQkJCQkJCQkJCQkJCQkJCWZhbHNlLAorCQkJ CQkJCQkJCQkJCQkJCXRydWUpOworCX0KKwogCS8qCiAJICogTm93IHdlIGNhbiBhdHRhY2gg dGhlIG1vZGlmaWVkIHN1YnF1ZXJ5IHJ0YWJsZSB0byB0aGUgcGFyZW50LiBUaGlzIGFsc28K IAkgKiBhZGRzIHN1YnF1ZXJ5J3MgUlRFUGVybWlzc2lvbkluZm9zIGludG8gdGhlIHVwcGVy IHF1ZXJ5LgpAQCAtMTU5Miw3ICsxNjYxLDcgQEAgY29udmVydF9FWElTVFNfc3VibGlua190 b19qb2luKFBsYW5uZXJJbmZvICpyb290LCBTdWJMaW5rICpzdWJsaW5rLAogCQlyZXN1bHQt PnJhcmcgPSAoTm9kZSAqKSBzdWJzZWxlY3QtPmpvaW50cmVlOwogCXJlc3VsdC0+dXNpbmdD bGF1c2UgPSBOSUw7CiAJcmVzdWx0LT5qb2luX3VzaW5nX2FsaWFzID0gTlVMTDsKLQlyZXN1 bHQtPnF1YWxzID0gd2hlcmVDbGF1c2U7CisJcmVzdWx0LT5xdWFscyA9IChOb2RlICopIG1h a2VfYW5kc19leHBsaWNpdChuZXdXaGVyZSk7CiAJcmVzdWx0LT5hbGlhcyA9IE5VTEw7CiAJ cmVzdWx0LT5ydGluZGV4ID0gMDsJCS8qIHdlIGRvbid0IG5lZWQgYW4gUlRFIGZvciBpdCAq LwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5v dXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQKaW5kZXggNDBk ODA1NmZjZWEuLjk2NWM2MDliMDQ1IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3N1YnNlbGVjdC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9z dWJzZWxlY3Qub3V0CkBAIC04MTMsNiArODEzLDY0MyBAQCB3aGVyZSBleGlzdHMgKAogICB3 aGVyZSByb2FkLm5hbWUgPSBzcy5mMSApOwogcm9sbGJhY2s7CiAtLQorLS0gVGVzdCBjYXNl IGZvciBleGlzdCBzdWJsaW5rIHdoZXJlIHdlIGNhbiBjb25zaWRlciBzb21lIHVuZGVwZW5k ZW50IGV4cHJlc3Npb24KKy0tIHdpdGggb3V0ZXIgbGluaworLS0KK0VYUExBSU4gKENPU1RT IE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQor ICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGEuaWQgPSB0Yi5pZAorKTsKKyAgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1p IEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiB0YQorICAgLT4gIE5lc3RlZCBMb29wCisgICAg ICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIKKyAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlkKQorICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHRjCisoNiByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJP TSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRj IE9OIHRhLmlkID0gdGMuaWQKKyk7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgU2VxIFNj YW4gb24gdGEKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIEluZGV4IE9ubHkg U2NhbiB1c2luZyB0Y19wa2V5IG9uIHRjCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAo aWQgPSB0YS5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YgorKDYgcm93cykKKwor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAo CisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiAxID0gMQorICBXSEVSRSB0 YS5pZCA9IHRjLmlkCispOworICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9u IHRhCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4g dXNpbmcgdGNfcGtleSBvbiB0YworICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0g dGEuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIKKyg2IHJvd3MpCisKKy0tIEpv aW4gY29tcG91bmQgZXhwcmVzc2lvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEK K0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9J TiB0YyBPTiB0YS5pZCA9IHRjLmlkCisgICAgICAgICAgIEFORCB0YS5pZCA9IHRiLmlkCisp OworICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoIFJpZ2h0IFNlbWkgSm9pbgorICAgSGFz aCBDb25kOiAodGMuaWQgPSB0YS5pZCkKKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgIEhh c2ggQ29uZDogKHRiLmlkID0gdGMuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIK KyAgICAgICAgIC0+ICBIYXNoCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMK KyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGEKKyg5IHJvd3MpCisK K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhIHRhMQorV0hFUkUgRVhJ U1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRiLmF2YWwgPSB0 Yy5haWQKKyAgICAgICAgICAgQU5EIHRiLmF2YWwgPSB0YTEuaWQKKyk7CisgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2lu CisgICBIYXNoIENvbmQ6ICh0YTEuaWQgPSB0Yi5hdmFsKQorICAgLT4gIFNlcSBTY2FuIG9u IHRhIHRhMQorICAgLT4gIEhhc2gKKyAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAg ICAgICAgICAgICBHcm91cCBLZXk6IHRiLmF2YWwKKyAgICAgICAgICAgICAgIC0+ICBNZXJn ZSBKb2luCisgICAgICAgICAgICAgICAgICAgICBNZXJnZSBDb25kOiAodGIuYXZhbCA9IHRj LmFpZCkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTb3J0CisgICAgICAgICAgICAgICAg ICAgICAgICAgICBTb3J0IEtleTogdGIuYXZhbAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAgICAgICAgICAgICAgICAgICAtPiAgU29ydAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IHRjLmFpZAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjCisoMTQgcm93cykKKworRVhQ TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK0pPSU4gdGIgT04gdHJ1ZQor V0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YiB0YjEKKyAgSk9JTiB0YyBP TiB0YS5pZCA9IHRiLmlkCispOworICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cCBTZW1pIEpvaW4KKyAgIC0+ICBIYXNoIEpvaW4KKyAgICAgICAgIEhhc2ggQ29uZDogKHRh LmlkID0gdGIuaWQpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGEKKyAgICAgICAgIC0+ ICBIYXNoCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIKKyAgIC0+ICBOZXN0 ZWQgTG9vcAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiIHRiMQorICAgICAgICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKygxMCBy b3dzKQorCistLSBDb21wb3VuZCBleHByZXNzaW9uIHdpdGggY29uc3QgdHlwZSBvciBvdGhl ciB0eXBlIG9mIGV4cHJlc3Npb25zCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQor RlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lO IHRjIE9OIHRhLmlkID0gdGMuaWQKKyAgICAgICAgICAgQU5EIHRhLmlkID0gMQorKTsKKyAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQg TG9vcCBTZW1pIEpvaW4KKyAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGFfcGtleSBv biB0YQorICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkKKyAgIC0+ICBOZXN0ZWQgTG9v cAorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Y19wa2V5IG9uIHRjCisg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSAxKQorICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHRiCisoNyByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQor RlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lO IHRjIE9OIHRhLmlkID0gdGMuaWQKKyAgICAgICAgICAgQU5EIHRiLmlkID0gMQorKTsKKyAg ICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoIFJp Z2h0IFNlbWkgSm9pbgorICAgSGFzaCBDb25kOiAodGMuaWQgPSB0YS5pZCkKKyAgIC0+ICBO ZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Yl9wa2V5 IG9uIHRiCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSAxKQorICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIHRjCisgICAtPiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHRhCisoOCByb3dzKQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJP TSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBSSUdIVCBK T0lOIHRjIE9OIHRhLmlkID0gdGMuaWQKKyAgV0hFUkUgdGEudmFsID0gMQorKTsKKyAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiB0YQor ICAgRmlsdGVyOiBFWElTVFMoU3ViUGxhbiAxKQorICAgU3ViUGxhbiAxCisgICAgIC0+ICBS ZXN1bHQKKyAgICAgICAgICAgT25lLVRpbWUgRmlsdGVyOiAodGEudmFsID0gMSkKKyAgICAg ICAgICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgICAgICAgICAgICAgICBKb2lu IEZpbHRlcjogKHRhLmlkID0gdGMuaWQpCisgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiB0YworICAgICAgICAgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAg ICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisoMTAgcm93cykKKworRVhQTEFJTiAo Q09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVD VCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAgICAg IEFORCB0Yi5hdmFsID0gQU5ZICgnezF9Jzo6aW50W10pCispOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgSGFzaCBDb25kOiAo dGEuaWQgPSB0Yi5pZCkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YQorICAgLT4gIEhhc2gKKyAg ICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICBHcm91cCBLZXk6IHRi LmlkCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAgICAgICAgICAgICAgICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGIK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogKGF2YWwgPSBBTlkg KCd7MX0nOjppbnRlZ2VyW10pKQorKDExIHJvd3MpCisKKy0tIEV4aXN0cyBTdWJMaW5rIGV4 cHJlc3Npb24gd2l0aGluIGV4cHJlc3Npb24KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCAxCitGUk9NIHRhIHRhMQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0 YQorICBKT0lOIHRiIE9OIHRhLmlkID0gdGExLmlkCisgICAgICAgICAgIEFORCB0YTEudmFs ID0gMQorICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgRlJPTSB0YSB0YTIK KyAgICBXSEVSRSB0YTIuaWQgPSB0YTEuaWQKKyAgKQorKTsKKyAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4K KyAgIC0+ICBTZXEgU2NhbiBvbiB0YSB0YTIKKyAgICAgICAgIEZpbHRlcjogKHZhbCA9IDEp CisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNp bmcgdGFfcGtleSBvbiB0YQorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gdGEy LmlkKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisoNyByb3dzKQorCitFWFBMQUlO IChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YSB0YTEKK1dIRVJFIEVYSVNUUyAoCisg IFNFTEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0YiBPTiB0YS52YWwgPSB0YTEuaWQKKyAg ICAgICAgICAgQU5EIHRhMS5pZCA9IDEKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1Qg MQorICAgIEZST00gdGEgdGEyCisgICAgV0hFUkUgdGEyLmlkID0gdGEuaWQKKyAgKQorKTsK KyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBM b29wIFNlbWkgSm9pbgorICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0YV9wa2V5IG9u IHRhIHRhMQorICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gMSkKKyAgIC0+ICBOZXN0ZWQg TG9vcAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAgICAgICAtPiAgTWF0ZXJp YWxpemUKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YSB0YTIKKyAgICAgICAg ICAgICAgICAgICAgIEZpbHRlcjogKHZhbCA9IDEpCisoOCByb3dzKQorCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNU IDEKKyAgRlJPTSB0YgorICBXSEVSRSB0YS5pZCA9IHRiLmlkCisgICAgQU5EIEVYSVNUUyAo CisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0YworICAgICAgV0hFUkUgdGMuaWQgPSB0 Yi5pZAorICAgICAgICBBTkQgdGMuYWlkICsgdGIuYXZhbCA+IDAKKyAgICApCispOworICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg SGFzaCBTZW1pIEpvaW4KKyAgIEhhc2ggQ29uZDogKHRhLmlkID0gdGMuaWQpCisgICAtPiAg U2VxIFNjYW4gb24gdGEKKyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgSGFzaCBKb2luCisg ICAgICAgICAgICAgICBIYXNoIENvbmQ6ICh0Yi5pZCA9IHRjLmlkKQorICAgICAgICAgICAg ICAgSm9pbiBGaWx0ZXI6ICgodGMuYWlkICsgdGIuYXZhbCkgPiAwKQorICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIHRiCisgICAgICAgICAgICAgICAtPiAgSGFzaAorICAgICAg ICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjCisoMTAgcm93cykKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNF TEVDVCAxCisgIEZST00gdGIKKyAgV0hFUkUgdGEuaWQgPSB0Yi5pZAorICAgIEFORCBFWElT VFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGMKKyAgICAgIFdIRVJFIHRjLmlk ID0gdGIuaWQKKyAgICAgICAgQU5EIHRjLmFpZCArIHRhLnZhbCA+IDAKKyAgICApCispOwor ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgSGFzaCBDb25k OiAodGEuaWQgPSB0Yi5pZCkKKyAgIEpvaW4gRmlsdGVyOiBFWElTVFMoU3ViUGxhbiAxKQor ICAgLT4gIFNlcSBTY2FuIG9uIHRhCisgICAtPiAgSGFzaAorICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIHRiCisgICBTdWJQbGFuIDEKKyAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGNf cGtleSBvbiB0YworICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSB0Yi5pZCkKKyAgICAg ICAgICAgRmlsdGVyOiAoKGFpZCArIHRhLnZhbCkgPiAwKQorKDEwIHJvd3MpCisKKy0tIENo ZWNrIHdpdGggTlVMTCBhbmQgTk9UIE5VTEwgZXhwcmVzc2lvbnMKK0FMVEVSIFRBQkxFIHRh IEFERCBDT0xVTU4gaXNfYWN0aXZlIGJvb2w7CitVUERBVEUgdGEgU0VUIGlzX2FjdGl2ZSA9 IHRydWU7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUg RVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0g dGIuaWQKKyAgICAgICAgIEFORCBDT0FMRVNDRSh0YS5pc19hY3RpdmUsIHRydWUpCispOwor ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3Rl ZCBMb29wIFNlbWkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9uIHRhCisgICAgICAgICBGaWx0 ZXI6IENPQUxFU0NFKGlzX2FjdGl2ZSwgdHJ1ZSkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAg ICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Yl9wa2V5IG9uIHRiCisgICAgICAg ICAgICAgICBJbmRleCBDb25kOiAoaWQgPSB0YS5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2Nh biBvbiB0YworKDcgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZS T00gdGIKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0 YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAgICBBTkQgQ09BTEVTQ0UodGEuaXNfYWN0aXZl LCB0cnVlKQorKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoIEpvaW4K KyAgIEhhc2ggQ29uZDogKHRiLmlkID0gdGEuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gdGIK KyAgIC0+ICBIYXNoCisgICAgICAgICAtPiAgSGFzaEFnZ3JlZ2F0ZQorICAgICAgICAgICAg ICAgR3JvdXAgS2V5OiB0YS5pZAorICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisg ICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKyAgICAgICAgICAgICAg ICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIHRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0 ZXI6IENPQUxFU0NFKGlzX2FjdGl2ZSwgdHJ1ZSkKKygxMSByb3dzKQorCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNU IDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFO RCBDQVNFCisgICAgICAgICAgICAgICBXSEVOIHRhLmlzX2FjdGl2ZSBUSEVOIHRydWUKKyAg ICAgICAgICAgICAgIEVMU0UgZmFsc2UKKyAgICAgICAgICAgICBFTkQgPSB0cnVlCispOwor ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAtPiAgU2Vx IFNjYW4gb24gdGEKKyAgICAgICAgIEZpbHRlcjogQ0FTRSBXSEVOIGlzX2FjdGl2ZSBUSEVO IHRydWUgRUxTRSBmYWxzZSBFTkQKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4g IEluZGV4IE9ubHkgU2NhbiB1c2luZyB0Yl9wa2V5IG9uIHRiCisgICAgICAgICAgICAgICBJ bmRleCBDb25kOiAoaWQgPSB0YS5pZCkKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0Ywor KDcgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGIKK1dI RVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0YyBPTiB0YS5p ZCA9IHRiLmlkCisgICAgICAgICBBTkQgQ0FTRQorICAgICAgICAgICAgICAgV0hFTiB0YS5p c19hY3RpdmUgVEhFTiB0cnVlCisgICAgICAgICAgICAgICBFTFNFIGZhbHNlCisgICAgICAg ICAgICAgRU5EID0gdHJ1ZQorKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2ggSm9pbgorICAgSGFz aCBDb25kOiAodGIuaWQgPSB0YS5pZCkKKyAgIC0+ICBTZXEgU2NhbiBvbiB0YgorICAgLT4g IEhhc2gKKyAgICAgICAgIC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICBHcm91 cCBLZXk6IHRhLmlkCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAg ICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAgICAgICAgICAgICAgICAgICAg LT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNj YW4gb24gdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcjogQ0FT RSBXSEVOIGlzX2FjdGl2ZSBUSEVOIHRydWUgRUxTRSBmYWxzZSBFTkQKKygxMSByb3dzKQor CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RT ICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0gdGIuaWQK KyAgICAgICAgIEFORCB0YS5pc19hY3RpdmUKKyk7CisgICAgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAt PiAgU2VxIFNjYW4gb24gdGEKKyAgICAgICAgIEZpbHRlcjogaXNfYWN0aXZlCisgICAtPiAg TmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBJbmRleCBPbmx5IFNjYW4gdXNpbmcgdGJfcGtl eSBvbiB0YgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlkID0gdGEuaWQpCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gdGMKKyg3IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9G RikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBG Uk9NIHRiCisgIEpPSU4gdGMgT04gdGEuaWQgPSB0Yi5pZAorICAgICAgICAgQU5EIHRhLmlz X2FjdGl2ZSBJUyBOT1QgTlVMTAorKTsKKyAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAgIC0+ICBTZXEg U2NhbiBvbiB0YQorICAgICAgICAgRmlsdGVyOiAoaXNfYWN0aXZlIElTIE5PVCBOVUxMKQor ICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2FuIHVzaW5n IHRiX3BrZXkgb24gdGIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHRhLmlk KQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRjCisoNyByb3dzKQorCistLSBEaXNhYmxl ZCBwdWxsIHVwIGJlY2F1c2UgaXQgaXMgYXBwbGNhcGFibGUgZm9yIElOTkVSIEpPSU4gY29u bmVjdGlvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJF IEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgUklHSFQgSk9JTiB0YyBPTiB0 YS5pZCA9IHRjLmlkCispOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBT Y2FuIG9uIHRhCisgICBGaWx0ZXI6IEVYSVNUUyhTdWJQbGFuIDEpCisgICBTdWJQbGFuIDEK KyAgICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgICAgICAgICBKb2luIEZpbHRl cjogKHRhLmlkID0gdGMuaWQpCisgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0YworICAg ICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHRiCisoOCByb3dzKQorCistLSBEaXNhYmxlIHB1bGwtdXAgZHVlIHRvIGxhY2sgb2Yg dGhlIG91dGVyIHZhcgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEK K1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0 Yy5pZCA9IHRiLmlkCispOworICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBSZXN1bHQKKyAgIE9uZS1UaW1lIEZpbHRlcjogKEluaXRQbGFu IDEpLmNvbDEKKyAgIEluaXRQbGFuIDEKKyAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiB0YgorICAgICAgICAgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIHRjX3BrZXkgb24gdGMKKyAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGlk ID0gdGIuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gdGEKKyg4IHJvd3MpCisKK0NSRUFURSBU QUJMRSB0ZCAoaWQgaW50LCB0Y19pZCBieXRlYSwgdmFsIGludCk7CitJTlNFUlQgSU5UTyB0 ZAorU0VMRUNUIGcuaWQsICdUZXN0MSc6OmJ5dGVhIEFTIHRjX2lkLCA2IEFTIHZhbAorRlJP TSBnZW5lcmF0ZV9zZXJpZXMoMSwgMjUpIEFTIGcoaWQpCitVTklPTiBBTEwKK1NFTEVDVCBn LmlkLCAnVGVzdDInOjpieXRlYSBBUyB0Y19pZCwgNyBBUyB2YWwKK0ZST00gZ2VuZXJhdGVf c2VyaWVzKDI2LCA1MCkgQVMgZyhpZCkKK1VOSU9OIEFMTAorU0VMRUNUIGcuaWQsICdUZXN0 NCc6OmJ5dGVhIEFTIHRjX2lkLCA2IEFTIHZhbAorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoNTEs IDc1KSBBUyBnKGlkKQorVU5JT04gQUxMCitTRUxFQ1QgZy5pZCwgJ1Rlc3Q1Jzo6Ynl0ZWEg QVMgdGNfaWQsIDcgQVMgdmFsCitGUk9NIGdlbmVyYXRlX3Nlcmllcyg3NiwgMTAwKSBBUyBn KGlkKTsKK0NSRUFURSBUQUJMRSB0ZSAoaWQgaW50LCB0Y19pZCBieXRlYSwgdmFsIGludCk7 CitJTlNFUlQgSU5UTyB0ZSBTRUxFQ1QgKiBGUk9NIHRkOworRVhQTEFJTiAoQ09TVFMgT0ZG KQorU0VMRUNUIHQxLioKK0ZST00gdGEgdDEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAx CisgIEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAorICBKT0lOIHRi IHQyIE9OIHQyLmlkID0gdDEuaWQKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1QgMQor ICAgIEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAorICAgIEpPSU4g dGQgdDMgT04gdDMudGNfaWQgSU4gKCdUZXN0MSc6OmJ5dGVhLCAnVGVzdDInOjpieXRlYSkK KyAgICBXSEVSRSBFWElTVFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGUgdDQK KyAgICAgIFdIRVJFIHQ0LnRjX2lkID0gdDMudGNfaWQKKyAgICAgICAgQU5EIHQ0LnZhbCA9 IHQyLmF2YWwKKyAgICApID0gRVhJU1RTICgKKyAgICAgIFNFTEVDVCAxCisgICAgICBGUk9N IHRjIHQ1CisgICAgICBXSEVSRSB0NS5pZCA9IHQzLmlkCisgICAgKQorICApCispOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIFNlbWkgSm9pbgorICAg TWVyZ2UgQ29uZDogKHQxLmlkID0gdDIuaWQpCisgICAtPiAgSW5kZXggU2NhbiB1c2luZyB0 YV9wa2V5IG9uIHRhIHQxCisgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAgICAg ICBKb2luIEZpbHRlcjogKChBTlkgKCh0My50Y19pZCA9IChoYXNoZWQgU3ViUGxhbiAyKS5j b2wxKSBBTkQgKHQyLmF2YWwgPSAoaGFzaGVkIFN1YlBsYW4gMikuY29sMikpKSA9IChBTlkg KHQzLmlkID0gKGhhc2hlZCBTdWJQbGFuIDQpLmNvbDEpKSkKKyAgICAgICAgIC0+ICBJbmRl eCBTY2FuIHVzaW5nIHRiX3BrZXkgb24gdGIgdDIKKyAgICAgICAgIC0+ICBNYXRlcmlhbGl6 ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRkIHQzCisgICAgICAgICAgICAg ICAgICAgICBGaWx0ZXI6ICh0Y19pZCA9IEFOWSAoJ3siXFx4NTQ2NTczNzQzMSIsIlxceDU0 NjU3Mzc0MzIifSc6OmJ5dGVhW10pKQorICAgICAgICAgU3ViUGxhbiAyCisgICAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiB0ZSB0NAorICAgICAgICAgU3ViUGxhbiA0CisgICAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiB0YyB0NQorKDEzIHJvd3MpCisKK0RST1AgVEFCTEUgdGQsIHRl OworQ1JFQVRFIFRBQkxFIHRzdDEgKGlkIGludCwgbWVzIHZhcmNoYXIoMjApKTsKK0NSRUFU RSBUQUJMRSB0c3QyIChpZCBpbnQsIHRzdDFfaWQgaW50LCB0eXBlX2lkIGludCk7CitDUkVB VEUgVEFCTEUgdHN0MyAoaWQgYnl0ZWEpOworQ1JFQVRFIFRBQkxFIHRzdDQgKGlkIGludCwg dHN0M19pZCBieXRlYSwgdHlwZV9pZCBpbnQpOworQ1JFQVRFIFRBQkxFIHRzdDUgKGlkIGlu dCwgdHN0M19pZCBieXRlYSwgdHlwZV9pZCBpbnQpOworSU5TRVJUIElOVE8gdHN0MSBWQUxV RVMgKDEsICd0ZXN0MScpOworSU5TRVJUIElOVE8gdHN0MSBWQUxVRVMgKDIsICd0ZXN0Micp OworSU5TRVJUIElOVE8gdHN0MSBWQUxVRVMgKDMsICd0ZXN0MycpOworSU5TRVJUIElOVE8g dHN0MiBWQUxVRVMgKDEsIDIsIDcpOworSU5TRVJUIElOVE8gdHN0MiBWQUxVRVMgKDEsIDIs IDYpOworSU5TRVJUIElOVE8gdHN0MiBWQUxVRVMgKDIsIDMsIDcpOworSU5TRVJUIElOVE8g dHN0MworU0VMRUNUICgnVGVzdCcgfHwgZy5pZCk6OmJ5dGVhIEFTIGlkCisgICBGUk9NIGdl bmVyYXRlX3NlcmllcygxLCA1KSBBUyBnKGlkKTsKK0lOU0VSVCBJTlRPIHRzdDQKKyhTRUxF Q1QgZy5pZCwgJ1Rlc3QxJzo6Ynl0ZWEgQVMgdHN0M19pZCwgNiBBUyB0eXBlX2lkCisgICBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCAyNSkgQVMgZyhpZCkpCitVTklPTiBBTEwKKyhTRUxF Q1QgZy5pZCwgJ1Rlc3QyJzo6Ynl0ZWEgQVMgdHN0M19pZCwgNyBBUyB0eXBlX2lkCisgICBG Uk9NIGdlbmVyYXRlX3NlcmllcygyNiwgNTApIEFTIGcoaWQpKQorVU5JT04gQUxMCisoU0VM RUNUIGcuaWQsICdUZXN0NCc6OmJ5dGVhIEFTIHRzdDNfaWQsIDYgQVMgdHlwZV9pZAorICAg RlJPTSBnZW5lcmF0ZV9zZXJpZXMoNTEsIDc1KSBBUyBnKGlkKSkKK1VOSU9OIEFMTAorKFNF TEVDVCBnLmlkLCAnVGVzdDUnOjpieXRlYSBBUyB0c3QzX2lkLCA3IEFTIHR5cGVfaWQKKyAg IEZST00gZ2VuZXJhdGVfc2VyaWVzKDc2LCAxMDApIEFTIGcoaWQpKTsKK0lOU0VSVCBJTlRP IHRzdDUgU0VMRUNUICogRlJPTSB0c3Q0OworVkFDVVVNIChBTkFMWVpFKSB0c3QxLCB0c3Qy LCB0c3QzLCB0c3Q0LCB0c3Q1OworLS0gQ2FzZSB3aXRoIHR3byBleGlzdHMgaW4gT3BFeHBy LCBpbiB0aGUgZmlyc3Qgb25lIHQzLmlkIGlzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHBhcmVu dCBxdWVyeQorLS0gYW5kIHQyLnR5cGUtaWQgaXMgdGhlIHJlZmVyZW5jZSB0byBncmFuZHBh cmVudCBxdWVyeQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQxLioKK0ZST00gdHN0 MSB0MQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSAoU0VMRUNUIDEgQVMg U0RCTF9EVU1NWSkgU0RCTF9EVUFMCisgIEpPSU4gdHN0MiB0MiBPTiB0Mi50c3QxX2lkID0g dDEuaWQKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAgIEZST00gKFNFTEVD VCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAorICAgIEpPSU4gdHN0MyB0MyBPTiB0My5p ZCBJTiAoJ1Rlc3QxJzo6Ynl0ZWEsICdUZXN0Mic6OmJ5dGVhKQorICAgIFdIRVJFIEVYSVNU UyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0c3Q0IHQ0CisgICAgICBXSEVSRSB0 NC50c3QzX2lkID0gdDMuaWQKKyAgICAgICAgQU5EIHQ0LnR5cGVfaWQgPSB0Mi50eXBlX2lk CisgICAgKSA9IEVYSVNUUyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0c3Q1IHQ1 CisgICAgICBXSEVSRSB0NS50c3QzX2lkID0gdDMuaWQKKyAgICApCisgICkKKyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIEhhc2ggUmlnaHQgU2VtaSBKb2luCisgICBIYXNoIENvbmQ6ICh0Mi50 c3QxX2lkID0gdDEuaWQpCisgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICAgICAg ICBKb2luIEZpbHRlcjogKEVYSVNUUyhTdWJQbGFuIDEpID0gRVhJU1RTKFN1YlBsYW4gMykp CisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdHN0MiB0MgorICAgICAgICAgLT4gIE1hdGVy aWFsaXplCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdHN0MyB0MworICAgICAg ICAgICAgICAgICAgICAgRmlsdGVyOiAoaWQgPSBBTlkgKCd7IlxceDU0NjU3Mzc0MzEiLCJc XHg1NDY1NzM3NDMyIn0nOjpieXRlYVtdKSkKKyAgICAgICAgIFN1YlBsYW4gMQorICAgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gdHN0NCB0NAorICAgICAgICAgICAgICAgICBGaWx0ZXI6 ICgodHN0M19pZCA9IHQzLmlkKSBBTkQgKHR5cGVfaWQgPSB0Mi50eXBlX2lkKSkKKyAgICAg ICAgIFN1YlBsYW4gMworICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdHN0NSB0NQorICAg ICAgICAgICAgICAgICBGaWx0ZXI6ICh0c3QzX2lkID0gdDMuaWQpCisgICAtPiAgSGFzaAor ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRzdDEgdDEKKygxNiByb3dzKQorCitEUk9QIFRB QkxFIHRzdDEsIHRzdDIsIHRzdDMsIHRzdDQsIHRzdDU7CiAtLSBUZXN0IGNhc2UgZm9yIHN1 YmxpbmtzIHB1c2hlZCBkb3duIGludG8gc3Vic2VsZWN0cyB2aWEgam9pbiBhbGlhcyBleHBh bnNpb24KIC0tCiBzZWxlY3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N1 YnNlbGVjdC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxlY3Quc3FsCmluZGV4 IGZlYzM4ZWY4NWE2Li44NGYwZjIxMDFiYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvc3Vic2VsZWN0LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdWJzZWxl Y3Quc3FsCkBAIC00NDAsNiArNDQwLDM3MyBAQCB3aGVyZSBleGlzdHMgKAogcm9sbGJhY2s7 CiAKIC0tCistLSBUZXN0IGNhc2UgZm9yIGV4aXN0IHN1Ymxpbmsgd2hlcmUgd2UgY2FuIGNv bnNpZGVyIHNvbWUgdW5kZXBlbmRlbnQgZXhwcmVzc2lvbgorLS0gd2l0aCBvdXRlciBsaW5r CistLQorCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUg RVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0g dGIuaWQKKyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitX SEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGEu aWQgPSB0Yy5pZAorKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00g dGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBP TiAxID0gMQorICBXSEVSRSB0YS5pZCA9IHRjLmlkCispOworCistLSBKb2luIGNvbXBvdW5k IGV4cHJlc3Npb24KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitX SEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGEu aWQgPSB0Yy5pZAorICAgICAgICAgICBBTkQgdGEuaWQgPSB0Yi5pZAorKTsKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEgdGExCitXSEVSRSBFWElTVFMgKAor ICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGIuYXZhbCA9IHRjLmFpZAor ICAgICAgICAgICBBTkQgdGIuYXZhbCA9IHRhMS5pZAorKTsKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK0pPSU4gdGIgT04gdHJ1ZQorV0hFUkUgRVhJU1RT ICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YiB0YjEKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRi LmlkCispOworCistLSBDb21wb3VuZCBleHByZXNzaW9uIHdpdGggY29uc3QgdHlwZSBvciBv dGhlciB0eXBlIG9mIGV4cHJlc3Npb25zCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1Qg MQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBK T0lOIHRjIE9OIHRhLmlkID0gdGMuaWQKKyAgICAgICAgICAgQU5EIHRhLmlkID0gMQorKTsK KworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNU UyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRjLmlk CisgICAgICAgICAgIEFORCB0Yi5pZCA9IDEKKyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9N IHRiCisgIFJJR0hUIEpPSU4gdGMgT04gdGEuaWQgPSB0Yy5pZAorICBXSEVSRSB0YS52YWwg PSAxCispOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hF UkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlk ID0gdGIuaWQKKyAgICAgICAgICAgQU5EIHRiLmF2YWwgPSBBTlkgKCd7MX0nOjppbnRbXSkK Kyk7CisKKy0tIEV4aXN0cyBTdWJMaW5rIGV4cHJlc3Npb24gd2l0aGluIGV4cHJlc3Npb24K K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhIHRhMQorV0hFUkUgRVhJ U1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSB0YQorICBKT0lOIHRiIE9OIHRhLmlkID0gdGEx LmlkCisgICAgICAgICAgIEFORCB0YTEudmFsID0gMQorICBXSEVSRSBFWElTVFMgKAorICAg IFNFTEVDVCAxCisgICAgRlJPTSB0YSB0YTIKKyAgICBXSEVSRSB0YTIuaWQgPSB0YTEuaWQK KyAgKQorKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEgdGEx CitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRhCisgIEpPSU4gdGIgT04g dGEudmFsID0gdGExLmlkCisgICAgICAgICAgIEFORCB0YTEuaWQgPSAxCisgIFdIRVJFIEVY SVNUUyAoCisgICAgU0VMRUNUIDEKKyAgICBGUk9NIHRhIHRhMgorICAgIFdIRVJFIHRhMi5p ZCA9IHRhLmlkCisgICkKKyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitG Uk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIFdIRVJF IHRhLmlkID0gdGIuaWQKKyAgICBBTkQgRVhJU1RTICgKKyAgICAgIFNFTEVDVCAxCisgICAg ICBGUk9NIHRjCisgICAgICBXSEVSRSB0Yy5pZCA9IHRiLmlkCisgICAgICAgIEFORCB0Yy5h aWQgKyB0Yi5hdmFsID4gMAorICAgICkKKyk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRi CisgIFdIRVJFIHRhLmlkID0gdGIuaWQKKyAgICBBTkQgRVhJU1RTICgKKyAgICAgIFNFTEVD VCAxCisgICAgICBGUk9NIHRjCisgICAgICBXSEVSRSB0Yy5pZCA9IHRiLmlkCisgICAgICAg IEFORCB0Yy5haWQgKyB0YS52YWwgPiAwCisgICAgKQorKTsKKworLS0gQ2hlY2sgd2l0aCBO VUxMIGFuZCBOT1QgTlVMTCBleHByZXNzaW9ucworQUxURVIgVEFCTEUgdGEgQUREIENPTFVN TiBpc19hY3RpdmUgYm9vbDsKK1VQREFURSB0YSBTRVQgaXNfYWN0aXZlID0gdHJ1ZTsKKwor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAo CisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisg ICAgICAgICBBTkQgQ09BTEVTQ0UodGEuaXNfYWN0aXZlLCB0cnVlKQorKTsKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGIKK1dIRVJFIEVYSVNUUyAoCisgIFNF TEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAg ICBBTkQgQ09BTEVTQ0UodGEuaXNfYWN0aXZlLCB0cnVlKQorKTsKKworRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dIRVJFIEVYSVNUUyAoCisgIFNFTEVDVCAx CisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisgICAgICAgICBBTkQg Q0FTRQorICAgICAgICAgICAgICAgV0hFTiB0YS5pc19hY3RpdmUgVEhFTiB0cnVlCisgICAg ICAgICAgICAgICBFTFNFIGZhbHNlCisgICAgICAgICAgICAgRU5EID0gdHJ1ZQorKTsKKwor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGIKK1dIRVJFIEVYSVNUUyAo CisgIFNFTEVDVCAxCisgIEZST00gdGEKKyAgSk9JTiB0YyBPTiB0YS5pZCA9IHRiLmlkCisg ICAgICAgICBBTkQgQ0FTRQorICAgICAgICAgICAgICAgV0hFTiB0YS5pc19hY3RpdmUgVEhF TiB0cnVlCisgICAgICAgICAgICAgICBFTFNFIGZhbHNlCisgICAgICAgICAgICAgRU5EID0g dHJ1ZQorKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIDEKK0ZST00gdGEKK1dI RVJFIEVYSVNUUyAoCisgIFNFTEVDVCAxCisgIEZST00gdGIKKyAgSk9JTiB0YyBPTiB0YS5p ZCA9IHRiLmlkCisgICAgICAgICBBTkQgdGEuaXNfYWN0aXZlCispOworCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgMQorRlJPTSB0YQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNU IDEKKyAgRlJPTSB0YgorICBKT0lOIHRjIE9OIHRhLmlkID0gdGIuaWQKKyAgICAgICAgIEFO RCB0YS5pc19hY3RpdmUgSVMgTk9UIE5VTEwKKyk7CisKKworLS0gRGlzYWJsZWQgcHVsbCB1 cCBiZWNhdXNlIGl0IGlzIGFwcGxjYXBhYmxlIGZvciBJTk5FUiBKT0lOIGNvbm5lY3Rpb24K K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBFWElTVFMg KAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIFJJR0hUIEpPSU4gdGMgT04gdGEuaWQgPSB0 Yy5pZAorKTsKKworLS0gRGlzYWJsZSBwdWxsLXVwIGR1ZSB0byBsYWNrIG9mIHRoZSBvdXRl ciB2YXIKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAxCitGUk9NIHRhCitXSEVSRSBF WElTVFMgKAorICBTRUxFQ1QgMQorICBGUk9NIHRiCisgIEpPSU4gdGMgT04gdGMuaWQgPSB0 Yi5pZAorKTsKKworQ1JFQVRFIFRBQkxFIHRkIChpZCBpbnQsIHRjX2lkIGJ5dGVhLCB2YWwg aW50KTsKKworSU5TRVJUIElOVE8gdGQKK1NFTEVDVCBnLmlkLCAnVGVzdDEnOjpieXRlYSBB UyB0Y19pZCwgNiBBUyB2YWwKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDI1KSBBUyBnKGlk KQorCitVTklPTiBBTEwKKworU0VMRUNUIGcuaWQsICdUZXN0Mic6OmJ5dGVhIEFTIHRjX2lk LCA3IEFTIHZhbAorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMjYsIDUwKSBBUyBnKGlkKQorCitV TklPTiBBTEwKKworU0VMRUNUIGcuaWQsICdUZXN0NCc6OmJ5dGVhIEFTIHRjX2lkLCA2IEFT IHZhbAorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoNTEsIDc1KSBBUyBnKGlkKQorCitVTklPTiBB TEwKKworU0VMRUNUIGcuaWQsICdUZXN0NSc6OmJ5dGVhIEFTIHRjX2lkLCA3IEFTIHZhbAor RlJPTSBnZW5lcmF0ZV9zZXJpZXMoNzYsIDEwMCkgQVMgZyhpZCk7CisKK0NSRUFURSBUQUJM RSB0ZSAoaWQgaW50LCB0Y19pZCBieXRlYSwgdmFsIGludCk7CitJTlNFUlQgSU5UTyB0ZSBT RUxFQ1QgKiBGUk9NIHRkOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgdDEuKgor RlJPTSB0YSB0MQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSAoU0VMRUNU IDEgQVMgU0RCTF9EVU1NWSkgU0RCTF9EVUFMCisgIEpPSU4gdGIgdDIgT04gdDIuaWQgPSB0 MS5pZAorICBXSEVSRSBFWElTVFMgKAorICAgIFNFTEVDVCAxCisgICAgRlJPTSAoU0VMRUNU IDEgQVMgU0RCTF9EVU1NWSkgU0RCTF9EVUFMCisgICAgSk9JTiB0ZCB0MyBPTiB0My50Y19p ZCBJTiAoJ1Rlc3QxJzo6Ynl0ZWEsICdUZXN0Mic6OmJ5dGVhKQorICAgIFdIRVJFIEVYSVNU UyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0ZSB0NAorICAgICAgV0hFUkUgdDQu dGNfaWQgPSB0My50Y19pZAorICAgICAgICBBTkQgdDQudmFsID0gdDIuYXZhbAorICAgICkg PSBFWElTVFMgKAorICAgICAgU0VMRUNUIDEKKyAgICAgIEZST00gdGMgdDUKKyAgICAgIFdI RVJFIHQ1LmlkID0gdDMuaWQKKyAgICApCisgICkKKyk7CisKK0RST1AgVEFCTEUgdGQsIHRl OworCitDUkVBVEUgVEFCTEUgdHN0MSAoaWQgaW50LCBtZXMgdmFyY2hhcigyMCkpOworQ1JF QVRFIFRBQkxFIHRzdDIgKGlkIGludCwgdHN0MV9pZCBpbnQsIHR5cGVfaWQgaW50KTsKK0NS RUFURSBUQUJMRSB0c3QzIChpZCBieXRlYSk7CitDUkVBVEUgVEFCTEUgdHN0NCAoaWQgaW50 LCB0c3QzX2lkIGJ5dGVhLCB0eXBlX2lkIGludCk7CitDUkVBVEUgVEFCTEUgdHN0NSAoaWQg aW50LCB0c3QzX2lkIGJ5dGVhLCB0eXBlX2lkIGludCk7CisKK0lOU0VSVCBJTlRPIHRzdDEg VkFMVUVTICgxLCAndGVzdDEnKTsKK0lOU0VSVCBJTlRPIHRzdDEgVkFMVUVTICgyLCAndGVz dDInKTsKK0lOU0VSVCBJTlRPIHRzdDEgVkFMVUVTICgzLCAndGVzdDMnKTsKK0lOU0VSVCBJ TlRPIHRzdDIgVkFMVUVTICgxLCAyLCA3KTsKK0lOU0VSVCBJTlRPIHRzdDIgVkFMVUVTICgx LCAyLCA2KTsKK0lOU0VSVCBJTlRPIHRzdDIgVkFMVUVTICgyLCAzLCA3KTsKKworSU5TRVJU IElOVE8gdHN0MworU0VMRUNUICgnVGVzdCcgfHwgZy5pZCk6OmJ5dGVhIEFTIGlkCisgICBG Uk9NIGdlbmVyYXRlX3NlcmllcygxLCA1KSBBUyBnKGlkKTsKKworSU5TRVJUIElOVE8gdHN0 NAorKFNFTEVDVCBnLmlkLCAnVGVzdDEnOjpieXRlYSBBUyB0c3QzX2lkLCA2IEFTIHR5cGVf aWQKKyAgIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDI1KSBBUyBnKGlkKSkKK1VOSU9OIEFM TAorKFNFTEVDVCBnLmlkLCAnVGVzdDInOjpieXRlYSBBUyB0c3QzX2lkLCA3IEFTIHR5cGVf aWQKKyAgIEZST00gZ2VuZXJhdGVfc2VyaWVzKDI2LCA1MCkgQVMgZyhpZCkpCitVTklPTiBB TEwKKyhTRUxFQ1QgZy5pZCwgJ1Rlc3Q0Jzo6Ynl0ZWEgQVMgdHN0M19pZCwgNiBBUyB0eXBl X2lkCisgICBGUk9NIGdlbmVyYXRlX3Nlcmllcyg1MSwgNzUpIEFTIGcoaWQpKQorVU5JT04g QUxMCisoU0VMRUNUIGcuaWQsICdUZXN0NSc6OmJ5dGVhIEFTIHRzdDNfaWQsIDcgQVMgdHlw ZV9pZAorICAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoNzYsIDEwMCkgQVMgZyhpZCkpOworSU5T RVJUIElOVE8gdHN0NSBTRUxFQ1QgKiBGUk9NIHRzdDQ7CisKK1ZBQ1VVTSAoQU5BTFlaRSkg dHN0MSwgdHN0MiwgdHN0MywgdHN0NCwgdHN0NTsKKworLS0gQ2FzZSB3aXRoIHR3byBleGlz dHMgaW4gT3BFeHByLCBpbiB0aGUgZmlyc3Qgb25lIHQzLmlkIGlzIHRoZSByZWZlcmVuY2Ug dG8gdGhlIHBhcmVudCBxdWVyeQorLS0gYW5kIHQyLnR5cGUtaWQgaXMgdGhlIHJlZmVyZW5j ZSB0byBncmFuZHBhcmVudCBxdWVyeQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQx LioKK0ZST00gdHN0MSB0MQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEKKyAgRlJPTSAo U0VMRUNUIDEgQVMgU0RCTF9EVU1NWSkgU0RCTF9EVUFMCisgIEpPSU4gdHN0MiB0MiBPTiB0 Mi50c3QxX2lkID0gdDEuaWQKKyAgV0hFUkUgRVhJU1RTICgKKyAgICBTRUxFQ1QgMQorICAg IEZST00gKFNFTEVDVCAxIEFTIFNEQkxfRFVNTVkpIFNEQkxfRFVBTAorICAgIEpPSU4gdHN0 MyB0MyBPTiB0My5pZCBJTiAoJ1Rlc3QxJzo6Ynl0ZWEsICdUZXN0Mic6OmJ5dGVhKQorICAg IFdIRVJFIEVYSVNUUyAoCisgICAgICBTRUxFQ1QgMQorICAgICAgRlJPTSB0c3Q0IHQ0Cisg ICAgICBXSEVSRSB0NC50c3QzX2lkID0gdDMuaWQKKyAgICAgICAgQU5EIHQ0LnR5cGVfaWQg PSB0Mi50eXBlX2lkCisgICAgKSA9IEVYSVNUUyAoCisgICAgICBTRUxFQ1QgMQorICAgICAg RlJPTSB0c3Q1IHQ1CisgICAgICBXSEVSRSB0NS50c3QzX2lkID0gdDMuaWQKKyAgICApCisg ICkKKyk7CisKK0RST1AgVEFCTEUgdHN0MSwgdHN0MiwgdHN0MywgdHN0NCwgdHN0NTsKKwog LS0gVGVzdCBjYXNlIGZvciBzdWJsaW5rcyBwdXNoZWQgZG93biBpbnRvIHN1YnNlbGVjdHMg dmlhIGpvaW4gYWxpYXMgZXhwYW5zaW9uCiAtLQogCi0tIAoyLjM0LjEKCg== --------------yC8vzk7sBnEJcjlUuBHe61TV--