Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pEZIZ-0007gC-5E for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Jan 2023 17:17:31 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pEZIX-0006qn-4Z for pgsql-hackers@arkaria.postgresql.org; Sun, 08 Jan 2023 17:17:29 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1pEZIW-0006qe-8a for pgsql-hackers@lists.postgresql.org; Sun, 08 Jan 2023 17:17:28 +0000 Received: from mail-pl1-x631.google.com ([2607:f8b0:4864:20::631]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pEZIS-00024G-TY for pgsql-hackers@lists.postgresql.org; Sun, 08 Jan 2023 17:17:27 +0000 Received: by mail-pl1-x631.google.com with SMTP id p24so7008611plw.11 for ; Sun, 08 Jan 2023 09:17:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=in-reply-to:to:from:references:cc:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=vLvjqe6Ncr4e/JeKCtl0H1ylQiF07PGM5ePb2TwjzPc=; b=Rq/kYBja7+3xLH2d1artNJL5Qm+0F3glknw/Y9Dhr+VvuDcBBkRmBTMkUpRt1CyQbg FjxklapEkIPYRsVWystiBuCbgtLlGj6ePeCunl8HhwX5xJnvvRloR+qd2wYloTpWI60A ZI3xY+ZMJAPHoNSl0G3GkuJJJMxeu9yzOGU0iboUfOIUBlEawaQMWGIJKU523ZmpC/cT 5nfiNUQLfNI2ZH5dp1EddpGbLgO86DHXe3nTzrzZcSn9wgSKFR2/iprjYC7HMMOtT07L ge6IXQG+tNZtcKEKeyaTwo13RPaFLY4YbPceGMSO4sfSlnxsVZj0W4vK0bVBY1tOWzX0 NCfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:to:from:references:cc:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=vLvjqe6Ncr4e/JeKCtl0H1ylQiF07PGM5ePb2TwjzPc=; b=BQnwVIRQ73ORAydf2SG2y2BaC2paV3+dA9ph9w9tTbSGX4iOH3MqfMtut+NwZvfl4J E8AjK2/8+FUu23ZRPGIBXx071hb7zwCosGXWXntmJnrX6fB0xB15Wzg5Derov33zTINe qP670sQDhGK4E1VcTgSTUZ1TbwAFy7UdSN2dZWw2+8d+UgN4+ZFxi3blTeOkwsSh8GA2 W8GPoqTrs92rPKv2+Ke3MsOqErR1nqwySsSKuexWhBkslwOm16i2PDn/bu001Rh1BgxQ aaWRGJqexso6HrasFc2duUlAYJ6375RVZphLr2FMGiKsadx7aYTwkZsJUoIFbYaso+Lk o4Gw== X-Gm-Message-State: AFqh2kpke3Sa0bMSXR+pfX3FACck7RuTuCwtyuQ3U54IZhaEBC5IYz5B HEexAnqNASmYR6Gc4LwSkzI= X-Google-Smtp-Source: AMrXdXvb26PRVPK4bfxTBBLEVVm5PnJcdQq9DXX2ovK86GdHQD3kHF/LFywXyPVq7cZLZobNDkz1vQ== X-Received: by 2002:a17:902:7c95:b0:192:a04b:76be with SMTP id y21-20020a1709027c9500b00192a04b76bemr40091026pll.25.1673198243439; Sun, 08 Jan 2023 09:17:23 -0800 (PST) Received: from [10.0.2.15] ([117.96.12.74]) by smtp.gmail.com with ESMTPSA id a10-20020a170902ecca00b001891a17bd93sm4481213plh.43.2023.01.08.09.17.21 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 08 Jan 2023 09:17:22 -0800 (PST) Content-Type: multipart/mixed; boundary="------------L5uZwkqpTjDazOYEqCCJV2AQ" Message-ID: <8d0b24ce-f8ba-cd63-82ae-be853b4067e8@gmail.com> Date: Sun, 8 Jan 2023 22:47:19 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Subject: Re: Todo: Teach planner to evaluate multiple windows in the optimal order Content-Language: en-US Cc: pghackers , Vik Fearing References: <83d80853-a45c-d85c-68eb-59acfe7fb5fb@gmail.com> <7f77ee7d-bd04-d8e2-bb34-42395fd1f7c2@gmail.com> <6ebcc137-45ea-6373-e3e1-3c304c452e1f@gmail.com> <441d135e-1941-c3ef-1649-18c3e8811549@postgresfriends.org> <9620d994-b89a-2dcf-fca5-821e19d56858@gmail.com> <01248493-182b-0f92-f2f2-ff28dc4b2e83@gmail.com> <2040c902-32b1-46c8-0b26-d3f43a16b9bb@gmail.com> <12f6ef19-e06e-8ea9-ad98-3fd92afb7f0b@gmail.com> From: Ankit Kumar Pandey To: David Rowley In-Reply-To: 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. --------------L5uZwkqpTjDazOYEqCCJV2AQ Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit > On 08/01/23 16:33, David Rowley wrote: > On Sun, 8 Jan 2023 at 23:21, Ankit Kumar Pandey wrote: >> Please find attached patch with addressed issues mentioned before. > > Here's a quick review: > > 1. You can use foreach_current_index(l) to obtain the index of the list element. > > 2. I'd rather see you looping backwards over the list in the first > loop. I think it'll be more efficient to loop backwards as you can > just break out the loop when you see the pathkeys are not contained in > the order by pathkreys. When the optimisation does not apply that > means you only need to look at the last item in the list. You could > maybe just invent foreach_reverse() for this purpose and put it in > pg_list.h. That'll save having to manually code up the loop. > > 3. I don't think you should call the variable > enable_order_by_pushdown. We've a bunch of planner related GUCs that > start with enable_. That might cause a bit of confusion. Maybe just > try_sort_pushdown. > > 4. You should widen the scope of orderby_pathkeys and set it within > the if (enable_order_by_pushdown) scope. You can reuse this again in > the 2nd loop too. Just initialise it to NIL > > 5. You don't seem to be checking all WindowClauses for a runCondtion. > If you do #2 above then you can start that process in the initial > reverse loop so that you've checked them all by the time you get > around to that WindowClause again in the 2nd loop. > > 6. The test with "+-- Do not perform additional sort if column is > presorted". I don't think "additional" is the correct word here. I > think you want to ensure that we don't push down the ORDER BY below > the WindowAgg for this case. There is no ability to reduce the sorts > here, only move them around, which we agreed we don't want to do for > this case. I have addressed all points 1-6 in the attached patch. I have one doubt regarding runCondition, do we only need to ensure that window function which has subset sort clause of main query should not have runCondition or none of the window functions should not contain runCondition? I have gone with later case but wanted to clarify. > Also, do you want to have a go at coding up the sort bound pushdown > too? It'll require removing the limitCount restriction and adjusting > ExecSetTupleBound() to recurse through a WindowAggState. I think it's > pretty easy. You could try it then play around with it to make sure it > works and we get the expected performance. I tried this in the patch but kept getting `retrieved too many tuples in a bounded sort`. Added following code in ExecSetTupleBound which correctly found sortstate and set bound value. else if(IsA(child_node, WindowAggState)) { WindowAggState *winstate = (WindowAggState *) child_node; if (outerPlanState(winstate)) ExecSetTupleBound(tuples_needed, outerPlanState(winstate)); } I think problem is that are not using limit clause inside window function (which may need to scan all tuples) so passing bound value to WindowAggState->sortstate is not working as we might expect. Or maybe I am getting it wrong? I was trying to have top-N sort for limit clause if orderby pushdown happens. > You'll likely want to add a few more rows than the last performance test you did or run the query > with pgbench. Running a query once that only takes 1-2ms is likely not > a reliable way to test the performance of something. I did some profiling. CREATE TABLE empsalary1 ( depname varchar, empno bigint, salary int, enroll_date date ); INSERT INTO empsalary1(depname, empno, salary, enroll_date) SELECT string_agg (substr('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', ceil (random() * 62)::integer, 1000), '') AS depname, generate_series(1, 10000000) AS empno, ceil (random()*10000)::integer AS salary , NOW() + (random() * (interval '90 days')) + '30 days' AS enroll_date; 1) Optimization case EXPLAIN (ANALYZE) SELECT empno, depname, min(salary) OVER (PARTITION BY depname ORDER BY empno) depminsalary, sum(salary) OVER (PARTITION BY depname) depsalary, count(*) OVER (ORDER BY enroll_date DESC) c FROM empsalary1 ORDER BY depname, empno, enroll_date; EXPLAIN (ANALYZE) SELECT empno, depname, min(salary) OVER (PARTITION BY depname) depminsalary FROM empsalary1 ORDER BY depname, empno; In patched version: QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- ----------------------- WindowAgg (cost=93458.04..93458.08 rows=1 width=61) (actual time=149996.006..156756.995 rows=10000000 loops=1) -> WindowAgg (cost=93458.04..93458.06 rows=1 width=57) (actual time=108559.126..135892.188 rows=10000000 loops=1) -> Sort (cost=93458.04..93458.04 rows=1 width=53) (actual time=108554.213..112564.168 rows=10000000 loops=1) Sort Key: depname, empno, enroll_date Sort Method: external merge Disk: 645856kB -> WindowAgg (cost=93458.01..93458.03 rows=1 width=53) (actual time=30386.551..62357.669 rows=10000000 lo ops=1) -> Sort (cost=93458.01..93458.01 rows=1 width=45) (actual time=23260.104..26313.395 rows=10000000 l oops=1) Sort Key: enroll_date DESC Sort Method: external merge Disk: 528448kB -> Seq Scan on empsalary1 (cost=0.00..93458.00 rows=1 width=45) (actual time=0.032..4833.603 rows=10000000 loops=1) Planning Time: 4.693 ms Execution Time: 158161.281 ms QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- ------------- WindowAgg (cost=1903015.63..2078015.74 rows=10000006 width=39) (actual time=40565.305..46598.984 rows=10000000 loops=1) -> Sort (cost=1903015.63..1928015.65 rows=10000006 width=39) (actual time=23411.837..27467.962 rows=10000000 loops=1) Sort Key: depname, empno Sort Method: external merge Disk: 528448kB -> Seq Scan on empsalary1 (cost=0.00..193458.06 rows=10000006 width=39) (actual time=5.095..5751.675 rows=10000 000 loops=1) Planning Time: 0.099 ms Execution Time: 47415.926 ms In master: QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- ------------------------------------- Incremental Sort (cost=3992645.36..4792645.79 rows=10000006 width=59) (actual time=147130.132..160985.373 rows=10000000 loops=1) Sort Key: depname, empno, enroll_date Presorted Key: depname, empno Full-sort Groups: 312500 Sort Method: quicksort Average Memory: 28kB Peak Memory: 28kB -> WindowAgg (cost=3992645.31..4342645.52 rows=10000006 width=59) (actual time=147129.936..154023.147 rows=10000000 l oops=1) -> WindowAgg (cost=3992645.31..4192645.43 rows=10000006 width=55) (actual time=104665.289..133089.188 rows=1000 0000 loops=1) -> Sort (cost=3992645.31..4017645.33 rows=10000006 width=51) (actual time=104665.257..108710.282 rows=100 00000 loops=1) Sort Key: depname, empno Sort Method: external merge Disk: 645856kB -> WindowAgg (cost=1971370.63..2146370.74 rows=10000006 width=51) (actual time=28314.300..59737.949 rows=10000000 loops=1) -> Sort (cost=1971370.63..1996370.65 rows=10000006 width=43) (actual time=21190.188..24098.59 6 rows=10000000 loops=1) Sort Key: enroll_date DESC Sort Method: external merge Disk: 528448kB -> Seq Scan on empsalary1 (cost=0.00..193458.06 rows=10000006 width=43) (actual time=0. 630..5317.862 rows=10000000 loops=1) Planning Time: 0.982 ms Execution Time: 163369.242 ms (16 rows) QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- ------------------- Incremental Sort (cost=3787573.31..3912573.41 rows=10000006 width=39) (actual time=51547.195..53950.034 rows=10000000 lo ops=1) Sort Key: depname, empno Presorted Key: depname Full-sort Groups: 1 Sort Method: quicksort Average Memory: 30kB Peak Memory: 30kB Pre-sorted Groups: 1 Sort Method: external merge Average Disk: 489328kB Peak Disk: 489328kB -> WindowAgg (cost=1903015.63..2078015.74 rows=10000006 width=39) (actual time=33413.954..39771.262 rows=10000000 loo ps=1) -> Sort (cost=1903015.63..1928015.65 rows=10000006 width=39) (actual time=18991.129..21992.353 rows=10000000 lo ops=1) Sort Key: depname Sort Method: external merge Disk: 528456kB -> Seq Scan on empsalary1 (cost=0.00..193458.06 rows=10000006 width=39) (actual time=1.300..5269.729 rows =10000000 loops=1) Planning Time: 4.506 ms Execution Time: 54768.697 ms 2) No optimization case: EXPLAIN (ANALYZE) SELECT empno, depname, min(salary) OVER (PARTITION BY depname ORDER BY empno) depminsalary FROM empsalary1 ORDER BY enroll_date; Patch: QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- --------------------------------  Sort  (cost=3968191.79..3993191.80 rows=10000006 width=43) (actual time=57863.173..60976.324 rows=10000000 loops=1)    Sort Key: enroll_date    Sort Method: external merge  Disk: 528448kB    ->  WindowAgg  (cost=850613.62..2190279.21 rows=10000006 width=43) (actual time=7478.966..42502.541 rows=10000000 loops =1)          ->  Gather Merge  (cost=850613.62..2015279.11 rows=10000006 width=43) (actual time=7478.935..18037.001 rows=10000 000 loops=1)                Workers Planned: 2                Workers Launched: 2                ->  Sort  (cost=849613.60..860030.27 rows=4166669 width=43) (actual time=7349.101..9397.713 rows=3333333 lo ops=3)                      Sort Key: depname, empno                      Sort Method: external merge  Disk: 181544kB                      Worker 0:  Sort Method: external merge  Disk: 169328kB                      Worker 1:  Sort Method: external merge  Disk: 177752kB                      ->  Parallel Seq Scan on empsalary1 (cost=0.00..135124.69 rows=4166669 width=43) (actual time=0.213. .2450.635 rows=3333333 loops=3)  Planning Time: 0.100 ms  Execution Time: 63341.783 ms master: QUERY PLAN -------------------------------------------------------------------------------------------------------------------------- --------------------------------  Sort  (cost=3968191.79..3993191.80 rows=10000006 width=43) (actual time=54097.880..57000.806 rows=10000000 loops=1)    Sort Key: enroll_date    Sort Method: external merge  Disk: 528448kB    ->  WindowAgg  (cost=850613.62..2190279.21 rows=10000006 width=43) (actual time=7075.245..39200.756 rows=10000000 loops =1)          ->  Gather Merge  (cost=850613.62..2015279.11 rows=10000006 width=43) (actual time=7075.217..15988.922 rows=10000 000 loops=1)                Workers Planned: 2                Workers Launched: 2                ->  Sort  (cost=849613.60..860030.27 rows=4166669 width=43) (actual time=6993.974..8799.701 rows=3333333 lo ops=3)                      Sort Key: depname, empno                      Sort Method: external merge  Disk: 171904kB                      Worker 0:  Sort Method: external merge  Disk: 178496kB                      Worker 1:  Sort Method: external merge  Disk: 178224kB                      ->  Parallel Seq Scan on empsalary1 (cost=0.00..135124.69 rows=4166669 width=43) (actual time=0.044. .2683.598 rows=3333333 loops=3)  Planning Time: 5.718 ms  Execution Time: 59188.469 ms (15 rows) Master and patch have same performance as plan is same. pgbench (this is to find average performance): create table empsalary2 as select * from empsalary1 limit 1000; ------------------------------------------------------------------- test.sql SELECT empno, depname, min(salary) OVER (PARTITION BY depname ORDER BY empno) depminsalary, sum(salary) OVER (PARTITION BY depname) depsalary, count(*) OVER (ORDER BY enroll_date DESC) c FROM empsalary2 ORDER BY depname, empno, enroll_date; SELECT empno, depname, min(salary) OVER (PARTITION BY depname) depminsalary FROM empsalary2 ORDER BY depname, empno; ---------------------------------------------------------------------- /usr/local/pgsql/bin/pgbench -d test -c 10 -j 4 -t 1000 -f test.sql Patch: transaction type: test.sql scaling factor: 1 query mode: simple number of clients: 10 number of threads: 4 maximum number of tries: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 number of failed transactions: 0 (0.000%) latency average = 55.262 ms initial connection time = 8.480 ms tps = 180.957685 (without initial connection time) Master: transaction type: test.sql scaling factor: 1 query mode: simple number of clients: 10 number of threads: 4 maximum number of tries: 1 number of transactions per client: 1000 number of transactions actually processed: 10000/10000 number of failed transactions: 0 (0.000%) latency average = 60.489 ms initial connection time = 7.069 ms tps = 165.320205 (without initial connection time) TPS of patched version is higher than that of master's for same set of queries. where optimization is performed. -- Regards, Ankit Kumar Pandey --------------L5uZwkqpTjDazOYEqCCJV2AQ Content-Type: text/x-patch; charset=UTF-8; name="better_windowclause_sorting_dgr-v4.patch" Content-Disposition: attachment; filename="better_windowclause_sorting_dgr-v4.patch" Content-Transfer-Encoding: base64 RnJvbSBmM2RkNWEyN2Y2MzAzMGRlYThkMTUzMDg5NmRhZjRiYTFjOGE1MjY1IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmtpdCBLdW1hciBQYW5kZXkgPGl0c2Fua2l0a3BA Z21haWwuY29tPgpEYXRlOiBTYXQsIDcgSmFuIDIwMjMgMTk6MTA6MjQgKzA1MzAKU3ViamVj dDogW1BBVENIXSBBZGRpdGlvbmFsIHNvcnQgZm9yIHJvb3QncyBvcmRlciBieSBjYW4gYmUg b3B0aW1pemVkIGlmCiBzb3J0aW5nIGZvciBleHRyYSBjb2x1bW5zIGFyZSBwZXJmb3JtZWQg d2hpbGUgc29ydGluZyBmb3Igd2luZG93IGZ1bmN0aW9ucwogKGlmIHNvcnQgY2xhdXNlIG9m IHdpbmRvdyBmdW5jdGlvbnMgYXJlIHN1YnNldCBvZiByb290J3Mgc29ydCBjbGF1c2UpLgoK LS0tCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMgfCAgNjggKysrKysr KysrLQogc3JjL2luY2x1ZGUvbm9kZXMvcGdfbGlzdC5oICAgICAgICAgIHwgIDE0ICsrCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRvdy5vdXQgfCAxODcgKysrKysrKysrKysr KysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsICAgICAg fCAgOTQgKysrKysrKysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMzYyIGluc2VydGlvbnMo KyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9wbGFubmVyLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubmVyLmMK aW5kZXggMDAwZDc1N2JkZC4uMTBkNjhlMmZjMyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vcGxhbm5lci5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL3BsYW5uZXIuYwpAQCAtNDQyMyw2ICs0NDIzLDEzIEBAIGNyZWF0ZV9vbmVfd2luZG93 X3BhdGgoUGxhbm5lckluZm8gKnJvb3QsCiAJUGF0aFRhcmdldCAqd2luZG93X3RhcmdldDsK IAlMaXN0Q2VsbCAgICpsOwogCUxpc3QJICAgKnRvcHF1YWwgPSBOSUw7CisJYm9vbAkJaGFz X3J1bmNvbmRpdGlvbiA9IGZhbHNlOworCisJTGlzdAkgICAqd2luZG93X3BhdGhrZXlzOwor CUxpc3QJICAgKm9yZGVyYnlfcGF0aGtleXMgPSBOSUw7CisJaW50CQkJaW5kZXggPSAwOwor CWludAkJCWk7CisJYm9vbAkJdHJ5X3NvcnRfcHVzaGRvd24gPSBmYWxzZTsKIAogCS8qCiAJ ICogU2luY2UgZWFjaCB3aW5kb3cgY2xhdXNlIGNvdWxkIHJlcXVpcmUgYSBkaWZmZXJlbnQg c29ydCBvcmRlciwgd2Ugc3RhY2sKQEAgLTQ0NDEsMTAgKzQ0NDgsNDEgQEAgY3JlYXRlX29u ZV93aW5kb3dfcGF0aChQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAl3aW5kb3dfdGFyZ2V0 ID0gaW5wdXRfdGFyZ2V0OwogCisJdHJ5X3NvcnRfcHVzaGRvd24gPSAocm9vdC0+cGFyc2Ut PmRpc3RpbmN0Q2xhdXNlID09IE5JTCAmJgorCQkJCQkJCQlyb290LT5wYXJzZS0+c29ydENs YXVzZSAhPSBOSUwgJiYKKwkJCQkJCQkJcm9vdC0+cGFyc2UtPmxpbWl0Q291bnQgPT0gTlVM TCAmJgorCQkJCQkJCQkhY29udGFpbl93aW5kb3dfZnVuY3Rpb24oKE5vZGUgKikgZ2V0X3Nv cnRncm91cGxpc3RfZXhwcnMocm9vdC0+cGFyc2UtPnNvcnRDbGF1c2UsCisJCQkJCQkJCQkJ CQkJCQkJCSAgcm9vdC0+cHJvY2Vzc2VkX3RsaXN0KSkpOworCisKKwlpZiAodHJ5X3NvcnRf cHVzaGRvd24pCisJeworCQkvKgorCQkgKiBTZWFyY2ggZm9yIHRoZSB3aW5kb3cgZnVuY3Rp b24gd2hvc2UgcGF0aCBrZXlzIGFyZQorCQkgKiBzdWJzZXQgb2Ygb3JkZXJieV9wYXRoIGtl eXMsIHRoaXMgYWxsb3dzIHVzIHRvIHBlcmZvcm0KKwkJICogb3JkZXIgYnkgcHVzaGRvd24g ZnJvbSB0aGlzIHBvc2l0aW9uIG9mIHdpbmRvdyBmdW5jdGlvbiBvbndhcmRzCisJCSAqLwor CQlmb3JlYWNoX3JldmVyc2UobCwgYWN0aXZlV2luZG93cykKKwkJeworCQkJV2luZG93Q2xh dXNlICp3YyA9IGxmaXJzdF9ub2RlKFdpbmRvd0NsYXVzZSwgbCk7CisJCQlvcmRlcmJ5X3Bh dGhrZXlzID0gbWFrZV9wYXRoa2V5c19mb3Jfc29ydGNsYXVzZXMocm9vdCwKKwkJCQkJCQkJ CQkJCQkJCSByb290LT5wYXJzZS0+c29ydENsYXVzZSwKKwkJCQkJCQkJCQkJCQkJCSByb290 LT5wcm9jZXNzZWRfdGxpc3QpOworCQkJd2luZG93X3BhdGhrZXlzID0gbWFrZV9wYXRoa2V5 c19mb3Jfd2luZG93KHJvb3QsCisJCQkJCQkJCQkJCQkJCXdjLAorCQkJCQkJCQkJCQkJCQly b290LT5wcm9jZXNzZWRfdGxpc3QpOworCQkJaGFzX3J1bmNvbmRpdGlvbiB8PSAod2MtPnJ1 bkNvbmRpdGlvbiAhPSBOSUwpOworCQkJaWYgKCFwYXRoa2V5c19jb250YWluZWRfaW4od2lu ZG93X3BhdGhrZXlzLCBvcmRlcmJ5X3BhdGhrZXlzKSB8fCBoYXNfcnVuY29uZGl0aW9uKQor CQkJCWJyZWFrOworCisJCQlpbmRleCA9IGZvcmVhY2hfY3VycmVudF9pbmRleChsKTsKKwkJ fQorCX0KKworCWk9MDsKIAlmb3JlYWNoKGwsIGFjdGl2ZVdpbmRvd3MpCiAJewogCQlXaW5k b3dDbGF1c2UgKndjID0gbGZpcnN0X25vZGUoV2luZG93Q2xhdXNlLCBsKTsKLQkJTGlzdAkg ICAqd2luZG93X3BhdGhrZXlzOwogCQlpbnQJCQlwcmVzb3J0ZWRfa2V5czsKIAkJYm9vbAkJ aXNfc29ydGVkOwogCQlib29sCQl0b3B3aW5kb3c7CkBAIC00NDU3LDYgKzQ0OTUsMzQgQEAg Y3JlYXRlX29uZV93aW5kb3dfcGF0aChQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJ CXBhdGgtPnBhdGhrZXlzLAogCQkJCQkJCQkJCQkJJnByZXNvcnRlZF9rZXlzKTsKIAorCQkv KgorCQkgKiBJZiBub3Qgc29ydGVkIGFscmVhZHkgYW5kIHRoZSBxdWVyeSBoYXMgYW4gT1JE RVIgQlkgY2xhdXNlLCB0aGVuIHdlCisJCSAqIHRyeSB0byBwdXNoIHRoZSBlbnRpcmUgT1JE RVIgQlkgYmVsb3cgdGhlIGZpbmFsIFdpbmRvd0FnZy4gIFdlCisJCSAqIGRvbid0IGRvIHRo aXMgd2hlbiB0aGUgcXVlcnkgaGFzIGEgRElTVElOQ1QgY2xhdXNlIGFzIHRoZSBwbGFubmVy CisJCSAqIG1pZ2h0IG9wdCB0byBkbyBhIEhhc2ggQWdncmVnYXRlIGFuZCBzcG9pbCBvdXIg ZWZmb3J0cyBoZXJlLiAgV2UKKwkJICogYWxzbyBjYW4ndCBkbyB0aGlzIHdoZW4gdGhlIE9S REVSIEJZIGNvbnRhaW5zIGFueSBXaW5kb3dGdW5jcyBhcyB3ZQorCQkgKiBvYnZpb3VzbHkg Y2FuJ3Qgc29ydCBzb21ldGhpbmcgdGhhdCdzIHlldCB0byBiZSBldmFsdWF0ZWQuICBXZSBh bHNvCisJCSAqIGRvbid0IGJvdGhlciB3aXRoIHRoaXMgd2hlbiB0aGVyZSBpcyBhIFdpbmRv d0NsYXVzZXMgd2l0aCBhCisJCSAqIHJ1bkNvbmRpdGlvbiBhcyB0aG9zZSBjYW4gcmVkdWNl IHRoZSBudW1iZXIgb2Ygcm93cyB0byBzb3J0IGluIHRoZQorCQkgKiBPUkRFUiBCWSBhbmQg d2UgZG9uJ3Qgd2FudCBhZGQgY29tcGxleGl0eSB0byB0aGUgV2luZG93QWdnIHNvcnQgaWYK KwkJICogdGhlIGZpbmFsIE9SREVSIEJZIHNvcnQgaXMgZ29pbmcgdG8gaGF2ZSBmYXIgZmV3 ZXIgcm93cyB0byBzb3J0LgorCQkgKiBGb3IgdGhlIHNhbWUgcmVhc29uLCBkb24ndCBib3Ro ZXIgaWYgdGhlIHF1ZXJ5IGhhcyBhIExJTUlUIGNsYXVzZS4KKwkJICovCisJCWlmICh0cnlf c29ydF9wdXNoZG93biAmJiAhaXNfc29ydGVkICYmIChpID09IGluZGV4KSkKKwkJeworCQkJ b3JkZXJieV9wYXRoa2V5cyA9IG1ha2VfcGF0aGtleXNfZm9yX3NvcnRjbGF1c2VzKHJvb3Qs CisJCQkJCQkJCQkJCQkJCQkgcm9vdC0+cGFyc2UtPnNvcnRDbGF1c2UsCisJCQkJCQkJCQkJ CQkJCQkgcm9vdC0+cHJvY2Vzc2VkX3RsaXN0KTsKKworCQkJaWYgKHBhdGhrZXlzX2NvbnRh aW5lZF9pbih3aW5kb3dfcGF0aGtleXMsIG9yZGVyYnlfcGF0aGtleXMpKQorCQkJCXdpbmRv d19wYXRoa2V5cyA9IG9yZGVyYnlfcGF0aGtleXM7CisKKwkJCWlzX3NvcnRlZCA9IHBhdGhr ZXlzX2NvdW50X2NvbnRhaW5lZF9pbih3aW5kb3dfcGF0aGtleXMsCisJCQkJCQkJCQkJCQkJ cGF0aC0+cGF0aGtleXMsCisJCQkJCQkJCQkJCQkJJnByZXNvcnRlZF9rZXlzKTsKKwkJfQor CQlpKys7CisKIAkJLyogU29ydCBpZiBuZWNlc3NhcnkgKi8KIAkJaWYgKCFpc19zb3J0ZWQp CiAJCXsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL3BnX2xpc3QuaCBiL3NyYy9p bmNsdWRlL25vZGVzL3BnX2xpc3QuaAppbmRleCA1MjlhMzgyZDI4Li44MmQxMDhmNjcyIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wZ19saXN0LmgKKysrIGIvc3JjL2luY2x1 ZGUvbm9kZXMvcGdfbGlzdC5oCkBAIC0zNzgsNiArMzc4LDIwIEBAIGxuZXh0KGNvbnN0IExp c3QgKmwsIGNvbnN0IExpc3RDZWxsICpjKQogCQkgKGNlbGwgPSBOVUxMLCBmYWxzZSk7IFwK IAkJIGNlbGwjI19fc3RhdGUuaSsrKQogCisvKgorICogZm9yZWFjaF9yZXZlcnNlIC0KKyAq CSAgYSBjb252ZW5pZW5jZSBtYWNybyBmb3IgbG9vcGluZyB0aHJvdWdoIGEgbGlzdCBpbiBy ZXZlcnNlCisgKgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIGZvcmVhY2gsIG9ubHkgaW4g cmV2ZXJzZQorICovCisjZGVmaW5lIGZvcmVhY2hfcmV2ZXJzZShjZWxsLCBsc3QpCVwKKwlm b3IgKEZvckVhY2hTdGF0ZSBjZWxsIyNfX3N0YXRlID0geyhsc3QpLCBjZWxsIyNfX3N0YXRl LmwtPmxlbmd0aC0xfTsgXAorCQkgKGNlbGwjI19fc3RhdGUubCAhPSBOSUwgJiYgXAorCQkg IGNlbGwjI19fc3RhdGUuaSA+PSAwKSA/IFwKKwkJIChjZWxsID0gJmNlbGwjI19fc3RhdGUu bC0+ZWxlbWVudHNbY2VsbCMjX19zdGF0ZS5pXSwgdHJ1ZSkgOiBcCisJCSAoY2VsbCA9IE5V TEwsIGZhbHNlKTsgXAorCQkgY2VsbCMjX19zdGF0ZS5pLS0pCisKIC8qCiAgKiBmb3JlYWNo X2RlbGV0ZV9jdXJyZW50IC0KICAqCSAgZGVsZXRlIHRoZSBjdXJyZW50IGxpc3QgZWxlbWVu dCBmcm9tIHRoZSBMaXN0IGFzc29jaWF0ZWQgd2l0aCBhCmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRvdy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3dpbmRvdy5vdXQKaW5kZXggOTBlODlmYjViNi4uZDgzZmVhODA5MSAxMDA2NDQKLS0t IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0CisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dApAQCAtMzk4Miw3ICszOTgyLDE5NCBAQCBP UkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKICgxMSByb3dzKQogCistLSBEbyBub3Qg cGVyZm9ybSBzb3J0IHB1c2hkb3duIGlmIGNvbHVtbiBpcyBwcmVzb3J0ZWQKK0NSRUFURSBJ TkRFWCBkZXBuYW1lX2lkeCBPTiBlbXBzYWxhcnkoZGVwbmFtZSk7CitTRVQgZW5hYmxlX3Nl cXNjYW49MDsKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywKKyAgICAgICAg bWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcG1pbnNhbGFyeQor RlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5hbWUsIGVtcG5vOworICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluY3Jl bWVudGFsIFNvcnQKKyAgIFNvcnQgS2V5OiBkZXBuYW1lLCBlbXBubworICAgUHJlc29ydGVk IEtleTogZGVwbmFtZQorICAgLT4gIFdpbmRvd0FnZworICAgICAgICAgLT4gIEluZGV4IFNj YW4gdXNpbmcgZGVwbmFtZV9pZHggb24gZW1wc2FsYXJ5CisoNSByb3dzKQorCistLSBEbyBw ZXJmb3JtIHNvcnQgcHVzaGRvd24gaWYgY29sdW1ucyBhcmUgb25seSBwYXJ0aWFsbHkgc29y dGVkCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgIG1pbihz YWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lLCBlbXBubykgZGVwbWluc2FsYXJ5 CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRl OworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFdpbmRvd0FnZworICAgLT4gIEluY3JlbWVudGFsIFNvcnQKKyAgICAgICAg IFNvcnQgS2V5OiBkZXBuYW1lLCBlbXBubywgZW5yb2xsX2RhdGUKKyAgICAgICAgIFByZXNv cnRlZCBLZXk6IGRlcG5hbWUKKyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGRlcG5h bWVfaWR4IG9uIGVtcHNhbGFyeQorKDUgcm93cykKKworRFJPUCBJTkRFWCBkZXBuYW1lX2lk eDsKK1JFU0VUIGVuYWJsZV9zZXFzY2FuOwogUkVTRVQgZW5hYmxlX2hhc2hhZ2c7CistLSBJ ZiB3aW5kb3cgZnVuY3Rpb24ncyBPUkRFUiBCWSBpcyBzdWJzZXQgb2YgUVVFUlkncyBPUkRF UiBCWSwgc29ydCBhcyBwZXIgYXMKKy0tIFFVRVJZJ3MgT1JERVIgQlkgdG8gc2F2ZSBhZGRp dGlvbmFsIHNvcnRpbmcgaW4gdGhlIGVuZAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU IGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoT1JE RVIgQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkg ZGVwbmFtZSwgZW1wbm87CisgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBXaW5kb3dBZ2cKKyAgIC0+ ICBTb3J0CisgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8KKyAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKKyg0IHJvd3MpCisKKy0tIFNhbWUgYXMgYWJvdmUs IGJ1dCBQQVJUSVRJT04gQlkgY2xhdXNlIGlzIGluY2x1ZGVkIGFzIHdlbGwKK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAorICAgICAgIG1p bihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lIE9SREVSIEJZIGVtcG5vKSBk ZXBtaW5zYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBkZXBuYW1lLCBlbXBubywg ZW5yb2xsX2RhdGU7CisgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBXaW5kb3dBZ2cKKyAgIC0+ICBTb3J0CisgICAgICAgICBTb3J0IEtleTogZGVwbmFt ZSwgZW1wbm8sIGVucm9sbF9kYXRlCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2Fs YXJ5CisoNCByb3dzKQorCistLSBOZWdhdGlvbiBvZiBhYm92ZSwgd2hlbiBzb3J0IG9wdGlt aXphdGlvbiBpcyBub3QgbmVlZGVkIHRvIGJlIHBlcmZvcm1lZAorRVhQTEFJTiAoQ09TVFMg T0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFy eSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUgT1JERVIgQlkgZW1wbm8pIGRlcG1pbnNh bGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGVtcG5vLCBlbnJvbGxfZGF0ZTsKKyAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNvcnQKKyAgIFNvcnQgS2V5OiBlbXBu bywgZW5yb2xsX2RhdGUKKyAgIC0+ICBXaW5kb3dBZ2cKKyAgICAgICAgIC0+ICBTb3J0Cisg ICAgICAgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8KKyAgICAgICAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKKyg2IHJvd3MpCisKKy0tIE9SREVSIEJZJ3Mg aW4gbXVsdGlwbGUgV2luZG93IGZ1bmN0aW9ucyBjYW4gYmUgY29tYmluZWQgaW50byBvbmUK Ky0tIGlmIHRoZXkgYXJlIHN1YnNldCBvZiBRVUVSWSdzIE9SREVSIEJZCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgZGVwbmFtZSwKKyAgICAgICBtaW4o c2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykgZGVw bWluc2FsYXJ5LAorICAgICAgIHN1bShzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBu YW1lKSBkZXBzYWxhcnksCisgICAgICAgY291bnQoKikgT1ZFUiAoT1JERVIgQlkgZW5yb2xs X2RhdGUgREVTQykgYworRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5hbWUsIGVtcG5v LCBlbnJvbGxfZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgV2luZG93QWdnCisgICAtPiAgV2luZG93QWdnCisgICAg ICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUsIGVtcG5v LCBlbnJvbGxfZGF0ZQorICAgICAgICAgICAgICAgLT4gIFdpbmRvd0FnZworICAgICAgICAg ICAgICAgICAgICAgLT4gIFNvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnQg S2V5OiBlbnJvbGxfZGF0ZSBERVNDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAg U2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoOCByb3dzKQorCistLSBvcmRlciBvZiB3aW5kb3cg ZnVuY3Rpb24gc2hvdWxkbid0IGFmZmVjdCBxdWVyeSdzIE9SREVSIEJZIHB1c2hkb3duCitF WFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgZGVwbmFtZSwKKyAg ICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVNDKSBjLAorICAg ICAgIHN1bShzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBzYWxhcnks CisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUgT1JERVIg QlkgZW1wbm8pIGRlcG1pbnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5h bWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV2luZG93QWdnCisgICAtPiAgV2luZG93 QWdnCisgICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgU29ydCBLZXk6IGRlcG5h bWUsIGVtcG5vLCBlbnJvbGxfZGF0ZQorICAgICAgICAgICAgICAgLT4gIFdpbmRvd0FnZwor ICAgICAgICAgICAgICAgICAgICAgLT4gIFNvcnQKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIFNvcnQgS2V5OiBlbnJvbGxfZGF0ZSBERVNDCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoOCByb3dzKQorCistLSBTT1JUIE9Q VElNSVpBVElPTiAoYXMgaW4gY2FzZXMgYWJvdmUpIGlzIG5vdCBuZWVkZWQgdG8gYmUgcGVy Zm9ybWVkCistLSBpbiBjYXNlcywgYXMgbWVudGlvbmVkIGJlbG93LgorLS0gQ2FzZSAjMTog V2hlbiBkaXN0aW5jdCBjbGF1c2UgaXMgaW5jbHVkZWQKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCBESVNUSU5DVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAorICAgICAgIG1pbihz YWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBtaW5zYWxhcnksCisgICAg ICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwK KyAgICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVNDKSBjCitG Uk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVW5pcXVlCisgICAtPiAgU29y dAorICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUsIGVtcG5vLCAobWluKHNhbGFyeSkgT1ZF UiAoPykpLCAoc3VtKHNhbGFyeSkgT1ZFUiAoPykpLCAoY291bnQoKikgT1ZFUiAoPykpCisg ICAgICAgICAtPiAgV2luZG93QWdnCisgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAg ICAgICAgICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUKKyAgICAgICAgICAgICAgICAgICAg IC0+ICBXaW5kb3dBZ2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTb3J0Cisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IEtleTogZW5yb2xsX2RhdGUg REVTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IGVtcHNhbGFyeQorKDEwIHJvd3MpCisKKy0tIENhc2UgIzI6IFdoZW4gTGltaXQgY2xhdXNl IGlzIHNwZWNpZmllZAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAg ICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGVt cG5vKSBkZXBtaW5zYWxhcnksCisgICAgICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9O IEJZIGVtcG5vKSBkZXBzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBlbXBubywg ZGVwbmFtZSBMSU1JVCAxOworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgTGltaXQKKyAgIC0+ICBJbmNyZW1lbnRhbCBTb3J0CisgICAgICAgICBTb3J0 IEtleTogZW1wbm8sIGRlcG5hbWUKKyAgICAgICAgIFByZXNvcnRlZCBLZXk6IGVtcG5vCisg ICAgICAgICAtPiAgV2luZG93QWdnCisgICAgICAgICAgICAgICAtPiAgU29ydAorICAgICAg ICAgICAgICAgICAgICAgU29ydCBLZXk6IGVtcG5vCisgICAgICAgICAgICAgICAgICAgICAt PiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoOCByb3dzKQorCistLSBDYXNlICMzOiBXaGVu IE9SREVSIEJZIGNvbnRhaW5zIGFueSBXaW5kb3dGdW5jcworRVhQTEFJTiAoQ09TVFMgT0ZG KQorU0VMRUNUIGVtcG5vLAorICAgICAgIHJvd19udW1iZXIoKSBvdmVyIChQQVJUSVRJT04g QlkgZW1wbm8pIGVzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBlbXBubywgZXNh bGFyeTsKKyAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgCist LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEluY3JlbWVu dGFsIFNvcnQKKyAgIFNvcnQgS2V5OiBlbXBubywgKHJvd19udW1iZXIoKSBPVkVSICg/KSkK KyAgIFByZXNvcnRlZCBLZXk6IGVtcG5vCisgICAtPiAgV2luZG93QWdnCisgICAgICAgICAt PiAgU29ydAorICAgICAgICAgICAgICAgU29ydCBLZXk6IGVtcG5vCisgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoNyByb3dzKQorCiAtLSBUZXN0IFNvcnQg bm9kZSByZW9yZGVyaW5nCiBFWFBMQUlOIChDT1NUUyBPRkYpCiBTRUxFQ1QKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwgYi9zcmMvdGVzdC9yZWdyZXNz L3NxbC93aW5kb3cuc3FsCmluZGV4IGI3YmQwYTgzZGEuLmU5ODllOTM3MzcgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvd2luZG93LnNxbApAQCAtMTMyNCw4ICsxMzI0LDEwMiBAQCBTRUxFQ1QgRElT VElOQ1QKIEZST00gZW1wc2FsYXJ5CiBPUkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKIAorLS0g RG8gbm90IHBlcmZvcm0gc29ydCBwdXNoZG93biBpZiBjb2x1bW4gaXMgcHJlc29ydGVkCitD UkVBVEUgSU5ERVggZGVwbmFtZV9pZHggT04gZW1wc2FsYXJ5KGRlcG5hbWUpOworU0VUIGVu YWJsZV9zZXFzY2FuPTA7CisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywK KyAgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcG1p bnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5hbWUsIGVtcG5vOworCist LSBEbyBwZXJmb3JtIHNvcnQgcHVzaGRvd24gaWYgY29sdW1ucyBhcmUgb25seSBwYXJ0aWFs bHkgc29ydGVkCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAg IG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lLCBlbXBubykgZGVwbWlu c2FsYXJ5CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm8sIGVucm9s bF9kYXRlOworCitEUk9QIElOREVYIGRlcG5hbWVfaWR4OworUkVTRVQgZW5hYmxlX3NlcXNj YW47CiBSRVNFVCBlbmFibGVfaGFzaGFnZzsKIAorLS0gSWYgd2luZG93IGZ1bmN0aW9uJ3Mg T1JERVIgQlkgaXMgc3Vic2V0IG9mIFFVRVJZJ3MgT1JERVIgQlksIHNvcnQgYXMgcGVyIGFz CistLSBRVUVSWSdzIE9SREVSIEJZIHRvIHNhdmUgYWRkaXRpb25hbCBzb3J0aW5nIGluIHRo ZSBlbmQKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywKKyAgICAgICBkZXBu YW1lLAorICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKE9SREVSIEJZIGRlcG5hbWUpIGRlcG1p bnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5hbWUsIGVtcG5vOworCist LSBTYW1lIGFzIGFib3ZlLCBidXQgUEFSVElUSU9OIEJZIGNsYXVzZSBpcyBpbmNsdWRlZCBh cyB3ZWxsCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgZGVw bmFtZSwKKyAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBP UkRFUiBCWSBlbXBubykgZGVwbWluc2FsYXJ5CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkg ZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRlOworCistLSBOZWdhdGlvbiBvZiBhYm92ZSwg d2hlbiBzb3J0IG9wdGltaXphdGlvbiBpcyBub3QgbmVlZGVkIHRvIGJlIHBlcmZvcm1lZAor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisg ICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUgT1JERVIgQlkg ZW1wbm8pIGRlcG1pbnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGVtcG5vLCBl bnJvbGxfZGF0ZTsKKworLS0gT1JERVIgQlkncyBpbiBtdWx0aXBsZSBXaW5kb3cgZnVuY3Rp b25zIGNhbiBiZSBjb21iaW5lZCBpbnRvIG9uZQorLS0gaWYgdGhleSBhcmUgc3Vic2V0IG9m IFFVRVJZJ3MgT1JERVIgQlkKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywK KyAgICAgICBkZXBuYW1lLAorICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBC WSBkZXBuYW1lIE9SREVSIEJZIGVtcG5vKSBkZXBtaW5zYWxhcnksCisgICAgICAgc3VtKHNh bGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwKKyAgICAgICBj b3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVNDKSBjCitGUk9NIGVtcHNh bGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRlOworCistLSBvcmRl ciBvZiB3aW5kb3cgZnVuY3Rpb24gc2hvdWxkbid0IGFmZmVjdCBxdWVyeSdzIE9SREVSIEJZ IHB1c2hkb3duCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAg ZGVwbmFtZSwKKyAgICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBE RVNDKSBjLAorICAgICAgIHN1bShzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1l KSBkZXBzYWxhcnksCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRl cG5hbWUgT1JERVIgQlkgZW1wbm8pIGRlcG1pbnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09S REVSIEJZIGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKKworLS0gU09SVCBPUFRJTUla QVRJT04gKGFzIGluIGNhc2VzIGFib3ZlKSBpcyBub3QgbmVlZGVkIHRvIGJlIHBlcmZvcm1l ZAorLS0gaW4gY2FzZXMsIGFzIG1lbnRpb25lZCBiZWxvdy4KKworLS0gQ2FzZSAjMTogV2hl biBkaXN0aW5jdCBjbGF1c2UgaXMgaW5jbHVkZWQKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCBESVNUSU5DVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAorICAgICAgIG1pbihzYWxh cnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBtaW5zYWxhcnksCisgICAgICAg c3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNhbGFyeSwKKyAg ICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVNDKSBjCitGUk9N IGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CisKKy0tIENhc2UgIzI6IFdo ZW4gTGltaXQgY2xhdXNlIGlzIHNwZWNpZmllZAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAo UEFSVElUSU9OIEJZIGVtcG5vKSBkZXBtaW5zYWxhcnksCisgICAgICAgc3VtKHNhbGFyeSkg T1ZFUiAoUEFSVElUSU9OIEJZIGVtcG5vKSBkZXBzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitP UkRFUiBCWSBlbXBubywgZGVwbmFtZSBMSU1JVCAxOworCistLSBDYXNlICMzOiBXaGVuIE9S REVSIEJZIGNvbnRhaW5zIGFueSBXaW5kb3dGdW5jcworRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUIGVtcG5vLAorICAgICAgIHJvd19udW1iZXIoKSBvdmVyIChQQVJUSVRJT04gQlkg ZW1wbm8pIGVzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBlbXBubywgZXNhbGFy eTsKKwogLS0gVGVzdCBTb3J0IG5vZGUgcmVvcmRlcmluZwogRVhQTEFJTiAoQ09TVFMgT0ZG KQogU0VMRUNUCi0tIAoyLjM3LjIKCg== --------------L5uZwkqpTjDazOYEqCCJV2AQ--