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 1qo7Pj-000Ddq-6a for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Oct 2023 19:20:08 +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 1qo7Ph-0037ML-5Y for pgsql-hackers@arkaria.postgresql.org; Wed, 04 Oct 2023 19:20:06 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1qo7Pg-0037LY-Iu for pgsql-hackers@lists.postgresql.org; Wed, 04 Oct 2023 19:20:05 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1qo7Pd-0002pq-Gy for pgsql-hackers@postgresql.org; Wed, 04 Oct 2023 19:20:04 +0000 Received: from [10.4.12.127] (unknown [93.174.131.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.rybakina@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id B7ECAE20E28; Wed, 4 Oct 2023 22:19:59 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1696447199; bh=/VGsRZ9BIiF5bPLslwYM62sIhNWMQyPHco2Yg7CRECI=; h=Message-ID:Date:User-Agent:Subject:From:To:Cc:References: In-Reply-To:From; b=CsZwZN7+YovA8sbDvuvJv5mBRYcoRwwRsI6+7GtezX6igoW9DBwHqeDNZe3OkGN80 hleaDqB2hZrOzr+qQDKY0HYRt9hWfeGqKLb6nSSMXygpK8LJVLNPpDmLyrsYD9Gdvc f5i3lxs31kFr6aQwzBKGpnE6p6H5td79j3wwAY5WZgp/xmAwiAjItxRXsrvjttRPgz 49he+3oJYGDyPwkP+FT3VgjUeY7/Cnvh1+V0I4+wV9Z4bxUBTSTSBGzQb6VdVBiHhw 9ZzG73kEQmg6dSSz2m1zawXSXVGI76YWo0oCeghft+MI241y0FuQ4vcY3KC3/M9hep Cm8xscWRdHXmA== Content-Type: multipart/mixed; boundary="------------elxnIKGlnzPwfCbctgsYYzZn" Message-ID: <668892c1-fb11-3a79-ce5e-1c194b7b3263@postgrespro.ru> Date: Wed, 4 Oct 2023 22:19:59 +0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.15.1 Subject: Re: POC, WIP: OR-clause support for indexes From: "a.rybakina" To: pgsql-hackers@postgresql.org Cc: "Finnerty, Jim" , Marcos Pegoraro , Andrey Lepikhov , teodor@sigaev.ru, Ranier Vilela , Tomas Vondra , Peter Geoghegan , Peter Eisentraut References: <567ED6CA.2040504@sigaev.ru> <8d714510-af73-a908-99c8-fc14536f2669@yandex.ru> <4bac271d-1700-db24-74ac-8414f2baf9fd@postgrespro.ru> <89fb769c-7d45-f0c5-a9b3-b706c9661c57@postgrespro.ru> Content-Language: en-US In-Reply-To: <89fb769c-7d45-f0c5-a9b3-b706c9661c57@postgrespro.ru> 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. --------------elxnIKGlnzPwfCbctgsYYzZn Content-Type: multipart/alternative; boundary="------------5pm5TF1ACNjTWZrKDAgJxQeh" --------------5pm5TF1ACNjTWZrKDAgJxQeh Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 29.09.2023 20:35, a.rybakina wrote: >> >> I'm sorry I didn't write for a long time, but I really had a very >> difficult month, now I'm fully back to work. >> >> *I was able to implement the patches to the end and moved the >> transformation of "OR" expressions to ANY.* I haven't seen a big >> difference between them yet, one has a transformation before >> calculating selectivity (v7.1-Replace-OR-clause-to-ANY.patch), the >> other after (v7.2-Replace-OR-clause-to-ANY.patch). Regression tests >> are passing, I don't see any problems with selectivity, nothing has >> fallen into the coredump, but I found some incorrect transformations. >> What is the reason for these inaccuracies, I have not found, but, to >> be honest, they look unusual). Gave the error below. >> >> In the patch, I don't like that I had to drag three libraries from >> parsing until I found a way around it.The advantage of this approach >> compared to the other ([1]) is that at this stage all possible or >> transformations are performed, compared to the patch, where the >> transformation was done at the parsing stage. That is, here, for >> example, there are such optimizations in the transformation: >> >> >> I took the common element out of the bracket and the rest is >> converted to ANY, while, as noted by Peter Geoghegan, we did not have >> several bitmapscans, but only one scan through the array. >> >> postgres=# explain analyze SELECT p1.oid, p1.proname >> FROM pg_proc as p1 >> WHERE prolang = 13 AND prolang=1 OR prolang = 13 AND prolang = 2 OR >> prolang = 13 AND prolang = 3; >>                                               QUERY PLAN >> ------------------------------------------------------------------------------------------------------- >>  Seq Scan on pg_proc p1  (cost=0.00..151.66 rows=1 width=68) (actual >> time=1.167..1.168 rows=0 loops=1) >>    Filter: ((prolang = '13'::oid) AND (prolang = ANY (ARRAY['1'::oid, >> '2'::oid, '3'::oid]))) >>    Rows Removed by Filter: 3302 >>  Planning Time: 0.146 ms >>  Execution Time: 1.191 ms >> (5 rows) >> *Falls into coredump at me:* >> explain analyze SELECT p1.oid, p1.proname >> FROM pg_proc as p1 >> WHERE prolang = 13 OR prolang = 2 AND prolang = 2 OR prolang = 13; >> > Hi, all! I fixed the kernel dump issue and all the regression tests were successful, but I discovered another problem when I added my own regression tests. Some queries that contain "or" expressions do not convert to "ANY". I have described this in more detail using diff as expected and real results: diff -U3 /home/alena/postgrespro__copy6/src/test/regress/expected/create_index.out /home/alena/postgrespro__copy6/src/test/regress/results/create_index.out --- /home/alena/postgrespro__copy6/src/test/regress/expected/create_index.out 2023-10-04 21:54:12.496282667 +0300 +++ /home/alena/postgrespro__copy6/src/test/regress/results/create_index.out 2023-10-04 21:55:41.665422459 +0300 @@ -1925,17 +1925,20 @@  EXPLAIN (COSTS OFF)  SELECT count(*) FROM tenk1    WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3) OR thousand = 41; -                                               QUERY PLAN --------------------------------------------------------------------------------------------------------- +                                                        QUERY PLAN +---------------------------------------------------------------------------------------------------------------------------   Aggregate     ->  Bitmap Heap Scan on tenk1 -         Recheck Cond: (((thousand = 42) AND (tenthous = ANY ('{1,3}'::integer[]))) OR (thousand = 41)) +         Recheck Cond: ((((thousand = 42) AND (tenthous = 1)) OR ((thousand = 42) AND (tenthous = 3))) OR (thousand = 41))           ->  BitmapOr -               ->  Bitmap Index Scan on tenk1_thous_tenthous -                     Index Cond: ((thousand = 42) AND (tenthous = ANY ('{1,3}'::integer[]))) +               ->  BitmapOr +                     ->  Bitmap Index Scan on tenk1_thous_tenthous +                           Index Cond: ((thousand = 42) AND (tenthous = 1)) +                     ->  Bitmap Index Scan on tenk1_thous_tenthous +                           Index Cond: ((thousand = 42) AND (tenthous = 3))                 ->  Bitmap Index Scan on tenk1_thous_tenthous                       Index Cond: (thousand = 41) -(8 rows) +(11 rows) @@ -1946,24 +1949,50 @@  EXPLAIN (COSTS OFF)  SELECT count(*) FROM tenk1 +  WHERE thousand = 42 OR tenthous = 1 AND thousand = 42 OR tenthous = 1; +                                            QUERY PLAN +--------------------------------------------------------------------------------------------------- + Aggregate +   ->  Bitmap Heap Scan on tenk1 +         Recheck Cond: ((thousand = 42) OR ((thousand = 42) AND (tenthous = 1)) OR (tenthous = 1)) +         ->  BitmapOr +               ->  Bitmap Index Scan on tenk1_thous_tenthous +                     Index Cond: (thousand = 42) +               ->  Bitmap Index Scan on tenk1_thous_tenthous +                     Index Cond: ((thousand = 42) AND (tenthous = 1)) +               ->  Bitmap Index Scan on tenk1_thous_tenthous +                     Index Cond: (tenthous = 1) +(10 rows) + +SELECT count(*) FROM tenk1 +  WHERE thousand = 42 OR tenthous = 1 AND thousand = 42 OR tenthous = 1; + count +------- +    11 +(1 row) + +EXPLAIN (COSTS OFF) +SELECT count(*) FROM tenk1    WHERE hundred = 42 AND (thousand = 42 OR thousand = 99 OR tenthous < 2) OR thousand = 41; -                                                         QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------ +                                                       QUERY PLAN +------------------------------------------------------------------------------------------------------------------------   Aggregate     ->  Bitmap Heap Scan on tenk1 -         Recheck Cond: (((hundred = 42) AND ((tenthous < 2) OR (thousand = ANY ('{42,99}'::integer[])))) OR (thousand = 41)) +         Recheck Cond: (((hundred = 42) AND ((thousand = 42) OR (thousand = 99) OR (tenthous < 2))) OR (thousand = 41))           ->  BitmapOr                 ->  BitmapAnd                       ->  Bitmap Index Scan on tenk1_hundred                             Index Cond: (hundred = 42)                       ->  BitmapOr                             ->  Bitmap Index Scan on tenk1_thous_tenthous -                                 Index Cond: (tenthous < 2) +                                 Index Cond: (thousand = 42)                             ->  Bitmap Index Scan on tenk1_thous_tenthous -                                 Index Cond: (thousand = ANY ('{42,99}'::integer[])) +                                 Index Cond: (thousand = 99) +                           ->  Bitmap Index Scan on tenk1_thous_tenthous +                                 Index Cond: (tenthous < 2)                 ->  Bitmap Index Scan on tenk1_thous_tenthous                       Index Cond: (thousand = 41) -(14 rows) +(16 rows) diff -U3 /home/alena/postgrespro__copy6/src/test/regress/expected/join.out /home/alena/postgrespro__copy6/src/test/regress/results/join.out --- /home/alena/postgrespro__copy6/src/test/regress/expected/join.out 2023-10-04 21:53:55.632069079 +0300 +++ /home/alena/postgrespro__copy6/src/test/regress/results/join.out 2023-10-04 21:55:46.597485979 +0300  explain (costs off)  select * from tenk1 a join tenk1 b on    (a.unique1 < 20 or a.unique1 = 3 or a.unique1 = 1 and b.unique1 = 2) or    ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4); - QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------   Nested Loop -   Join Filter: ((a.unique1 < 20) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = ANY ('{3,7}'::integer[])) AND (b.hundred = 4)) OR (a.unique1 = 3)) +   Join Filter: ((a.unique1 < 20) OR (a.unique1 = 3) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR (((a.unique2 = 3) OR (a.unique2 = 7)) AND (b.hundred = 4)))     ->  Seq Scan on tenk1 b     ->  Materialize           ->  Bitmap Heap Scan on tenk1 a -               Recheck Cond: ((unique1 < 20) OR (unique1 = 1) OR (unique2 = ANY ('{3,7}'::integer[])) OR (unique1 = 3)) +               Recheck Cond: ((unique1 < 20) OR (unique1 = 3) OR (unique1 = 1) OR (unique2 = 3) OR (unique2 = 7))                 ->  BitmapOr                       ->  Bitmap Index Scan on tenk1_unique1                             Index Cond: (unique1 < 20)                       ->  Bitmap Index Scan on tenk1_unique1 +                           Index Cond: (unique1 = 3) +                     ->  Bitmap Index Scan on tenk1_unique1                             Index Cond: (unique1 = 1)                       ->  Bitmap Index Scan on tenk1_unique2 -                           Index Cond: (unique2 = ANY ('{3,7}'::integer[])) -                     ->  Bitmap Index Scan on tenk1_unique1 -                           Index Cond: (unique1 = 3) -(15 rows) +                           Index Cond: (unique2 = 3) +                     ->  Bitmap Index Scan on tenk1_unique2 +                           Index Cond: (unique2 = 7) +(17 rows)  explain (costs off)  select * from tenk1 a join tenk1 b on    (a.unique1 < 20 or a.unique1 = 3 or a.unique1 = 1 and b.unique1 = 2) or    ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4); - QUERY PLAN ---------------------------------------------------------------------------------------------------------------------------------------------------------------- + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------------   Nested Loop -   Join Filter: ((a.unique1 < 20) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = ANY ('{3,7}'::integer[])) AND (b.hundred = 4)) OR (a.unique1 = 3)) +   Join Filter: ((a.unique1 < 20) OR (a.unique1 = 3) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR (((a.unique2 = 3) OR (a.unique2 = 7)) AND (b.hundred = 4)))     ->  Seq Scan on tenk1 b     ->  Materialize           ->  Bitmap Heap Scan on tenk1 a -               Recheck Cond: ((unique1 < 20) OR (unique1 = 1) OR (unique2 = ANY ('{3,7}'::integer[])) OR (unique1 = 3)) +               Recheck Cond: ((unique1 < 20) OR (unique1 = 3) OR (unique1 = 1) OR (unique2 = 3) OR (unique2 = 7))                 ->  BitmapOr                       ->  Bitmap Index Scan on tenk1_unique1                             Index Cond: (unique1 < 20)                       ->  Bitmap Index Scan on tenk1_unique1 +                           Index Cond: (unique1 = 3) +                     ->  Bitmap Index Scan on tenk1_unique1                             Index Cond: (unique1 = 1)                       ->  Bitmap Index Scan on tenk1_unique2 -                           Index Cond: (unique2 = ANY ('{3,7}'::integer[])) -                     ->  Bitmap Index Scan on tenk1_unique1 -                           Index Cond: (unique1 = 3) -(15 rows) +                           Index Cond: (unique2 = 3) +                     ->  Bitmap Index Scan on tenk1_unique2 +                           Index Cond: (unique2 = 7) +(17 rows) I haven't been able to fully deal with this problem yet I have attached my experimental patch with the code. --------------5pm5TF1ACNjTWZrKDAgJxQeh Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit
On 29.09.2023 20:35, a.rybakina wrote:

I'm sorry I didn't write for a long time, but I really had a very difficult month, now I'm fully back to work.

I was able to implement the patches to the end and moved the transformation of "OR" expressions to ANY. I haven't seen a big difference between them yet, one has a transformation before calculating selectivity (v7.1-Replace-OR-clause-to-ANY.patch), the other after (v7.2-Replace-OR-clause-to-ANY.patch). Regression tests are passing, I don't see any problems with selectivity, nothing has fallen into the coredump, but I found some incorrect transformations. What is the reason for these inaccuracies, I have not found, but, to be honest, they look unusual). Gave the error below.

In the patch, I don't like that I had to drag three libraries from parsing until I found a way around it.The advantage of this approach compared to the other ([1]) is that at this stage all possible or transformations are performed, compared to the patch, where the transformation was done at the parsing stage. That is, here, for example, there are such optimizations in the transformation:


I took the common element out of the bracket and the rest is converted to ANY, while, as noted by Peter Geoghegan, we did not have several bitmapscans, but only one scan through the array.

postgres=# explain analyze SELECT p1.oid, p1.proname
FROM pg_proc as p1
WHERE prolang = 13 AND prolang=1 OR prolang = 13 AND prolang = 2 OR prolang = 13 AND prolang = 3;
                                              QUERY PLAN                                               
-------------------------------------------------------------------------------------------------------
 Seq Scan on pg_proc p1  (cost=0.00..151.66 rows=1 width=68) (actual time=1.167..1.168 rows=0 loops=1)
   Filter: ((prolang = '13'::oid) AND (prolang = ANY (ARRAY['1'::oid, '2'::oid, '3'::oid])))
   Rows Removed by Filter: 3302
 Planning Time: 0.146 ms
 Execution Time: 1.191 ms
(5 rows)

Falls into coredump at me:
explain analyze SELECT p1.oid, p1.proname
FROM pg_proc as p1
WHERE prolang = 13 OR prolang = 2 AND prolang = 2 OR prolang = 13;



Hi, all!

I fixed the kernel dump issue and all the regression tests were successful, but I discovered another problem when I added my own regression tests.
Some queries that contain "or" expressions do not convert to "ANY". I have described this in more detail using diff as expected and real results:

diff -U3 /home/alena/postgrespro__copy6/src/test/regress/expected/create_index.out /home/alena/postgrespro__copy6/src/test/regress/results/create_index.out
--- /home/alena/postgrespro__copy6/src/test/regress/expected/create_index.out 2023-10-04 21:54:12.496282667 +0300
+++ /home/alena/postgrespro__copy6/src/test/regress/results/create_index.out  2023-10-04 21:55:41.665422459 +0300
@@ -1925,17 +1925,20 @@
 EXPLAIN (COSTS OFF)
 SELECT count(*) FROM tenk1
   WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3) OR thousand = 41;
-                                               QUERY PLAN                                               
---------------------------------------------------------------------------------------------------------
+                                                        QUERY PLAN                                                         
+---------------------------------------------------------------------------------------------------------------------------
  Aggregate
    ->  Bitmap Heap Scan on tenk1
-         Recheck Cond: (((thousand = 42) AND (tenthous = ANY ('{1,3}'::integer[]))) OR (thousand = 41))
+         Recheck Cond: ((((thousand = 42) AND (tenthous = 1)) OR ((thousand = 42) AND (tenthous = 3))) OR (thousand = 41))
          ->  BitmapOr
-               ->  Bitmap Index Scan on tenk1_thous_tenthous
-                     Index Cond: ((thousand = 42) AND (tenthous = ANY ('{1,3}'::integer[])))
+               ->  BitmapOr
+                     ->  Bitmap Index Scan on tenk1_thous_tenthous
+                           Index Cond: ((thousand = 42) AND (tenthous = 1))
+                     ->  Bitmap Index Scan on tenk1_thous_tenthous
+                           Index Cond: ((thousand = 42) AND (tenthous = 3))
                ->  Bitmap Index Scan on tenk1_thous_tenthous
                      Index Cond: (thousand = 41)
-(8 rows)
+(11 rows)
@@ -1946,24 +1949,50 @@
 EXPLAIN (COSTS OFF)
 SELECT count(*) FROM tenk1
+  WHERE thousand = 42 OR tenthous = 1 AND thousand = 42 OR tenthous = 1;
+                                            QUERY PLAN                                             
+---------------------------------------------------------------------------------------------------
+ Aggregate
+   ->  Bitmap Heap Scan on tenk1
+         Recheck Cond: ((thousand = 42) OR ((thousand = 42) AND (tenthous = 1)) OR (tenthous = 1))
+         ->  BitmapOr
+               ->  Bitmap Index Scan on tenk1_thous_tenthous
+                     Index Cond: (thousand = 42)
+               ->  Bitmap Index Scan on tenk1_thous_tenthous
+                     Index Cond: ((thousand = 42) AND (tenthous = 1))
+               ->  Bitmap Index Scan on tenk1_thous_tenthous
+                     Index Cond: (tenthous = 1)
+(10 rows)
+
+SELECT count(*) FROM tenk1
+  WHERE thousand = 42 OR tenthous = 1 AND thousand = 42 OR tenthous = 1;
+ count
+-------
+    11
+(1 row)
+
+EXPLAIN (COSTS OFF)
+SELECT count(*) FROM tenk1
   WHERE hundred = 42 AND (thousand = 42 OR thousand = 99 OR tenthous < 2) OR thousand = 41;
-                                                         QUERY PLAN                                                          
------------------------------------------------------------------------------------------------------------------------------
+                                                       QUERY PLAN                                                       
+------------------------------------------------------------------------------------------------------------------------
  Aggregate
    ->  Bitmap Heap Scan on tenk1
-         Recheck Cond: (((hundred = 42) AND ((tenthous < 2) OR (thousand = ANY ('{42,99}'::integer[])))) OR (thousand = 41))
+         Recheck Cond: (((hundred = 42) AND ((thousand = 42) OR (thousand = 99) OR (tenthous < 2))) OR (thousand = 41))
          ->  BitmapOr
                ->  BitmapAnd
                      ->  Bitmap Index Scan on tenk1_hundred
                            Index Cond: (hundred = 42)
                      ->  BitmapOr
                            ->  Bitmap Index Scan on tenk1_thous_tenthous
-                                 Index Cond: (tenthous < 2)
+                                 Index Cond: (thousand = 42)
                            ->  Bitmap Index Scan on tenk1_thous_tenthous
-                                 Index Cond: (thousand = ANY ('{42,99}'::integer[]))
+                                 Index Cond: (thousand = 99)
+                           ->  Bitmap Index Scan on tenk1_thous_tenthous
+                                 Index Cond: (tenthous < 2)
                ->  Bitmap Index Scan on tenk1_thous_tenthous
                      Index Cond: (thousand = 41)
-(14 rows)
+(16 rows)

diff -U3 /home/alena/postgrespro__copy6/src/test/regress/expected/join.out /home/alena/postgrespro__copy6/src/test/regress/results/join.out
--- /home/alena/postgrespro__copy6/src/test/regress/expected/join.out 2023-10-04 21:53:55.632069079 +0300
+++ /home/alena/postgrespro__copy6/src/test/regress/results/join.out  2023-10-04 21:55:46.597485979 +0300
 explain (costs off)
 select * from tenk1 a join tenk1 b on
   (a.unique1 < 20 or a.unique1 = 3 or a.unique1 = 1 and b.unique1 = 2) or
   ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4);
-                                                                          QUERY PLAN                                                                           
----------------------------------------------------------------------------------------------------------------------------------------------------------------
+                                                                         QUERY PLAN                                                                          
+-------------------------------------------------------------------------------------------------------------------------------------------------------------
  Nested Loop
-   Join Filter: ((a.unique1 < 20) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = ANY ('{3,7}'::integer[])) AND (b.hundred = 4)) OR (a.unique1 = 3))
+   Join Filter: ((a.unique1 < 20) OR (a.unique1 = 3) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR (((a.unique2 = 3) OR (a.unique2 = 7)) AND (b.hundred = 4)))
    ->  Seq Scan on tenk1 b
    ->  Materialize
          ->  Bitmap Heap Scan on tenk1 a
-               Recheck Cond: ((unique1 < 20) OR (unique1 = 1) OR (unique2 = ANY ('{3,7}'::integer[])) OR (unique1 = 3))
+               Recheck Cond: ((unique1 < 20) OR (unique1 = 3) OR (unique1 = 1) OR (unique2 = 3) OR (unique2 = 7))
                ->  BitmapOr
                      ->  Bitmap Index Scan on tenk1_unique1
                            Index Cond: (unique1 < 20)
                      ->  Bitmap Index Scan on tenk1_unique1
+                           Index Cond: (unique1 = 3)
+                     ->  Bitmap Index Scan on tenk1_unique1
                            Index Cond: (unique1 = 1)
                      ->  Bitmap Index Scan on tenk1_unique2
-                           Index Cond: (unique2 = ANY ('{3,7}'::integer[]))
-                     ->  Bitmap Index Scan on tenk1_unique1
-                           Index Cond: (unique1 = 3)
-(15 rows)
+                           Index Cond: (unique2 = 3)
+                     ->  Bitmap Index Scan on tenk1_unique2
+                           Index Cond: (unique2 = 7)
+(17 rows)

 explain (costs off)
 select * from tenk1 a join tenk1 b on
   (a.unique1 < 20 or a.unique1 = 3 or a.unique1 = 1 and b.unique1 = 2) or
   ((a.unique2 = 3 or a.unique2 = 7) and b.hundred = 4);
-                                                                          QUERY PLAN                                                                           
----------------------------------------------------------------------------------------------------------------------------------------------------------------
+                                                                         QUERY PLAN                                                                          
+-------------------------------------------------------------------------------------------------------------------------------------------------------------
  Nested Loop
-   Join Filter: ((a.unique1 < 20) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR ((a.unique2 = ANY ('{3,7}'::integer[])) AND (b.hundred = 4)) OR (a.unique1 = 3))
+   Join Filter: ((a.unique1 < 20) OR (a.unique1 = 3) OR ((a.unique1 = 1) AND (b.unique1 = 2)) OR (((a.unique2 = 3) OR (a.unique2 = 7)) AND (b.hundred = 4)))
    ->  Seq Scan on tenk1 b
    ->  Materialize
          ->  Bitmap Heap Scan on tenk1 a
-               Recheck Cond: ((unique1 < 20) OR (unique1 = 1) OR (unique2 = ANY ('{3,7}'::integer[])) OR (unique1 = 3))
+               Recheck Cond: ((unique1 < 20) OR (unique1 = 3) OR (unique1 = 1) OR (unique2 = 3) OR (unique2 = 7))
                ->  BitmapOr
                      ->  Bitmap Index Scan on tenk1_unique1
                            Index Cond: (unique1 < 20)
                      ->  Bitmap Index Scan on tenk1_unique1
+                           Index Cond: (unique1 = 3)
+                     ->  Bitmap Index Scan on tenk1_unique1
                            Index Cond: (unique1 = 1)
                      ->  Bitmap Index Scan on tenk1_unique2
-                           Index Cond: (unique2 = ANY ('{3,7}'::integer[]))
-                     ->  Bitmap Index Scan on tenk1_unique1
-                           Index Cond: (unique1 = 3)
-(15 rows)
+                           Index Cond: (unique2 = 3)
+                     ->  Bitmap Index Scan on tenk1_unique2
+                           Index Cond: (unique2 = 7)
+(17 rows)

I haven't been able to fully deal with this problem yet

I have attached my experimental patch with the code.

--------------5pm5TF1ACNjTWZrKDAgJxQeh-- --------------elxnIKGlnzPwfCbctgsYYzZn Content-Type: text/x-patch; charset=UTF-8; name="0001-Replace-OR-clause-to-ANY-expressions.diff" Content-Disposition: attachment; filename="0001-Replace-OR-clause-to-ANY-expressions.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL29yY2xhdXNlcy5jIGIv c3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvb3JjbGF1c2VzLmMKaW5kZXggNmVmOWQxNGI5 MDIuLmNiYjE4NzIyOWZlIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9vcmNsYXVzZXMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9vcmNsYXVz ZXMuYwpAQCAtMjIsNiArMjIsMTAgQEAKICNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVy LmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL29yY2xhdXNlcy5oIgogI2luY2x1ZGUgIm9wdGlt aXplci9yZXN0cmljdGluZm8uaCIKKyNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKKyNp bmNsdWRlICJwYXJzZXIvcGFyc2VfZXhwci5oIgorI2luY2x1ZGUgInBhcnNlci9wYXJzZV9j b2VyY2UuaCIKKyNpbmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgogCiAKIHN0YXRpYyBi b29sIGlzX3NhZmVfcmVzdHJpY3Rpb25fY2xhdXNlX2ZvcihSZXN0cmljdEluZm8gKnJpbmZv LCBSZWxPcHRJbmZvICpyZWwpOwpAQCAtMjksNiArMzMsMzA3IEBAIHN0YXRpYyBFeHByICpl eHRyYWN0X29yX2NsYXVzZShSZXN0cmljdEluZm8gKm9yX3JpbmZvLCBSZWxPcHRJbmZvICpy ZWwpOwogc3RhdGljIHZvaWQgY29uc2lkZXJfbmV3X29yX2NsYXVzZShQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkgICBFeHByICpvcmNsYXVzZSwgUmVz dHJpY3RJbmZvICpqb2luX29yX3JpbmZvKTsKIAordHlwZWRlZiBzdHJ1Y3QgT3JDbGF1c2VH cm91cEVudHJ5Cit7CisJTm9kZQkJICAgKm5vZGU7CisJTGlzdAkJICAgKmNvbnN0czsKKwlP aWQJCQkJY29sbGF0aW9uOworCU9pZAkJCQlvcG5vOworCVJlc3RyaWN0SW5mbyAgICpyaW5m bzsKK30gT3JDbGF1c2VHcm91cEVudHJ5OworCitpbnQJCQlvcl90cmFuc2Zvcm1fbGltaXQg PSA1MDA7CisKKy8qCisgKiBQYXNzIHRocm91Z2ggYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2Vz IGFuZCB0cnkgdG8gY29udmVydCBPUiBjbGF1c2VzIGludG8gSU4KKyAqIFJldHVybiBhIG1v ZGlmaWVkIGNsYXVzZSBsaXN0IG9yIGp1c3QgdGhlIHNhbWUgYmFzZXJlc3RyaWN0aW5mbywg aWYgbm8KKyAqIGNoYW5nZXMgaGF2ZSBtYWRlLgorICogWFhYOiBkbyBub3QgY2hhbmdlIHNv dXJjZSBsaXN0IG9mIGNsYXVzZXMgYXQgYWxsLgorICovCitzdGF0aWMgTGlzdCAqCit0cmFu c2Zvcm1fb3JzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpiYXNlcmVzdHJpY3RpbmZvKQor eworCUxpc3RDZWxsICAgKmxjOworCUxpc3RDZWxsICAgKmxjX2NwOworCUxpc3QJICAgKm1v ZGlmaWVkX3JpbmZvID0gTklMOworCWJvb2wJCXNvbWV0aGluZ19jaGFuZ2VkID0gZmFsc2U7 CisJTGlzdAkgICAqYmFzZXJlc3RyaWN0aW5mb19vcmlnaW4gPSBsaXN0X2NvcHkoYmFzZXJl c3RyaWN0aW5mbyk7CisKKwkvKgorCSAqIENvbXBsZXhpdHkgb2YgYSBjbGF1c2UgY291bGQg YmUgYXJiaXRyYXJpbHkgc29waGlzdGljYXRlZC4gSGVyZSwgd2Ugd2lsbAorCSAqIGxvb2sg dXAgb25seSBvbiB0aGUgdG9wIGxldmVsIG9mIGNsYXVzZSBsaXN0LgorCSAqIFhYWDogSXQg aXMgc3Vic3RhbnRpYXRlZD8gQ291bGQgd2UgY2hhbmdlIHNvbWV0aGluZyBoZXJlPworCSAq LworCWZvcmJvdGggKGxjLCBiYXNlcmVzdHJpY3RpbmZvLCBsY19jcCwgYmFzZXJlc3RyaWN0 aW5mb19vcmlnaW4pCisJeworCQlSZXN0cmljdEluZm8gICAqcmluZm8gPSBsZmlyc3Rfbm9k ZShSZXN0cmljdEluZm8sIGxjKTsKKwkJUmVzdHJpY3RJbmZvICAgKnJpbmZvX2Jhc2UgPSBs Zmlyc3Rfbm9kZShSZXN0cmljdEluZm8sIGxjX2NwKTsKKwkJTGlzdAkJICAgKm9yX2xpc3Qg PSBOSUw7CisJCUxpc3RDZWxsCSAgICpsY19lYXJncywKKwkJCQkJICAgKmxjX3JhcmdzLAor CQkJCQkgICAqbGNfYXJnczsKKwkJTGlzdAkJICAgKmdyb3Vwc19saXN0ID0gTklMOworCQli b29sCQkJY2hhbmdlX2FwcGx5ID0gZmFsc2U7CisKKwkJaWYgKCFyZXN0cmljdGlvbl9pc19v cl9jbGF1c2UocmluZm8pIHx8CisJCQlsaXN0X2xlbmd0aCgoKEJvb2xFeHByICopIHJpbmZv LT5jbGF1c2UpLT5hcmdzKSA8IG9yX3RyYW5zZm9ybV9saW1pdCkKKwkJeworCQkJLyogQWRk IGEgY2xhdXNlIHdpdGhvdXQgY2hhbmdlcyAqLworCQkJbW9kaWZpZWRfcmluZm8gPSBsYXBw ZW5kKG1vZGlmaWVkX3JpbmZvLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8q CisJCSAqIE5PVEU6CisJCSAqIEl0IGlzIGFuIE9SLWNsYXVzZS4gU28sIHJpbmZvLT5vcmNs YXVzZSBpcyBhIEJvb2xFeHByIG5vZGUsIGNvbnRhaW5zCisJCSAqIGEgbGlzdCBvZiBzdWIt cmVzdHJpY3RpbmZvIGFyZ3MsIGFuZCByaW5mby0+Y2xhdXNlIC0gd2hpY2ggaXMgdGhlCisJ CSAqIHNhbWUgZXhwcmVzc2lvbiwgbWFkZSBmcm9tIGJhcmUgY2xhdXNlcy4gVG8gbm90IGJy ZWFrIHNlbGVjdGl2aXR5CisJCSAqIGNhY2hlcyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucywg dXNlIGJvdGg6CisJCSAqIC0gdXNlIHJpbmZvcyBmcm9tIG9yY2xhdXNlIGlmIG5vIHRyYW5z Zm9ybWF0aW9uIG5lZWRlZAorCQkgKiAtIHVzZSAgYmFyZSBxdWFscyBmcm9tIHJpbmZvLT5j bGF1c2UgaW4gdGhlIGNhc2Ugb2YgdHJhbnNmb3JtYXRpb24sCisJCSAqIHRvIGNyZWF0ZSBu ZXcgUmVzdHJpY3RJbmZvOiBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSBubyBvcHRpb25zIHRvIGF2 b2lkCisJCSAqIHNlbGVjdGl2aXR5IGVzdGltYXRpb24gcHJvY2VkdXJlLgorCQkgKi8KKwkJ Zm9yYm90aChsY19lYXJncywgKChCb29sRXhwciAqKSByaW5mby0+Y2xhdXNlKS0+YXJncywK KwkJCQlsY19yYXJncywgKChCb29sRXhwciAqKSByaW5mby0+b3JjbGF1c2UpLT5hcmdzKQor CQl7CisJCQlFeHByCQkJICAgKm9ycXVhbCA9IChFeHByICopIGxmaXJzdChsY19lYXJncyk7 CisJCQlSZXN0cmljdEluZm8JICAgKnN1Yl9yaW5mbzsKKwkJCU5vZGUJCQkgICAqY29uc3Rf ZXhwcjsKKwkJCU5vZGUJCQkgICAqbm9uX2NvbnN0X2V4cHI7CisJCQlMaXN0Q2VsbAkJICAg KmxjX2dyb3VwczsKKwkJCU9yQ2xhdXNlR3JvdXBFbnRyeSAqZ2VudHJ5OworCisJCQkvKiBJ dCBtYXkgYmUgb25lIG1vcmUgYm9vbGVhbiBleHByZXNzaW9uLCBza2lwIGl0IGZvciBub3cg Ki8KKwkJCWlmICghSXNBKGxmaXJzdChsY19yYXJncyksIFJlc3RyaWN0SW5mbykpCisJCQl7 CisJCQkJb3JfbGlzdCA9IGxhcHBlbmQob3JfbGlzdCwgKHZvaWQgKikgb3JxdWFsKTsKKwkJ CQljb250aW51ZTsKKwkJCX0KKworCQkJc3ViX3JpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJp Y3RJbmZvLCBsY19yYXJncyk7CisKKwkJCS8qIENoZWNrOiBpdCBpcyBhbiBleHByIG9mIHRo ZSBmb3JtICdGKHgpIG9wZXIgQ29uc3RFeHByJyAqLworCQkJaWYgKCFJc0Eob3JxdWFsLCBP cEV4cHIpIHx8CisJCQkJIShibXNfaXNfZW1wdHkoc3ViX3JpbmZvLT5sZWZ0X3JlbGlkcykg XgorCQkJCWJtc19pc19lbXB0eShzdWJfcmluZm8tPnJpZ2h0X3JlbGlkcykpIHx8CisJCQkJ Y29udGFpbl92b2xhdGlsZV9mdW5jdGlvbnMoKE5vZGUgKikgb3JxdWFsKSkKKwkJCXsKKwkJ CQkvKiBBZ2FpbiwgaXQncyBub3QgdGhlIGV4cHIgd2UgY2FuIHRyYW5zZm9ybSAqLworCQkJ CW9yX2xpc3QgPSBsYXBwZW5kKG9yX2xpc3QsICh2b2lkICopIG9ycXVhbCk7CisJCQkJY29u dGludWU7CisJCQl9CisKKwkJCS8qCisJCQkqIERldGVjdCB0aGUgY29uc3RhbnQgc2lkZSBv ZiB0aGUgY2xhdXNlLiBSZWNhbGwgbm9uLWNvbnN0YW50CisJCQkqIGV4cHJlc3Npb24gY2Fu IGJlIG1hZGUgbm90IG9ubHkgd2l0aCBWYXJzLCBidXQgYWxzbyB3aXRoIFBhcmFtcywKKwkJ CSogd2hpY2ggaXMgbm90IGJvbmRlZCB3aXRoIGFueSByZWxhdGlvbi4gVGh1cywgd2UgZGV0 ZWN0IHRoZSBjb25zdAorCQkJKiBzaWRlIC0gaWYgYW5vdGhlciBzaWRlIGlzIGNvbnN0YW50 IHRvbywgdGhlIG9ycXVhbCBjb3VsZG4ndCBiZQorCQkJKiBhbiBPcEV4cHIuCisJCQkqIEdl dCBwb2ludGVycyB0byBjb25zdGFudCBhbmQgZXhwcmVzc2lvbiBzaWRlcyBvZiB0aGUgcXVh bC4KKwkJCSovCisJCQljb25zdF9leHByID1ibXNfaXNfZW1wdHkoc3ViX3JpbmZvLT5sZWZ0 X3JlbGlkcykgPworCQkJCQkJCQkJCQkJZ2V0X2xlZnRvcChzdWJfcmluZm8tPmNsYXVzZSkg OgorCQkJCQkJCQkJCQkJZ2V0X3JpZ2h0b3Aoc3ViX3JpbmZvLT5jbGF1c2UpOworCQkJbm9u X2NvbnN0X2V4cHIgPSBibXNfaXNfZW1wdHkoc3ViX3JpbmZvLT5sZWZ0X3JlbGlkcykgPwor CQkJCQkJCQkJCQkJZ2V0X3JpZ2h0b3Aoc3ViX3JpbmZvLT5jbGF1c2UpIDoKKwkJCQkJCQkJ CQkJCWdldF9sZWZ0b3Aoc3ViX3JpbmZvLT5jbGF1c2UpOworCisJCQlpZiAoIW9wX21lcmdl am9pbmFibGUoKChPcEV4cHIgKikgc3ViX3JpbmZvLT5jbGF1c2UpLT5vcG5vLCBleHByVHlw ZShub25fY29uc3RfZXhwcikpKQorCQkJeworCQkJCS8qIEFuZCBhZ2FpbiwgZmlsdGVyIG91 dCBub24tZXF1YWxpdHkgb3BlcmF0b3JzICovCisJCQkJb3JfbGlzdCA9IGxhcHBlbmQob3Jf bGlzdCwgKHZvaWQgKikgb3JxdWFsKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyoK KwkJCSAqIEF0IHRoaXMgcG9pbnQgd2UgZGVmaW5pdGVseSBoYXZlIGEgdHJhbnNmb3JtYWJs ZSBjbGF1c2UuCisJCQkgKiBDbGFzc2lmeSBpdCBhbmQgYWRkIGludG8gc3BlY2lmaWMgZ3Jv dXAgb2YgY2xhdXNlcywgb3IgY3JlYXRlIG5ldworCQkJICogZ3JvdXAuCisJCQkgKiBUT0RP OiB0byBtYW5hZ2UgY29tcGxleGl0eSBpbiB0aGUgY2FzZSBvZiBtYW55IGRpZmZlcmVudCBj bGF1c2VzCisJCQkgKiAoWDE9QzEpIE9SIChYMj1DMiBPUikgLi4uIChYTiA9IENOKSB3ZSBj b3VsZCBpbnZlbnQgc29tZXRoaW5nCisJCQkgKiBsaWtlIGEgaGFzaCB0YWJsZSAoaHRhYiBr ZXkgPz8/KS4KKwkJCSAqLworCQkJZm9yZWFjaChsY19ncm91cHMsIGdyb3Vwc19saXN0KQor CQkJeworCQkJCU9yQ2xhdXNlR3JvdXBFbnRyeSAqdiA9IChPckNsYXVzZUdyb3VwRW50cnkg KikgbGZpcnN0KGxjX2dyb3Vwcyk7CisKKwkJCQlBc3NlcnQodi0+bm9kZSAhPSBOVUxMKTsK KworCQkJCWlmIChlcXVhbCh2LT5ub2RlLCBub25fY29uc3RfZXhwcikpCisJCQkJeworCQkJ CQl2LT5jb25zdHMgPSBsYXBwZW5kKHYtPmNvbnN0cywgY29uc3RfZXhwcik7CisJCQkJCW5v bl9jb25zdF9leHByID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlp ZiAobm9uX2NvbnN0X2V4cHIgPT0gTlVMTCkKKwkJCQkvKgorCQkJCSAqIFRoZSBjbGF1c2Ug Y2xhc3NpZmllZCBzdWNjZXNzZnVsbHkgYW5kIGFkZGVkIGludG8gZXhpc3RlZAorCQkJCSAq IGNsYXVzZSBncm91cC4KKwkJCQkgKi8KKwkJCQljb250aW51ZTsKKworCQkJLyogTmV3IGNs YXVzZSBncm91cCBuZWVkZWQgKi8KKwkJCWdlbnRyeSA9IHBhbGxvYyhzaXplb2YoT3JDbGF1 c2VHcm91cEVudHJ5KSk7CisJCQlnZW50cnktPm5vZGUgPSBub25fY29uc3RfZXhwcjsKKwkJ CWdlbnRyeS0+Y29uc3RzID0gbGlzdF9tYWtlMShjb25zdF9leHByKTsKKwkJCWdlbnRyeS0+ cmluZm8gPSBzdWJfcmluZm87CisJCQlncm91cHNfbGlzdCA9IGxhcHBlbmQoZ3JvdXBzX2xp c3QsICAodm9pZCAqKSBnZW50cnkpOworCQl9CisKKwkJaWYgKGdyb3Vwc19saXN0ID09IE5J TCkKKwkJeworCQkJLyoKKwkJCSAqIE5vIGFueSB0cmFuc2Zvcm1hdGlvbnMgcG9zc2libGUg d2l0aCB0aGlzIHJpbmZvLCBqdXN0IGFkZCBpdHNlbGYKKwkJCSAqIHRvIHRoZSBsaXN0IGFu ZCBnbyBmdXJ0aGVyLgorCQkJICovCisJCQltb2RpZmllZF9yaW5mbyA9IGxhcHBlbmQobW9k aWZpZWRfcmluZm8sIHJpbmZvKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTGV0J3Mg Y29udmVydCBlYWNoIGdyb3VwIG9mIGNsYXVzZXMgdG8gYW4gSU4gb3BlcmF0aW9uLiAqLwor CisJCS8qCisJCSAqIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgZ3JvdXBzIGFuZCBjb252ZXJ0 IGVhY2gsIHdoZXJlIG51bWJlciBvZgorCQkgKiBjb25zdHMgbW9yZSB0aGFuIDEuIHRyaXZp YWwgZ3JvdXBzIG1vdmUgdG8gT1ItbGlzdCBhZ2FpbgorCQkgKi8KKworCQlmb3JlYWNoKGxj X2FyZ3MsIGdyb3Vwc19saXN0KQorCQl7CisJCQlPckNsYXVzZUdyb3VwRW50cnkgKmdlbnRy eSA9IChPckNsYXVzZUdyb3VwRW50cnkgKikgbGZpcnN0KGxjX2FyZ3MpOworCQkJU2NhbGFy QXJyYXlPcEV4cHIgICpzYW9wZXhwcjsKKwkJCUxpc3QJCQkgICAqYWxsZXhwcnM7CisJCQlB cnJheUV4cHIJCSAgICpuZXdhOworCQkJT2lkCQkJCSAgICBzY2FsYXJfdHlwZTsKKwkJCU9p ZAkJCQkJYXJyYXlfdHlwZTsKKworCQkJQXNzZXJ0KGxpc3RfbGVuZ3RoKGdlbnRyeS0+Y29u c3RzKSA+IDApOworCisJCQlpZiAobGlzdF9sZW5ndGgoZ2VudHJ5LT5jb25zdHMpID09IDEp CisJCQl7CisJCQkJLyoKKwkJCQkgKiBPbmx5IG9uZSBlbGVtZW50IGluIHRoZSBjbGFzcy4g UmV0dXJuIHJpbmZvIGludG8gdGhlIEJvb2xFeHByCisJCQkJICogYXJncyBsaXN0IHVuY2hh bmdlZC4KKwkJCQkgKi8KKwkJCQlsaXN0X2ZyZWUoZ2VudHJ5LT5jb25zdHMpOworCQkJCW9y X2xpc3QgPSBsYXBwZW5kKG9yX2xpc3QsICh2b2lkICopIGdlbnRyeS0+cmluZm8tPmNsYXVz ZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAobGlzdF9sZW5ndGgoZ2VudHJ5LT5j b25zdHMpID09IDEpCisJCQl7CisJCQkJLyoKKwkJCQkqIE9ubHkgb25lIGVsZW1lbnQgaW4g dGhlIGNsYXNzLiBSZXR1cm4gcmluZm8gaW50byB0aGUgQm9vbEV4cHIKKwkJCQkqIGFyZ3Mg bGlzdCB1bmNoYW5nZWQuCisJCQkJKi8KKwkJCQlsaXN0X2ZyZWUoZ2VudHJ5LT5jb25zdHMp OworCQkJCW9yX2xpc3QgPSBsYXBwZW5kKG9yX2xpc3QsIGdlbnRyeS0+cmluZm8tPmNsYXVz ZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlhbGxleHBycyA9IGxpc3RfY29uY2F0KGxp c3RfbWFrZTEoZ2VudHJ5LT5ub2RlKSwgZ2VudHJ5LT5jb25zdHMpOworCQkJc2NhbGFyX3R5 cGUgPSBzZWxlY3RfY29tbW9uX3R5cGUoTlVMTCwgYWxsZXhwcnMsIE5VTEwsIE5VTEwpOwor CisJCQlpZiAoc2NhbGFyX3R5cGUgIT0gUkVDT1JET0lEICYmIE9pZElzVmFsaWQoc2NhbGFy X3R5cGUpKQorCQkJCQlhcnJheV90eXBlID0gZ2V0X2FycmF5X3R5cGUoc2NhbGFyX3R5cGUp OworCQkJZWxzZQorCQkJCQlhcnJheV90eXBlID0gSW52YWxpZE9pZDsKKwkJCWlmIChhcnJh eV90eXBlICE9IEludmFsaWRPaWQgJiYgc2NhbGFyX3R5cGUgIT0gSW52YWxpZE9pZCkKKwkJ CXsKKwkJCQkJLyoKKwkJCQkJKiBPSzogY29lcmNlIGFsbCB0aGUgcmlnaHQtaGFuZCBub24t VmFyIGlucHV0cyB0byB0aGUgY29tbW9uCisJCQkJCSogdHlwZSBhbmQgYnVpbGQgYW4gQXJy YXlFeHByIGZvciB0aGVtLgorCQkJCQkqLworCQkJCQlMaXN0CSAgICphZXhwcnM7CisJCQkJ CUxpc3RDZWxsICpsOworCisJCQkJCWFleHBycyA9IE5JTDsKKworCQkJCQlmb3JlYWNoKGws IGdlbnRyeS0+Y29uc3RzKQorCQkJCQl7CisJCQkJCQlOb2RlCSAgICpyZXhwciA9IChOb2Rl ICopIGxmaXJzdChsKTsKKworCQkJCQkJcmV4cHIgPSBjb2VyY2VfdG9fY29tbW9uX3R5cGUo TlVMTCwgcmV4cHIsCisJCQkJCQkJCQkJCQkJc2NhbGFyX3R5cGUsCisJCQkJCQkJCQkJCQkJ IklOIik7CisJCQkJCQlhZXhwcnMgPSBsYXBwZW5kKGFleHBycywgcmV4cHIpOworCQkJCQl9 CisKKwkJCQkJbmV3YSA9IG1ha2VOb2RlKEFycmF5RXhwcik7CisJCQkJCS8qIGFycmF5X2Nv bGxpZCB3aWxsIGJlIHNldCBieSBwYXJzZV9jb2xsYXRlLmMgKi8KKwkJCQkJbmV3YS0+ZWxl bWVudF90eXBlaWQgPSBzY2FsYXJfdHlwZTsKKwkJCQkJbmV3YS0+YXJyYXlfdHlwZWlkID0g YXJyYXlfdHlwZTsKKwkJCQkJbmV3YS0+bXVsdGlkaW1zID0gZmFsc2U7CisJCQkJCW5ld2Et PmVsZW1lbnRzID0gYWV4cHJzOworCQkJCQluZXdhLT5sb2NhdGlvbiA9IC0xOworCisJCQkJ CXNhb3BleHByID0KKwkJCQkJCShTY2FsYXJBcnJheU9wRXhwciAqKQorCQkJCQkJCW1ha2Vf c2NhbGFyX2FycmF5X29wKE5VTEwsCisJCQkJCQkJCQkJCQlsaXN0X21ha2UxKG1ha2VTdHJp bmcoKGNoYXIgKikgIj0iKSksCisJCQkJCQkJCQkJCQl0cnVlLAorCQkJCQkJCQkJCQkJZ2Vu dHJ5LT5ub2RlLAorCQkJCQkJCQkJCQkJKE5vZGUgKikgbmV3YSwKKwkJCQkJCQkJCQkJCS0x KTsKKwkJCQkJLy9zYW9wZXhwci0+aW5wdXRjb2xsaWQgPSBleHBySW5wdXRDb2xsYXRpb24o KE5vZGUgKilnZW50cnktPnJpbmZvLT5jbGF1c2UpOworCisJCQkJCW9yX2xpc3QgPSBsYXBw ZW5kKG9yX2xpc3QsICh2b2lkICopIHNhb3BleHByKTsKKwkJCQljaGFuZ2VfYXBwbHkgPSB0 cnVlOworCQkJfQorCQl9CisKKwkJaWYgKCFjaGFuZ2VfYXBwbHkpCisJCXsKKwkJCS8qCisJ CQkgKiBFYWNoIGdyb3VwIGNvbnRhaW5zIG9ubHkgb25lIGVsZW1lbnQgLSB1c2UgcmluZm8g YXMgaXMuCisJCQkgKi8KKwkJCW1vZGlmaWVkX3JpbmZvID0gbGFwcGVuZChtb2RpZmllZF9y aW5mbywgcmluZm8pOworCQkJbGlzdF9mcmVlKG9yX2xpc3QpOworCQkJbGlzdF9mcmVlX2Rl ZXAoZ3JvdXBzX2xpc3QpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBNYWtl IGEgbmV3IHZlcnNpb24gb2YgdGhlIHJlc3RyaWN0aW9uLiBSZW1lbWJlciBzb3VyY2UgcmVz dHJpY3Rpb24KKwkJICogY2FuIGJlIHVzZWQgaW4gYW5vdGhlciBwYXRoIChTZXFTY2FuLCBm b3IgZXhhbXBsZSkuCisJCSAqLworCisJCS8qIE9uZSBtb3JlIHRyaWNrOiBhc3NlbWJsZSBj b3JyZWN0IGNsYXVzZSAqLworCQlyaW5mbyA9IG1ha2VfcmVzdHJpY3RpbmZvKHJvb3QsCisJ CQkJICBsaXN0X2xlbmd0aChvcl9saXN0KSA+IDEgPyBtYWtlX29yY2xhdXNlKG9yX2xpc3Qp IDoKKwkJCQkJCQkJCQkJIChFeHByICopIGxpbml0aWFsKG9yX2xpc3QpLAorCQkJCSAgcmlu Zm8tPmlzX3B1c2hlZF9kb3duLAorCQkJCSAgcmluZm8tPmhhc19jbG9uZSwKKwkJCQkgIHJp bmZvLT5pc19jbG9uZSwKKwkJCQkgIHJpbmZvLT5wc2V1ZG9jb25zdGFudCwKKwkJCQkgIHJp bmZvLT5zZWN1cml0eV9sZXZlbCwKKwkJCQkgIHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsCisJ CQkJICByaW5mby0+aW5jb21wYXRpYmxlX3JlbGlkcywKKwkJCQkgIHJpbmZvLT5vdXRlcl9y ZWxpZHMpOworCQlyaW5mby0+ZXZhbF9jb3N0PXJpbmZvX2Jhc2UtPmV2YWxfY29zdDsKKwkJ cmluZm8tPm5vcm1fc2VsZWM9cmluZm9fYmFzZS0+bm9ybV9zZWxlYzsKKwkJcmluZm8tPm91 dGVyX3NlbGVjPXJpbmZvX2Jhc2UtPm91dGVyX3NlbGVjOworCQlyaW5mby0+bGVmdF9idWNr ZXRzaXplPXJpbmZvX2Jhc2UtPmxlZnRfYnVja2V0c2l6ZTsKKwkJcmluZm8tPnJpZ2h0X2J1 Y2tldHNpemU9cmluZm9fYmFzZS0+cmlnaHRfYnVja2V0c2l6ZTsKKwkJcmluZm8tPmxlZnRf bWN2ZnJlcT1yaW5mb19iYXNlLT5sZWZ0X21jdmZyZXE7CisJCXJpbmZvLT5yaWdodF9tY3Zm cmVxPXJpbmZvX2Jhc2UtPnJpZ2h0X21jdmZyZXE7CisJCW1vZGlmaWVkX3JpbmZvID0gbGFw cGVuZChtb2RpZmllZF9yaW5mbywgcmluZm8pOworCQlsaXN0X2ZyZWVfZGVlcChncm91cHNf bGlzdCk7CisJCXNvbWV0aGluZ19jaGFuZ2VkID0gdHJ1ZTsKKwl9CisKKwkvKgorCSAqIENo ZWNrIGlmIHRyYW5zZm9ybWF0aW9uIGhhcyBtYWRlLiBJZiBub3RoaW5nIGNoYW5nZWQgLSBy ZXR1cm4KKwkgKiBiYXNlcmVzdHJpY3RpbmZvIGFzIGlzLgorCSAqLworCWlmIChzb21ldGhp bmdfY2hhbmdlZCkKKwl7CisJCXJldHVybiBtb2RpZmllZF9yaW5mbzsKKwl9CisKKwlsaXN0 X2ZyZWUobW9kaWZpZWRfcmluZm8pOworCXJldHVybiBiYXNlcmVzdHJpY3RpbmZvOworfQog CiAvKgogICogZXh0cmFjdF9yZXN0cmljdGlvbl9vcl9jbGF1c2VzCkBAIC05Myw2ICszOTgs OCBAQCBleHRyYWN0X3Jlc3RyaWN0aW9uX29yX2NsYXVzZXMoUGxhbm5lckluZm8gKnJvb3Qp CiAJCWlmIChyZWwtPnJlbG9wdGtpbmQgIT0gUkVMT1BUX0JBU0VSRUwpCiAJCQljb250aW51 ZTsKIAorCQlyZWwtPmJhc2VyZXN0cmljdGluZm8gID0gdHJhbnNmb3JtX29ycyhyb290LCBy ZWwtPmJhc2VyZXN0cmljdGluZm8pOworCiAJCS8qCiAJCSAqIEZpbmQgcG90ZW50aWFsbHkg aW50ZXJlc3RpbmcgT1Igam9pbmNsYXVzZXMuICBXZSBjYW4gdXNlIGFueQogCQkgKiBqb2lu Y2xhdXNlIHRoYXQgaXMgY29uc2lkZXJlZCBzYWZlIHRvIG1vdmUgdG8gdGhpcyByZWwgYnkg dGhlCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyBi L3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCmluZGV4IDE2ZWM2YzVlZjAy Li5hNGYwNGQ4NDAyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNf dGFibGVzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKQEAg LTIwNTIsNiArMjA1MiwxNiBAQCBzdHJ1Y3QgY29uZmlnX2ludCBDb25maWd1cmVOYW1lc0lu dFtdID0KIAkJMTAwLCAxLCBNQVhfU1RBVElTVElDU19UQVJHRVQsCiAJCU5VTEwsIE5VTEws IE5VTEwKIAl9LAorCXsKKwkJeyJvcl90cmFuc2Zvcm1fbGltaXQiLCBQR0NfVVNFUlNFVCwg UVVFUllfVFVOSU5HX09USEVSLAorCQkJZ2V0dGV4dF9ub29wKCJUcmFuc2Zvcm0gYSBzZXF1 ZW5jZSBvZiBPUiBjbGF1c2VzIHRvIGFuIElOIGV4cHJlc3Npb24uIiksCisJCQlnZXR0ZXh0 X25vb3AoIlRoZSBwbGFubmVyIHdpbGwgcmVwbGFjZSBjbGF1c2VzIGxpa2UgJ3g9YzEgT1Ig eD1jMiAuLiIKKwkJCQkJCSAidG8gdGhlIGNsYXVzZSAneCBJTiAoYzEsYzIsLi4uKSciKQor CQl9LAorCQkmb3JfdHJhbnNmb3JtX2xpbWl0LAorCQk1MDAsIDAsIElOVF9NQVgsCisJCU5V TEwsIE5VTEwsIE5VTEwKKwl9LAogCXsKIAkJeyJmcm9tX2NvbGxhcHNlX2xpbWl0IiwgUEdD X1VTRVJTRVQsIFFVRVJZX1RVTklOR19PVEhFUiwKIAkJCWdldHRleHRfbm9vcCgiU2V0cyB0 aGUgRlJPTS1saXN0IHNpemUgYmV5b25kIHdoaWNoIHN1YnF1ZXJpZXMgIgpkaWZmIC0tZ2l0 IGEvc3JjL2luY2x1ZGUvcGFyc2VyL3BhcnNlX2V4cHIuaCBiL3NyYy9pbmNsdWRlL3BhcnNl ci9wYXJzZV9leHByLmgKaW5kZXggN2QzOGNhNzVmN2IuLjg5MWU2YTQ2MmI5IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9wYXJzZXIvcGFyc2VfZXhwci5oCisrKyBiL3NyYy9pbmNsdWRl L3BhcnNlci9wYXJzZV9leHByLmgKQEAgLTE3LDYgKzE3LDcgQEAKIAogLyogR1VDIHBhcmFt ZXRlcnMgKi8KIGV4dGVybiBQR0RMTElNUE9SVCBib29sIFRyYW5zZm9ybV9udWxsX2VxdWFs czsKK2V4dGVybiBQR0RMTElNUE9SVCBpbnQgb3JfdHJhbnNmb3JtX2xpbWl0OwogCiBleHRl cm4gTm9kZSAqdHJhbnNmb3JtRXhwcihQYXJzZVN0YXRlICpwc3RhdGUsIE5vZGUgKmV4cHIs IFBhcnNlRXhwcktpbmQgZXhwcktpbmQpOwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2NyZWF0ZV9pbmRleC5vdXQKaW5kZXggYWNmZDlkMWY0ZjcuLmEzOTcxMzdlY2I2IDEw MDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NyZWF0ZV9pbmRleC5vdXQK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jcmVhdGVfaW5kZXgub3V0CkBAIC0x ODgzLDYgKzE4ODMsMTUwIEBAIFNFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCiAgICAgMTAK ICgxIHJvdykKIAorU0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5E ICh0ZW50aG91cyA9IDEgT1IgdGVudGhvdXMgPSAzIE9SIHRlbnRob3VzID0gNDIpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmRleCBTY2FuIHVzaW5n IHRlbmsxX3Rob3VzX3RlbnRob3VzIG9uIHRlbmsxCisgICBJbmRleCBDb25kOiAoKHRob3Vz YW5kID0gNDIpIEFORCAodGVudGhvdXMgPSBBTlkgKEFSUkFZWzEsIDMsIDQyXSkpKQorKDIg cm93cykKKworU0VMRUNUICogRlJPTSB0ZW5rMQorICBXSEVSRSB0aG91c2FuZCA9IDQyIEFO RCAodGVudGhvdXMgPSAxIE9SIHRlbnRob3VzID0gMyBPUiB0ZW50aG91cyA9IDQyKTsKKyB1 bmlxdWUxIHwgdW5pcXVlMiB8IHR3byB8IGZvdXIgfCB0ZW4gfCB0d2VudHkgfCBodW5kcmVk IHwgdGhvdXNhbmQgfCB0d290aG91c2FuZCB8IGZpdmV0aG91cyB8IHRlbnRob3VzIHwgb2Rk IHwgZXZlbiB8IHN0cmluZ3UxIHwgc3RyaW5ndTIgfCBzdHJpbmc0IAorLS0tLS0tLS0tKy0t LS0tLS0tLSstLS0tLSstLS0tLS0rLS0tLS0rLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tKy0tLS0tLSst LS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCisgICAgICA0MiB8ICAgIDU1MzAgfCAg IDAgfCAgICAyIHwgICAyIHwgICAgICAyIHwgICAgICA0MiB8ICAgICAgIDQyIHwgICAgICAg ICAgNDIgfCAgICAgICAgNDIgfCAgICAgICA0MiB8ICA4NCB8ICAgODUgfCBRQkFBQUEgICB8 IFNFSUFBQSAgIHwgT09PT3h4CisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRo b3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA5OSk7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAg SGVhcCBTY2FuIG9uIHRlbmsxCisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoaHVuZHJlZCA9 IDQyKSBBTkQgKHRob3VzYW5kID0gQU5ZIChBUlJBWVs0MiwgOTldKSkpCisgICAgICAgICAt PiAgQml0bWFwQW5kCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g dGVuazFfaHVuZHJlZAorICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGh1bmRy ZWQgPSA0MikKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5r MV90aG91c190ZW50aG91cworICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHRo b3VzYW5kID0gQU5ZIChBUlJBWVs0MiwgOTldKSkKKyg4IHJvd3MpCisKK1NFTEVDVCBjb3Vu dCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0g NDIgT1IgdGhvdXNhbmQgPSA5OSk7CisgY291bnQgCistLS0tLS0tCisgICAgMTAKKygxIHJv dykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEK KyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50aG91cyA9 IDMpIE9SIHRob3VzYW5kID0gNDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEKKyAgICAg ICAgIFJlY2hlY2sgQ29uZDogKCgoKHRob3VzYW5kID0gNDIpIEFORCAodGVudGhvdXMgPSAx KSkgT1IgKCh0aG91c2FuZCA9IDQyKSBBTkQgKHRlbnRob3VzID0gMykpKSBPUiAodGhvdXNh bmQgPSA0MSkpCisgICAgICAgICAtPiAgQml0bWFwT3IKKyAgICAgICAgICAgICAgIC0+ICBC aXRtYXBPcgorICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9u IHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRl eCBDb25kOiAoKHRob3VzYW5kID0gNDIpIEFORCAodGVudGhvdXMgPSAxKSkKKyAgICAgICAg ICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50 aG91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKCh0aG91c2Fu ZCA9IDQyKSBBTkQgKHRlbnRob3VzID0gMykpCisgICAgICAgICAgICAgICAtPiAgQml0bWFw IEluZGV4IFNjYW4gb24gdGVuazFfdGhvdXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAg ICAgIEluZGV4IENvbmQ6ICh0aG91c2FuZCA9IDQxKQorKDExIHJvd3MpCisKK1NFTEVDVCBj b3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91 cyA9IDEgT1IgdGVudGhvdXMgPSAzKSBPUiB0aG91c2FuZCA9IDQxOworIGNvdW50IAorLS0t LS0tLQorICAgIDEwCisoMSByb3cpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBj b3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgT1IgdGVudGhvdXMg PSAxIEFORCB0aG91c2FuZCA9IDQyIE9SIHRlbnRob3VzID0gMTsKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgQml0bWFwIEhl YXAgU2NhbiBvbiB0ZW5rMQorICAgICAgICAgUmVjaGVjayBDb25kOiAoKHRob3VzYW5kID0g NDIpIE9SICgodGhvdXNhbmQgPSA0MikgQU5EICh0ZW50aG91cyA9IDEpKSBPUiAodGVudGhv dXMgPSAxKSkKKyAgICAgICAgIC0+ICBCaXRtYXBPcgorICAgICAgICAgICAgICAgLT4gIEJp dG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAgICAgICAgICAg ICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSA0MikKKyAgICAgICAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAg ICAgICAgICAgICAgSW5kZXggQ29uZDogKCh0aG91c2FuZCA9IDQyKSBBTkQgKHRlbnRob3Vz ID0gMSkpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFf dGhvdXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh0ZW50 aG91cyA9IDEpCisoMTAgcm93cykKKworU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKKyAg V0hFUkUgdGhvdXNhbmQgPSA0MiBPUiB0ZW50aG91cyA9IDEgQU5EIHRob3VzYW5kID0gNDIg T1IgdGVudGhvdXMgPSAxOworIGNvdW50IAorLS0tLS0tLQorICAgIDExCisoMSByb3cpCisK K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdI RVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA5OSBP UiB0ZW50aG91cyA8IDIpIE9SIHRob3VzYW5kID0gNDE7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEK KyAgICAgICAgIFJlY2hlY2sgQ29uZDogKCgoaHVuZHJlZCA9IDQyKSBBTkQgKCh0aG91c2Fu ZCA9IDQyKSBPUiAodGhvdXNhbmQgPSA5OSkgT1IgKHRlbnRob3VzIDwgMikpKSBPUiAodGhv dXNhbmQgPSA0MSkpCisgICAgICAgICAtPiAgQml0bWFwT3IKKyAgICAgICAgICAgICAgIC0+ ICBCaXRtYXBBbmQKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2Nh biBvbiB0ZW5rMV9odW5kcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoaHVuZHJlZCA9IDQyKQorICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcE9y CisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g dGVuazFfdGhvdXNfdGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEluZGV4IENvbmQ6ICh0aG91c2FuZCA9IDQyKQorICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSA5 OSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBv biB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgSW5kZXggQ29uZDogKHRlbnRob3VzIDwgMikKKyAgICAgICAgICAgICAgIC0+ICBCaXRt YXAgSW5kZXggU2NhbiBvbiB0ZW5rMV90aG91c190ZW50aG91cworICAgICAgICAgICAgICAg ICAgICAgSW5kZXggQ29uZDogKHRob3VzYW5kID0gNDEpCisoMTYgcm93cykKKworU0VMRUNU IGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhvdXNh bmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5IE9SIHRlbnRob3VzIDwgMikgT1IgdGhvdXNhbmQg PSA0MTsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAyMAorKDEgcm93KQorCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgY291bnQoKikgRlJPTSB0ZW5rMQorICBXSEVSRSBodW5kcmVk ID0gNDIgQU5EICh0aG91c2FuZCA9IDQyIE9SIHRob3VzYW5kID0gNDEgT1IgdGhvdXNhbmQg PSA5OSBBTkQgdGVudGhvdXMgPSAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFn Z3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gdGVuazEKKyAgICAgICAgIFJl Y2hlY2sgQ29uZDogKChodW5kcmVkID0gNDIpIEFORCAoKCh0aG91c2FuZCA9IDk5KSBBTkQg KHRlbnRob3VzID0gMikpIE9SICh0aG91c2FuZCA9IEFOWSAoQVJSQVlbNDIsIDQxXSkpKSkK KyAgICAgICAgIC0+ICBCaXRtYXBBbmQKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5k ZXggU2NhbiBvbiB0ZW5rMV9odW5kcmVkCisgICAgICAgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoaHVuZHJlZCA9IDQyKQorICAgICAgICAgICAgICAgLT4gIEJpdG1hcE9yCisgICAg ICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdGhvdXNf dGVudGhvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgodGhv dXNhbmQgPSA5OSkgQU5EICh0ZW50aG91cyA9IDIpKQorICAgICAgICAgICAgICAgICAgICAg LT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3Rob3VzX3RlbnRob3VzCisgICAgICAg ICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodGhvdXNhbmQgPSBBTlkgKEFSUkFZ WzQyLCA0MV0pKQorKDExIHJvd3MpCisKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisg IFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA0 MSBPUiB0aG91c2FuZCA9IDk5IEFORCB0ZW50aG91cyA9IDIpOworIGNvdW50IAorLS0tLS0t LQorICAgIDEwCisoMSByb3cpCisKK1JFU0VUIG9yX3RyYW5zZm9ybV9saW1pdDsKIC0tCiAt LSBDaGVjayBiZWhhdmlvciB3aXRoIGR1cGxpY2F0ZSBpbmRleCBjb2x1bW4gY29udGVudHMK IC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2d1Yy5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2d1Yy5vdXQKaW5kZXggMTI3Yzk1MzI5NzYuLmMw NTJiMTEzZWVhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2d1Yy5v dXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ndWMub3V0CkBAIC04NjEsNyAr ODYxLDggQEAgU0VMRUNUIG5hbWUgRlJPTSB0YWJfc2V0dGluZ3NfZmxhZ3MKICAgICAgICAg ICAgbmFtZSAgICAgICAgICAgIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgZGVm YXVsdF9zdGF0aXN0aWNzX3RhcmdldAotKDEgcm93KQorIG9yX3RyYW5zZm9ybV9saW1pdAor KDIgcm93cykKIAogLS0gUnVudGltZS1jb21wdXRlZCBHVUNzIHNob3VsZCBiZSBwYXJ0IG9m IHRoZSBwcmVzZXQgY2F0ZWdvcnkuCiBTRUxFQ1QgbmFtZSBGUk9NIHRhYl9zZXR0aW5nc19m bGFncwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5kZXggOWI4NjM4ZjI4NmEu LmYyMmU0NTI0MDk5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pv aW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTQy MDcsNiArNDIwNyw2MCBAQCBzZWxlY3QgKiBmcm9tIHRlbmsxIGEgam9pbiB0ZW5rMSBiIG9u CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVlMiA9IDcp CiAoMTkgcm93cykKIAorU0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHRlbmsxIGEgam9pbiB0ZW5rMSBiIG9uCisgIChh LnVuaXF1ZTEgPSAxIGFuZCBiLnVuaXF1ZTEgPSAyKSBvcgorICAoKGEudW5pcXVlMiA9IDMg b3IgYS51bmlxdWUyID0gNykgYW5kIGIuaHVuZHJlZCA9IDQpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKCgoYS51bmlxdWUxID0g MSkgQU5EIChiLnVuaXF1ZTEgPSAyKSkgT1IgKCgoYS51bmlxdWUyID0gMykgT1IgKGEudW5p cXVlMiA9IDcpKSBBTkQgKGIuaHVuZHJlZCA9IDQpKSkKKyAgIC0+ICBCaXRtYXAgSGVhcCBT Y2FuIG9uIHRlbmsxIGIKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKCh1bmlxdWUxID0gMikg T1IgKGh1bmRyZWQgPSA0KSkKKyAgICAgICAgIC0+ICBCaXRtYXBPcgorICAgICAgICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTEKKyAgICAgICAgICAg ICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMikKKyAgICAgICAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV9odW5kcmVkCisgICAgICAgICAgICAgICAg ICAgICBJbmRleCBDb25kOiAoaHVuZHJlZCA9IDQpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAg ICAgICAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlbmsxIGEKKyAgICAgICAgICAgICAg IFJlY2hlY2sgQ29uZDogKCh1bmlxdWUxID0gMSkgT1IgKHVuaXF1ZTIgPSAzKSBPUiAodW5p cXVlMiA9IDcpKQorICAgICAgICAgICAgICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAgICAg ICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdW5pcXVlMQorICAgICAg ICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1ZTEgPSAxKQorICAgICAg ICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTIK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUyID0gMykK KyAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV91 bmlxdWUyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVl MiA9IDcpCisoMTkgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJv bSB0ZW5rMSBhIGpvaW4gdGVuazEgYiBvbgorICAoYS51bmlxdWUxIDwgMjAgb3IgYS51bmlx dWUxID0gMyBvciBhLnVuaXF1ZTEgPSAxIGFuZCBiLnVuaXF1ZTEgPSAyKSBvcgorICAoKGEu dW5pcXVlMiA9IDMgb3IgYS51bmlxdWUyID0gNykgYW5kIGIuaHVuZHJlZCA9IDQpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBM b29wCisgICBKb2luIEZpbHRlcjogKChhLnVuaXF1ZTEgPCAyMCkgT1IgKGEudW5pcXVlMSA9 IDMpIE9SICgoYS51bmlxdWUxID0gMSkgQU5EIChiLnVuaXF1ZTEgPSAyKSkgT1IgKCgoYS51 bmlxdWUyID0gMykgT1IgKGEudW5pcXVlMiA9IDcpKSBBTkQgKGIuaHVuZHJlZCA9IDQpKSkK KyAgIC0+ICBTZXEgU2NhbiBvbiB0ZW5rMSBiCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAg ICAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRlbmsxIGEKKyAgICAgICAgICAgICAgIFJl Y2hlY2sgQ29uZDogKCh1bmlxdWUxIDwgMjApIE9SICh1bmlxdWUxID0gMykgT1IgKHVuaXF1 ZTEgPSAxKSBPUiAodW5pcXVlMiA9IDMpIE9SICh1bmlxdWUyID0gNykpCisgICAgICAgICAg ICAgICAtPiAgQml0bWFwT3IKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5k ZXggU2NhbiBvbiB0ZW5rMV91bmlxdWUxCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJ bmRleCBDb25kOiAodW5pcXVlMSA8IDIwKQorICAgICAgICAgICAgICAgICAgICAgLT4gIEJp dG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTEKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMykKKyAgICAgICAgICAgICAgICAgICAg IC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0ZW5rMV91bmlxdWUxCisgICAgICAgICAgICAg ICAgICAgICAgICAgICBJbmRleCBDb25kOiAodW5pcXVlMSA9IDEpCisgICAgICAgICAgICAg ICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGVuazFfdW5pcXVlMgorICAgICAg ICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1ZTIgPSAzKQorICAgICAg ICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIHRlbmsxX3VuaXF1ZTIK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUyID0gNykK KygxNyByb3dzKQorCitSRVNFVCBvcl90cmFuc2Zvcm1fbGltaXQ7CiAtLQogLS0gdGVzdCBw bGFjZW1lbnQgb2YgbW92YWJsZSBxdWFscyBpbiBhIHBhcmFtZXRlcml6ZWQgam9pbiB0cmVl CiAtLQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25f cHJ1bmUub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25fcHJ1bmUu b3V0CmluZGV4IGJiMTIyM2UyYjEzLi5hZDRjNGRhZTgxZSAxMDA2NDQKLS0tIGEvc3JjL3Rl c3QvcmVncmVzcy9leHBlY3RlZC9wYXJ0aXRpb25fcHJ1bmUub3V0CisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvcGFydGl0aW9uX3BydW5lLm91dApAQCAtMTAxLDYgKzEwMSw0 MiBAQCBleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gbHAgd2hlcmUgYSBpcyBu b3QgbnVsbCBhbmQgKGEgPSAnYScgb3IgYSA9ICdjJwogICAgICAgICAgRmlsdGVyOiAoKGEg SVMgTk9UIE5VTEwpIEFORCAoKGEgPSAnYSc6OmJwY2hhcikgT1IgKGEgPSAnYyc6OmJwY2hh cikpKQogKDUgcm93cykKIAorU0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitleHBsYWlu IChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gbHAgd2hlcmUgYSA9ICdhJyBvciBhID0gJ2Mn OworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQXBwZW5k CisgICAtPiAgU2VxIFNjYW4gb24gbHBfYWQgbHBfMQorICAgICAgICAgRmlsdGVyOiAoYSA9 IEFOWSAoJ3thLGN9Jzo6YnBjaGFyW10pKQorICAgLT4gIFNlcSBTY2FuIG9uIGxwX2JjIGxw XzIKKyAgICAgICAgIEZpbHRlcjogKGEgPSBBTlkgKCd7YSxjfSc6OmJwY2hhcltdKSkKKyAg IC0+ICBTZXEgU2NhbiBvbiBscF9lZiBscF8zCisgICAgICAgICBGaWx0ZXI6IChhID0gQU5Z ICgne2EsY30nOjpicGNoYXJbXSkpCisgICAtPiAgU2VxIFNjYW4gb24gbHBfZyBscF80Cisg ICAgICAgICBGaWx0ZXI6IChhID0gQU5ZICgne2EsY30nOjpicGNoYXJbXSkpCisgICAtPiAg U2VxIFNjYW4gb24gbHBfbnVsbCBscF81CisgICAgICAgICBGaWx0ZXI6IChhID0gQU5ZICgn e2EsY30nOjpicGNoYXJbXSkpCisgICAtPiAgU2VxIFNjYW4gb24gbHBfZGVmYXVsdCBscF82 CisgICAgICAgICBGaWx0ZXI6IChhID0gQU5ZICgne2EsY30nOjpicGNoYXJbXSkpCisoMTMg cm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIGxwIHdoZXJlIGEg aXMgbm90IG51bGwgYW5kIChhID0gJ2EnIG9yIGEgPSAnYycpOworICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBBcHBlbmQKKyAgIC0+ICBTZXEgU2NhbiBvbiBscF9hZCBs cF8xCisgICAgICAgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChhID0gQU5ZICgn e2EsY30nOjpicGNoYXJbXSkpKQorICAgLT4gIFNlcSBTY2FuIG9uIGxwX2JjIGxwXzIKKyAg ICAgICAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGEgPSBBTlkgKCd7YSxjfSc6 OmJwY2hhcltdKSkpCisgICAtPiAgU2VxIFNjYW4gb24gbHBfZWYgbHBfMworICAgICAgICAg RmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwpIEFORCAoYSA9IEFOWSAoJ3thLGN9Jzo6YnBjaGFy W10pKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBscF9nIGxwXzQKKyAgICAgICAgIEZpbHRlcjog KChhIElTIE5PVCBOVUxMKSBBTkQgKGEgPSBBTlkgKCd7YSxjfSc6OmJwY2hhcltdKSkpCisg ICAtPiAgU2VxIFNjYW4gb24gbHBfZGVmYXVsdCBscF81CisgICAgICAgICBGaWx0ZXI6ICgo YSBJUyBOT1QgTlVMTCkgQU5EIChhID0gQU5ZICgne2EsY30nOjpicGNoYXJbXSkpKQorKDEx IHJvd3MpCisKK1JFU0VUIG9yX3RyYW5zZm9ybV9saW1pdDsKIGV4cGxhaW4gKGNvc3RzIG9m Zikgc2VsZWN0ICogZnJvbSBscCB3aGVyZSBhIDw+ICdnJzsKICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCkBAIC02NzEsNiArNzA3LDE2NiBAQCBleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAq IGZyb20gcmxwIHdoZXJlIChhID0gMSBhbmQgYSA9IDMpIG9yIChhID4gMSBhbmQgYSA9CiAg ICAgICAgICBGaWx0ZXI6ICgoKGEgPSAxKSBBTkQgKGEgPSAzKSkgT1IgKChhID4gMSkgQU5E IChhID0gMTUpKSkKICgxMSByb3dzKQogCitTRVQgb3JfdHJhbnNmb3JtX2xpbWl0ID0gMDsK K2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBybHAgd2hlcmUgYSA9IDEgb3Ig YSA9IDc7CisgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IEFwcGVuZAorICAgU3VicGxhbnMgUmVtb3ZlZDogMQorICAgLT4gIFNlcSBTY2FuIG9uIHJs cDIgcmxwXzEKKyAgICAgICAgIEZpbHRlcjogKGEgPSBBTlkgKCd7MSw3fSc6OmludGVnZXJb XSkpCisoNCByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxw IHdoZXJlIGEgPSAxIG9yIGIgPSAnYWInOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFwcGVuZAorICAgLT4gIFNlcSBT Y2FuIG9uIHJscDEgcmxwXzEKKyAgICAgICAgIEZpbHRlcjogKChhID0gMSkgT1IgKChiKTo6 dGV4dCA9ICdhYic6OnRleHQpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDIgcmxwXzIKKyAg ICAgICAgIEZpbHRlcjogKChhID0gMSkgT1IgKChiKTo6dGV4dCA9ICdhYic6OnRleHQpKQor ICAgLT4gIFNlcSBTY2FuIG9uIHJscDNhYmNkIHJscF8zCisgICAgICAgICBGaWx0ZXI6ICgo YSA9IDEpIE9SICgoYik6OnRleHQgPSAnYWInOjp0ZXh0KSkKKyAgIC0+ICBTZXEgU2NhbiBv biBybHA0XzEgcmxwXzQKKyAgICAgICAgIEZpbHRlcjogKChhID0gMSkgT1IgKChiKTo6dGV4 dCA9ICdhYic6OnRleHQpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDRfMiBybHBfNQorICAg ICAgICAgRmlsdGVyOiAoKGEgPSAxKSBPUiAoKGIpOjp0ZXh0ID0gJ2FiJzo6dGV4dCkpCisg ICAtPiAgU2VxIFNjYW4gb24gcmxwNF9kZWZhdWx0IHJscF82CisgICAgICAgICBGaWx0ZXI6 ICgoYSA9IDEpIE9SICgoYik6OnRleHQgPSAnYWInOjp0ZXh0KSkKKyAgIC0+ICBTZXEgU2Nh biBvbiBybHA1XzEgcmxwXzcKKyAgICAgICAgIEZpbHRlcjogKChhID0gMSkgT1IgKChiKTo6 dGV4dCA9ICdhYic6OnRleHQpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDVfZGVmYXVsdCBy bHBfOAorICAgICAgICAgRmlsdGVyOiAoKGEgPSAxKSBPUiAoKGIpOjp0ZXh0ID0gJ2FiJzo6 dGV4dCkpCisgICAtPiAgU2VxIFNjYW4gb24gcmxwX2RlZmF1bHRfMTAgcmxwXzkKKyAgICAg ICAgIEZpbHRlcjogKChhID0gMSkgT1IgKChiKTo6dGV4dCA9ICdhYic6OnRleHQpKQorICAg LT4gIFNlcSBTY2FuIG9uIHJscF9kZWZhdWx0XzMwIHJscF8xMAorICAgICAgICAgRmlsdGVy OiAoKGEgPSAxKSBPUiAoKGIpOjp0ZXh0ID0gJ2FiJzo6dGV4dCkpCisgICAtPiAgU2VxIFNj YW4gb24gcmxwX2RlZmF1bHRfbnVsbCBybHBfMTEKKyAgICAgICAgIEZpbHRlcjogKChhID0g MSkgT1IgKChiKTo6dGV4dCA9ICdhYic6OnRleHQpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJs cF9kZWZhdWx0X2RlZmF1bHQgcmxwXzEyCisgICAgICAgICBGaWx0ZXI6ICgoYSA9IDEpIE9S ICgoYik6OnRleHQgPSAnYWInOjp0ZXh0KSkKKygyNSByb3dzKQorCitleHBsYWluIChjb3N0 cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEgPiAyMCBhbmQgYSA8IDI3OworICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQXBwZW5kCisgICAtPiAgU2VxIFNjYW4g b24gcmxwNF8xIHJscF8xCisgICAgICAgICBGaWx0ZXI6ICgoYSA+IDIwKSBBTkQgKGEgPCAy NykpCisgICAtPiAgU2VxIFNjYW4gb24gcmxwNF8yIHJscF8yCisgICAgICAgICBGaWx0ZXI6 ICgoYSA+IDIwKSBBTkQgKGEgPCAyNykpCisoNSByb3dzKQorCitleHBsYWluIChjb3N0cyBv ZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEgPSAyOTsKKyAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNj YW4gb24gcmxwNF9kZWZhdWx0IHJscAorICAgRmlsdGVyOiAoYSA9IDI5KQorKDIgcm93cykK KworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHJscCB3aGVyZSBhID49IDI5 OworICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBcHBlbmQKKyAg IC0+ICBTZXEgU2NhbiBvbiBybHA0X2RlZmF1bHQgcmxwXzEKKyAgICAgICAgIEZpbHRlcjog KGEgPj0gMjkpCisgICAtPiAgU2VxIFNjYW4gb24gcmxwNV8xIHJscF8yCisgICAgICAgICBG aWx0ZXI6IChhID49IDI5KQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDVfZGVmYXVsdCBybHBf MworICAgICAgICAgRmlsdGVyOiAoYSA+PSAyOSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBybHBf ZGVmYXVsdF8zMCBybHBfNAorICAgICAgICAgRmlsdGVyOiAoYSA+PSAyOSkKKyAgIC0+ICBT ZXEgU2NhbiBvbiBybHBfZGVmYXVsdF9kZWZhdWx0IHJscF81CisgICAgICAgICBGaWx0ZXI6 IChhID49IDI5KQorKDExIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICog ZnJvbSBybHAgd2hlcmUgYSA8IDEgb3IgKGEgPiAyMCBhbmQgYSA8IDI1KTsKKyAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQXBw ZW5kCisgICAtPiAgU2VxIFNjYW4gb24gcmxwMSBybHBfMQorICAgICAgICAgRmlsdGVyOiAo KGEgPCAxKSBPUiAoKGEgPiAyMCkgQU5EIChhIDwgMjUpKSkKKyAgIC0+ICBTZXEgU2NhbiBv biBybHA0XzEgcmxwXzIKKyAgICAgICAgIEZpbHRlcjogKChhIDwgMSkgT1IgKChhID4gMjAp IEFORCAoYSA8IDI1KSkpCisoNSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVj dCAqIGZyb20gcmxwIHdoZXJlIGEgPSAyMCBvciBhID0gNDA7CisgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBcHBlbmQKKyAgIFN1YnBsYW5z IFJlbW92ZWQ6IDIKKyAgIC0+ICBTZXEgU2NhbiBvbiBybHA0XzEgcmxwXzEKKyAgICAgICAg IEZpbHRlcjogKGEgPSBBTlkgKCd7MjAsNDB9Jzo6aW50ZWdlcltdKSkKKyAgIC0+ICBTZXEg U2NhbiBvbiBybHA1X2RlZmF1bHQgcmxwXzIKKyAgICAgICAgIEZpbHRlcjogKGEgPSBBTlkg KCd7MjAsNDB9Jzo6aW50ZWdlcltdKSkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9m Zikgc2VsZWN0ICogZnJvbSBybHAzIHdoZXJlIGEgPSAyMDsgICAvKiBlbXB0eSAqLworICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg UmVzdWx0CisgICBPbmUtVGltZSBGaWx0ZXI6IGZhbHNlCisoMiByb3dzKQorCitleHBsYWlu IChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEgPiAxIGFuZCBhID0gMTA7 CS8qIG9ubHkgZGVmYXVsdCAqLworICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIHJs cF9kZWZhdWx0XzEwIHJscAorICAgRmlsdGVyOiAoKGEgPiAxKSBBTkQgKGEgPSAxMCkpCiso MiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJl IGEgPiAxIGFuZCBhID49MTU7CS8qIHJscDMgb253YXJkcywgaW5jbHVkaW5nIGRlZmF1bHQg Ki8KKyAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBcHBlbmQK KyAgIC0+ICBTZXEgU2NhbiBvbiBybHAzYWJjZCBybHBfMQorICAgICAgICAgRmlsdGVyOiAo KGEgPiAxKSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDNlZmdoIHJs cF8yCisgICAgICAgICBGaWx0ZXI6ICgoYSA+IDEpIEFORCAoYSA+PSAxNSkpCisgICAtPiAg U2VxIFNjYW4gb24gcmxwM251bGx4eSBybHBfMworICAgICAgICAgRmlsdGVyOiAoKGEgPiAx KSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDNfZGVmYXVsdCBybHBf NAorICAgICAgICAgRmlsdGVyOiAoKGEgPiAxKSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNl cSBTY2FuIG9uIHJscDRfMSBybHBfNQorICAgICAgICAgRmlsdGVyOiAoKGEgPiAxKSBBTkQg KGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDRfMiBybHBfNgorICAgICAgICAg RmlsdGVyOiAoKGEgPiAxKSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJs cDRfZGVmYXVsdCBybHBfNworICAgICAgICAgRmlsdGVyOiAoKGEgPiAxKSBBTkQgKGEgPj0g MTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDVfMSBybHBfOAorICAgICAgICAgRmlsdGVy OiAoKGEgPiAxKSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscDVfZGVm YXVsdCBybHBfOQorICAgICAgICAgRmlsdGVyOiAoKGEgPiAxKSBBTkQgKGEgPj0gMTUpKQor ICAgLT4gIFNlcSBTY2FuIG9uIHJscF9kZWZhdWx0XzMwIHJscF8xMAorICAgICAgICAgRmls dGVyOiAoKGEgPiAxKSBBTkQgKGEgPj0gMTUpKQorICAgLT4gIFNlcSBTY2FuIG9uIHJscF9k ZWZhdWx0X2RlZmF1bHQgcmxwXzExCisgICAgICAgICBGaWx0ZXI6ICgoYSA+IDEpIEFORCAo YSA+PSAxNSkpCisoMjMgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBm cm9tIHJscCB3aGVyZSBhID0gMSBhbmQgYSA9IDM7CS8qIGVtcHR5ICovCisgICAgICAgIFFV RVJZIFBMQU4gICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBSZXN1bHQK KyAgIE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKKygyIHJvd3MpCisKK2V4cGxhaW4gKGNvc3Rz IG9mZikgc2VsZWN0ICogZnJvbSBybHAgd2hlcmUgKGEgPSAxIGFuZCBhID0gMykgb3IgKGEg PiAxIGFuZCBhID0gMTUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFwcGVu ZAorICAgLT4gIFNlcSBTY2FuIG9uIHJscDIgcmxwXzEKKyAgICAgICAgIEZpbHRlcjogKCgo YSA9IDEpIEFORCAoYSA9IDMpKSBPUiAoKGEgPiAxKSBBTkQgKGEgPSAxNSkpKQorICAgLT4g IFNlcSBTY2FuIG9uIHJscDNhYmNkIHJscF8yCisgICAgICAgICBGaWx0ZXI6ICgoKGEgPSAx KSBBTkQgKGEgPSAzKSkgT1IgKChhID4gMSkgQU5EIChhID0gMTUpKSkKKyAgIC0+ICBTZXEg U2NhbiBvbiBybHAzZWZnaCBybHBfMworICAgICAgICAgRmlsdGVyOiAoKChhID0gMSkgQU5E IChhID0gMykpIE9SICgoYSA+IDEpIEFORCAoYSA9IDE1KSkpCisgICAtPiAgU2VxIFNjYW4g b24gcmxwM251bGx4eSBybHBfNAorICAgICAgICAgRmlsdGVyOiAoKChhID0gMSkgQU5EIChh ID0gMykpIE9SICgoYSA+IDEpIEFORCAoYSA9IDE1KSkpCisgICAtPiAgU2VxIFNjYW4gb24g cmxwM19kZWZhdWx0IHJscF81CisgICAgICAgICBGaWx0ZXI6ICgoKGEgPSAxKSBBTkQgKGEg PSAzKSkgT1IgKChhID4gMSkgQU5EIChhID0gMTUpKSkKKygxMSByb3dzKQorCitSRVNFVCBv cl90cmFuc2Zvcm1fbGltaXQ7CiAtLSBtdWx0aS1jb2x1bW4ga2V5cwogY3JlYXRlIHRhYmxl IG1jM3AgKGEgaW50LCBiIGludCwgYyBpbnQpIHBhcnRpdGlvbiBieSByYW5nZSAoYSwgYWJz KGIpLCBjKTsKIGNyZWF0ZSB0YWJsZSBtYzNwX2RlZmF1bHQgcGFydGl0aW9uIG9mIG1jM3Ag ZGVmYXVsdDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdGlkc2Nh bi5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3RpZHNjYW4ub3V0CmluZGV4IGYx MzNiNWE0YWM3Li5lNDYyMjEyYWE1NCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC90aWRzY2FuLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Rp ZHNjYW4ub3V0CkBAIC01Niw2ICs1NiwyMyBAQCBTRUxFQ1QgY3RpZCwgKiBGUk9NIHRpZHNj YW4gV0hFUkUgY3RpZCA9ICcoMCwyKScgT1IgJygwLDEpJyA9IGN0aWQ7CiAgKDAsMikgfCAg MgogKDIgcm93cykKIAorU0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgY3RpZCwgKiBGUk9NIHRpZHNjYW4gV0hFUkUgY3RpZCA9ICco MCwyKScgT1IgJygwLDEpJyA9IGN0aWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBUaWQgU2Nh biBvbiB0aWRzY2FuCisgICBUSUQgQ29uZDogKGN0aWQgPSBBTlkgKEFSUkFZWycoMCwyKSc6 OnRpZCwgJygwLDEpJzo6dGlkXSkpCisoMiByb3dzKQorCitTRUxFQ1QgY3RpZCwgKiBGUk9N IHRpZHNjYW4gV0hFUkUgY3RpZCA9ICcoMCwyKScgT1IgJygwLDEpJyA9IGN0aWQ7CisgY3Rp ZCAgfCBpZCAKKy0tLS0tLS0rLS0tLQorICgwLDEpIHwgIDEKKyAoMCwyKSB8ICAyCisoMiBy b3dzKQorCitSRVNFVCBvcl90cmFuc2Zvcm1fbGltaXQ7CiAtLSBjdGlkID0gU2NhbGFyQXJy YXlPcCAtIGltcGxlbWVudGVkIGFzIHRpZHNjYW4KIEVYUExBSU4gKENPU1RTIE9GRikKIFNF TEVDVCBjdGlkLCAqIEZST00gdGlkc2NhbiBXSEVSRSBjdGlkID0gQU5ZKEFSUkFZWycoMCwx KScsICcoMCwyKSddOjp0aWRbXSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC9jcmVhdGVfaW5kZXguc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY3JlYXRlX2luZGV4 LnNxbAppbmRleCBkNDljZTlmMzAwNy4uNTE0ZTRmMGRhNDggMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2NyZWF0ZV9pbmRleC5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvY3JlYXRlX2luZGV4LnNxbApAQCAtNzM3LDYgKzczNyw0NCBAQCBTRUxFQ1QgY291 bnQoKikgRlJPTSB0ZW5rMQogU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKICAgV0hFUkUg aHVuZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5KTsKIAor U0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgKiBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9 IDEgT1IgdGVudGhvdXMgPSAzIE9SIHRlbnRob3VzID0gNDIpOworU0VMRUNUICogRlJPTSB0 ZW5rMQorICBXSEVSRSB0aG91c2FuZCA9IDQyIEFORCAodGVudGhvdXMgPSAxIE9SIHRlbnRo b3VzID0gMyBPUiB0ZW50aG91cyA9IDQyKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQyIEFORCAodGhv dXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5KTsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRl bmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNh bmQgPSA5OSk7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9N IHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgQU5EICh0ZW50aG91cyA9IDEgT1IgdGVu dGhvdXMgPSAzKSBPUiB0aG91c2FuZCA9IDQxOworU0VMRUNUIGNvdW50KCopIEZST00gdGVu azEKKyAgV0hFUkUgdGhvdXNhbmQgPSA0MiBBTkQgKHRlbnRob3VzID0gMSBPUiB0ZW50aG91 cyA9IDMpIE9SIHRob3VzYW5kID0gNDE7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgT1IgdGVudGhv dXMgPSAxIEFORCB0aG91c2FuZCA9IDQyIE9SIHRlbnRob3VzID0gMTsKK1NFTEVDVCBjb3Vu dCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIHRob3VzYW5kID0gNDIgT1IgdGVudGhvdXMgPSAx IEFORCB0aG91c2FuZCA9IDQyIE9SIHRlbnRob3VzID0gMTsKKworRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVuZHJlZCA9IDQy IEFORCAodGhvdXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDk5IE9SIHRlbnRob3VzIDwgMikg T1IgdGhvdXNhbmQgPSA0MTsKK1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJF IGh1bmRyZWQgPSA0MiBBTkQgKHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA5OSBPUiB0 ZW50aG91cyA8IDIpIE9SIHRob3VzYW5kID0gNDE7CisKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCBjb3VudCgqKSBGUk9NIHRlbmsxCisgIFdIRVJFIGh1bmRyZWQgPSA0MiBBTkQg KHRob3VzYW5kID0gNDIgT1IgdGhvdXNhbmQgPSA0MSBPUiB0aG91c2FuZCA9IDk5IEFORCB0 ZW50aG91cyA9IDIpOworU0VMRUNUIGNvdW50KCopIEZST00gdGVuazEKKyAgV0hFUkUgaHVu ZHJlZCA9IDQyIEFORCAodGhvdXNhbmQgPSA0MiBPUiB0aG91c2FuZCA9IDQxIE9SIHRob3Vz YW5kID0gOTkgQU5EIHRlbnRob3VzID0gMik7CitSRVNFVCBvcl90cmFuc2Zvcm1fbGltaXQ7 CisKIC0tCiAtLSBDaGVjayBiZWhhdmlvciB3aXRoIGR1cGxpY2F0ZSBpbmRleCBjb2x1bW4g Y29udGVudHMKIC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNx bCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCmluZGV4IDNlNTAzMmIwNGRkLi4y NzJmZjdjNWQ5MCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwK KysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5zcWwKQEAgLTEzOTcsNiArMTM5Nywx NyBAQCBzZWxlY3QgKiBmcm9tIHRlbmsxIGEgam9pbiB0ZW5rMSBiIG9uCiAgIChhLnVuaXF1 ZTEgPSAxIGFuZCBiLnVuaXF1ZTEgPSAyKSBvcgogICAoKGEudW5pcXVlMiA9IDMgb3IgYS51 bmlxdWUyID0gNykgYW5kIGIuaHVuZHJlZCA9IDQpOwogCitTRVQgb3JfdHJhbnNmb3JtX2xp bWl0ID0gMDsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gdGVuazEgYSBq b2luIHRlbmsxIGIgb24KKyAgKGEudW5pcXVlMSA9IDEgYW5kIGIudW5pcXVlMSA9IDIpIG9y CisgICgoYS51bmlxdWUyID0gMyBvciBhLnVuaXF1ZTIgPSA3KSBhbmQgYi5odW5kcmVkID0g NCk7CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHRlbmsxIGEgam9pbiB0 ZW5rMSBiIG9uCisgIChhLnVuaXF1ZTEgPCAyMCBvciBhLnVuaXF1ZTEgPSAzIG9yIGEudW5p cXVlMSA9IDEgYW5kIGIudW5pcXVlMSA9IDIpIG9yCisgICgoYS51bmlxdWUyID0gMyBvciBh LnVuaXF1ZTIgPSA3KSBhbmQgYi5odW5kcmVkID0gNCk7CitSRVNFVCBvcl90cmFuc2Zvcm1f bGltaXQ7CisKIC0tCiAtLSB0ZXN0IHBsYWNlbWVudCBvZiBtb3ZhYmxlIHF1YWxzIGluIGEg cGFyYW1ldGVyaXplZCBqb2luIHRyZWUKIC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9wYXJ0aXRpb25fcHJ1bmUuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFy dGl0aW9uX3BydW5lLnNxbAppbmRleCA4M2ZlZDU0YjhjNi4uMDY4ZWVkMzQ5OWMgMTAwNjQ0 Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3BhcnRpdGlvbl9wcnVuZS5zcWwKKysrIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvcGFydGl0aW9uX3BydW5lLnNxbApAQCAtMjEsNiArMjEs MTIgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIGxwIHdoZXJlIGEgaXMg bm90IG51bGw7CiBleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gbHAgd2hlcmUg YSBpcyBudWxsOwogZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIGxwIHdoZXJl IGEgPSAnYScgb3IgYSA9ICdjJzsKIGV4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJv bSBscCB3aGVyZSBhIGlzIG5vdCBudWxsIGFuZCAoYSA9ICdhJyBvciBhID0gJ2MnKTsKKwor U0VUIG9yX3RyYW5zZm9ybV9saW1pdCA9IDA7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVj dCAqIGZyb20gbHAgd2hlcmUgYSA9ICdhJyBvciBhID0gJ2MnOworZXhwbGFpbiAoY29zdHMg b2ZmKSBzZWxlY3QgKiBmcm9tIGxwIHdoZXJlIGEgaXMgbm90IG51bGwgYW5kIChhID0gJ2En IG9yIGEgPSAnYycpOworUkVTRVQgb3JfdHJhbnNmb3JtX2xpbWl0OworCiBleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gbHAgd2hlcmUgYSA8PiAnZyc7CiBleHBsYWluIChj b3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gbHAgd2hlcmUgYSA8PiAnYScgYW5kIGEgPD4gJ2Qn OwogZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIGxwIHdoZXJlIGEgbm90IGlu ICgnYScsICdkJyk7CkBAIC05OSw2ICsxMDUsMjEgQEAgZXhwbGFpbiAoY29zdHMgb2ZmKSBz ZWxlY3QgKiBmcm9tIHJscCB3aGVyZSBhID4gMSBhbmQgYSA+PTE1OwkvKiBybHAzIG9ud2Fy ZHMsIGkKIGV4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBybHAgd2hlcmUgYSA9 IDEgYW5kIGEgPSAzOwkvKiBlbXB0eSAqLwogZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3Qg KiBmcm9tIHJscCB3aGVyZSAoYSA9IDEgYW5kIGEgPSAzKSBvciAoYSA+IDEgYW5kIGEgPSAx NSk7CiAKK1NFVCBvcl90cmFuc2Zvcm1fbGltaXQgPSAwOworZXhwbGFpbiAoY29zdHMgb2Zm KSBzZWxlY3QgKiBmcm9tIHJscCB3aGVyZSBhID0gMSBvciBhID0gNzsKK2V4cGxhaW4gKGNv c3RzIG9mZikgc2VsZWN0ICogZnJvbSBybHAgd2hlcmUgYSA9IDEgb3IgYiA9ICdhYic7Citl eHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEgPiAyMCBhbmQg YSA8IDI3OworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHJscCB3aGVyZSBh ID0gMjk7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEg Pj0gMjk7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAqIGZyb20gcmxwIHdoZXJlIGEg PCAxIG9yIChhID4gMjAgYW5kIGEgPCAyNSk7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVj dCAqIGZyb20gcmxwIHdoZXJlIGEgPSAyMCBvciBhID0gNDA7CitleHBsYWluIChjb3N0cyBv ZmYpIHNlbGVjdCAqIGZyb20gcmxwMyB3aGVyZSBhID0gMjA7ICAgLyogZW1wdHkgKi8KK2V4 cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBybHAgd2hlcmUgYSA+IDEgYW5kIGEg PSAxMDsJLyogb25seSBkZWZhdWx0ICovCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAq IGZyb20gcmxwIHdoZXJlIGEgPiAxIGFuZCBhID49MTU7CS8qIHJscDMgb253YXJkcywgaW5j bHVkaW5nIGRlZmF1bHQgKi8KK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0ICogZnJvbSBy bHAgd2hlcmUgYSA9IDEgYW5kIGEgPSAzOwkvKiBlbXB0eSAqLworZXhwbGFpbiAoY29zdHMg b2ZmKSBzZWxlY3QgKiBmcm9tIHJscCB3aGVyZSAoYSA9IDEgYW5kIGEgPSAzKSBvciAoYSA+ IDEgYW5kIGEgPSAxNSk7CitSRVNFVCBvcl90cmFuc2Zvcm1fbGltaXQ7CisKIC0tIG11bHRp LWNvbHVtbiBrZXlzCiBjcmVhdGUgdGFibGUgbWMzcCAoYSBpbnQsIGIgaW50LCBjIGludCkg cGFydGl0aW9uIGJ5IHJhbmdlIChhLCBhYnMoYiksIGMpOwogY3JlYXRlIHRhYmxlIG1jM3Bf ZGVmYXVsdCBwYXJ0aXRpb24gb2YgbWMzcCBkZWZhdWx0OwpkaWZmIC0tZ2l0IGEvc3JjL3Rl c3QvcmVncmVzcy9zcWwvdGlkc2Nhbi5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC90aWRz Y2FuLnNxbAppbmRleCAzMTNlMGZiOWI2Ny4uNjM0YmYwOGU1ZmMgMTAwNjQ0Ci0tLSBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL3RpZHNjYW4uc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL3RpZHNjYW4uc3FsCkBAIC0yMiw2ICsyMiwxMiBAQCBFWFBMQUlOIChDT1NUUyBPRkYp CiBTRUxFQ1QgY3RpZCwgKiBGUk9NIHRpZHNjYW4gV0hFUkUgY3RpZCA9ICcoMCwyKScgT1Ig JygwLDEpJyA9IGN0aWQ7CiBTRUxFQ1QgY3RpZCwgKiBGUk9NIHRpZHNjYW4gV0hFUkUgY3Rp ZCA9ICcoMCwyKScgT1IgJygwLDEpJyA9IGN0aWQ7CiAKK1NFVCBvcl90cmFuc2Zvcm1fbGlt aXQgPSAwOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGN0aWQsICogRlJPTSB0aWRz Y2FuIFdIRVJFIGN0aWQgPSAnKDAsMiknIE9SICcoMCwxKScgPSBjdGlkOworU0VMRUNUIGN0 aWQsICogRlJPTSB0aWRzY2FuIFdIRVJFIGN0aWQgPSAnKDAsMiknIE9SICcoMCwxKScgPSBj dGlkOworUkVTRVQgb3JfdHJhbnNmb3JtX2xpbWl0OworCiAtLSBjdGlkID0gU2NhbGFyQXJy YXlPcCAtIGltcGxlbWVudGVkIGFzIHRpZHNjYW4KIEVYUExBSU4gKENPU1RTIE9GRikKIFNF TEVDVCBjdGlkLCAqIEZST00gdGlkc2NhbiBXSEVSRSBjdGlkID0gQU5ZKEFSUkFZWycoMCwx KScsICcoMCwyKSddOjp0aWRbXSk7CmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQv dHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4 IDhkZTkwYzQ5NTg1Li5iNDBiNTgxMjRiNCAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5k ZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QKQEAgLTE2MzUsNiArMTYzNSw3IEBAIE51bWVyaWNWYXIKIE9NX3VpbnQzMgogT1AKIE9T QVBlckdyb3VwU3RhdGUKK09yQ2xhdXNlR3JvdXBFbnRyeQogT1NBUGVyUXVlcnlTdGF0ZQog T1NJbmZvCiBPU1NMQ2lwaGVyCgo= --------------elxnIKGlnzPwfCbctgsYYzZn--