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 1pECKY-0003Bl-Mw for pgsql-hackers@arkaria.postgresql.org; Sat, 07 Jan 2023 16:46:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1pECKW-0004tX-Km for pgsql-hackers@arkaria.postgresql.org; Sat, 07 Jan 2023 16:46:00 +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 1pECKV-0004tH-OV for pgsql-hackers@lists.postgresql.org; Sat, 07 Jan 2023 16:46:00 +0000 Received: from mail-pf1-x434.google.com ([2607:f8b0:4864:20::434]) by makus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.92) (envelope-from ) id 1pECKR-0006bR-Cw for pgsql-hackers@lists.postgresql.org; Sat, 07 Jan 2023 16:45:57 +0000 Received: by mail-pf1-x434.google.com with SMTP id y5so3250633pfe.2 for ; Sat, 07 Jan 2023 08:45:55 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=in-reply-to:references:cc:to:from:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=yl27Y8UDXql0EMM2Y59g+yrIUz3/IdINPwFQLZZjwmk=; b=mr25DB5zPNGVdHcWOZYwRdzW6Itf0O5U5nRh2R9Sz/zEdqn+3NaskJ81k9DCJdtYra ptHgyLBaUShM2dr8U0KuSIRGBjZq4hFDHS9izLn+gUOmiOVq8DtBI86xCL3w+Q4jFyO/ pSYci9Ii28wxFK4avxT2trOEhZnBlIACCm7eHx6OYUlkQvH3wo9GsgXA/eCJf0Zpsdmf 4rmCmNH6E3OMJGUa3GkKpXgLFUfxp/fWPVE70YPYXKlnfZkw9doKxuQ/HXeY8iTzI9TE 8Oycep/GKXCtxxhowLWqaRoiQM0cE5NthnEFNf8bvK5LruWJfa31aGy4M2o/3ksgZg4u cdBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:references:cc:to:from:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=yl27Y8UDXql0EMM2Y59g+yrIUz3/IdINPwFQLZZjwmk=; b=mcW7OrxL9mUG6H75tuo80dmEckT8mYYrQL37xORUalsvQDbkh9u/sinGOZxZK+YpcP DghjZSHEaPZXcynxazOjZnFOeLTA6oAqGmjcb9vFwVA3l2pLcCe2dI3jVp7Ru9zdtAFS jRZgmadDYT6wvNx+HndDBnITDYw+bygF42LmJh4lx3zrRziiNeQe0kYYz963sQFJrDkx mzo2BvbDEJuWtL7CrC4mrqzbJl/9HrUnV7MM/BY6BgIhck6Gi4m0ra3EpSHw/mR3oVL5 IfKY2e9xwzcbpxT0RO2hJXUFRgZ4BwwNyfBhnrTQJ7ZntTGtbxHzjOoKzKA0AsLCJXn9 5CTA== X-Gm-Message-State: AFqh2krN6/RwX8EJQIHMEdPCheUmDuzUoye0QVLFpkgJ5FRPssXgjXtu Mb0Wj5HBhbpjV5pdIm/zsOU= X-Google-Smtp-Source: AMrXdXvDLcD5dROeP6Tw21IJbYJoDTO+6wQxGkC5lst1yavG5ds1FtndVQCHr4HeFJgwqplmWj/BBQ== X-Received: by 2002:a05:6a00:4403:b0:581:dacb:1e6f with SMTP id br3-20020a056a00440300b00581dacb1e6fmr28928018pfb.0.1673109954260; Sat, 07 Jan 2023 08:45:54 -0800 (PST) Received: from [10.0.2.15] ([106.202.139.208]) by smtp.gmail.com with ESMTPSA id d126-20020a623684000000b0058426d9db66sm2931120pfa.218.2023.01.07.08.45.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 07 Jan 2023 08:45:53 -0800 (PST) Content-Type: multipart/mixed; boundary="------------G0cjyM0CRbGkjaeJXpyVcoiH" Message-ID: <295ebbb0-f5b4-f090-b27e-9e069ef7eae1@gmail.com> Date: Sat, 7 Jan 2023 22:15:49 +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 From: Ankit Kumar Pandey To: David Rowley 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> 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. --------------G0cjyM0CRbGkjaeJXpyVcoiH Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 07/01/23 21:57, Ankit Kumar Pandey wrote: > On 07/01/23 09:58, David Rowley wrote: > > > > The attached patch has no tests added. It's going to need some of > > those. > > While writing test cases, I found that optimization do not happen for > case #1 > > (which is prime candidate for such operation) like > > EXPLAIN (COSTS OFF) > SELECT empno, >        depname, >        min(salary) OVER (PARTITION BY depname ORDER BY empno) depminsalary, >        sum(salary) OVER (PARTITION BY depname) depsalary > FROM empsalary > ORDER BY depname, empno, enroll_date > > This happens because mutual exclusiveness of two operands (when number > of window functions > 1) viz > > is_sorted and last activeWindow in the condition: > > ( !is_sorted && lnext(activeWindows, l) == NULL) > > For 2nd last window function, is_sorted is false and path keys get added. > > In next run (for last window function), is_sorted becomes true and whole > optimization > > part is skipped. > > Note: Major issue that if I remove is_sorted from condition, even though > > path keys are added, it still do not perform optimization and works same > as in master/unoptimized case. > > Perhaps adding path keys at last window function is not doing trick? > Maybe we need to add pathkeys > > to all window functions which are subset of query's order by > irrespective of being last or not? > > > Case #2: > > For presorted columns, eg > > CREATE INDEX depname_idx ON empsalary(depname); > SET enable_seqscan=0; > EXPLAIN (COSTS OFF) > SELECT empno, >         min(salary) OVER (PARTITION BY depname) depminsalary > FROM empsalary > ORDER BY depname, empno; > > Is this correct plan: > > a) > >                       QUERY PLAN > ------------------------------------------------------- >  Incremental Sort >    Sort Key: depname, empno >    Presorted Key: depname >    ->  WindowAgg >          ->  Index Scan using depname_idx on empsalary > (5 rows) > > or this: > > b) (Akin to Optimized version) > >                       QUERY PLAN > ------------------------------------------------------- >  WindowAgg >    ->  Incremental Sort >          Sort Key: depname, empno >          Presorted Key: depname >          ->  Index Scan using depname_idx on empsalary > (5 rows) > > Patched version does (a) because of is_sorted condition. > > If we remove both is_sorted and lnext(activeWindows, l) == NULL conditions, > > we get correct results in these two cases. > > Attached patch with test cases. For case #2, test cases still uses (a) as expected output which I don't think is right and we should revisit. Other than that, only failing case is due to issue mentioned in case #1. Thanks -- Regards, Ankit Kumar Pandey --------------G0cjyM0CRbGkjaeJXpyVcoiH Content-Type: text/x-patch; charset=UTF-8; name="better_windowclause_sorting_dgr-v2.patch" Content-Disposition: attachment; filename="better_windowclause_sorting_dgr-v2.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5uZXIuYyBiL3Ny Yy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5uZXIuYwppbmRleCAwMDBkNzU3YmRkLi43 ODE5MTZmMjE5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFu bmVyLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm5lci5jCkBAIC00 NDIzLDYgKzQ0MjMsNyBAQCBjcmVhdGVfb25lX3dpbmRvd19wYXRoKFBsYW5uZXJJbmZvICpy b290LAogCVBhdGhUYXJnZXQgKndpbmRvd190YXJnZXQ7CiAJTGlzdENlbGwgICAqbDsKIAlM aXN0CSAgICp0b3BxdWFsID0gTklMOworCWJvb2wJCWhhc19ydW5jb25kaXRpb24gPSBmYWxz ZTsKIAogCS8qCiAJICogU2luY2UgZWFjaCB3aW5kb3cgY2xhdXNlIGNvdWxkIHJlcXVpcmUg YSBkaWZmZXJlbnQgc29ydCBvcmRlciwgd2Ugc3RhY2sKQEAgLTQ0NTcsNiArNDQ1OCw0MiBA QCBjcmVhdGVfb25lX3dpbmRvd19wYXRoKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJ CQkJcGF0aC0+cGF0aGtleXMsCiAJCQkJCQkJCQkJCQkmcHJlc29ydGVkX2tleXMpOwogCisJ CWhhc19ydW5jb25kaXRpb24gfD0gKHdjLT5ydW5Db25kaXRpb24gIT0gTklMKTsKKworCQkv KgorCQkgKiBJZiBub3Qgc29ydGVkIGFscmVhZHkgYW5kIHRoZSBxdWVyeSBoYXMgYW4gT1JE RVIgQlkgY2xhdXNlLCB0aGVuIHdlCisJCSAqIHRyeSB0byBwdXNoIHRoZSBlbnRpcmUgT1JE RVIgQlkgYmVsb3cgdGhlIGZpbmFsIFdpbmRvd0FnZy4gIFdlCisJCSAqIGRvbid0IGRvIHRo aXMgd2hlbiB0aGUgcXVlcnkgaGFzIGEgRElTVElOQ1QgY2xhdXNlIGFzIHRoZSBwbGFubmVy CisJCSAqIG1pZ2h0IG9wdCB0byBkbyBhIEhhc2ggQWdncmVnYXRlIGFuZCBzcG9pbCBvdXIg ZWZmb3J0cyBoZXJlLiAgV2UKKwkJICogYWxzbyBjYW4ndCBkbyB0aGlzIHdoZW4gdGhlIE9S REVSIEJZIGNvbnRhaW5zIGFueSBXaW5kb3dGdW5jcyBhcyB3ZQorCQkgKiBvYnZpb3VzbHkg Y2FuJ3Qgc29ydCBzb21ldGhpbmcgdGhhdCdzIHlldCB0byBiZSBldmFsdWF0ZWQuICBXZSBh bHNvCisJCSAqIGRvbid0IGJvdGhlciB3aXRoIHRoaXMgd2hlbiB0aGVyZSBpcyBhIFdpbmRv d0NsYXVzZXMgd2l0aCBhCisJCSAqIHJ1bkNvbmRpdGlvbiBhcyB0aG9zZSBjYW4gcmVkdWNl IHRoZSBudW1iZXIgb2Ygcm93cyB0byBzb3J0IGluIHRoZQorCQkgKiBPUkRFUiBCWSBhbmQg d2UgZG9uJ3Qgd2FudCBhZGQgY29tcGxleGl0eSB0byB0aGUgV2luZG93QWdnIHNvcnQgaWYK KwkJICogdGhlIGZpbmFsIE9SREVSIEJZIHNvcnQgaXMgZ29pbmcgdG8gaGF2ZSBmYXIgZmV3 ZXIgcm93cyB0byBzb3J0LgorCQkgKiBGb3IgdGhlIHNhbWUgcmVhc29uLCBkb24ndCBib3Ro ZXIgaWYgdGhlIHF1ZXJ5IGhhcyBhIExJTUlUIGNsYXVzZS4KKwkJICovCisJCWlmICghaXNf c29ydGVkICYmIGxuZXh0KGFjdGl2ZVdpbmRvd3MsIGwpID09IE5VTEwgJiYKKwkJCXJvb3Qt PnBhcnNlLT5kaXN0aW5jdENsYXVzZSA9PSBOSUwgJiYKKwkJCXJvb3QtPnBhcnNlLT5zb3J0 Q2xhdXNlICE9IE5JTCAmJgorCQkJIWhhc19ydW5jb25kaXRpb24gJiYgcm9vdC0+cGFyc2Ut PmxpbWl0Q291bnQgPT0gTlVMTCAmJgorCQkJIWNvbnRhaW5fd2luZG93X2Z1bmN0aW9uKChO b2RlICopIGdldF9zb3J0Z3JvdXBsaXN0X2V4cHJzKHJvb3QtPnBhcnNlLT5zb3J0Q2xhdXNl LAorCQkJCQkJCQkJCQkJCQkJCQkgIHJvb3QtPnByb2Nlc3NlZF90bGlzdCkpKQorCQl7CisJ CQlMaXN0CSAgICpvcmRlcmJ5X3BhdGhrZXlzOworCisJCQlvcmRlcmJ5X3BhdGhrZXlzID0g bWFrZV9wYXRoa2V5c19mb3Jfc29ydGNsYXVzZXMocm9vdCwKKwkJCQkJCQkJCQkJCQkJCSBy b290LT5wYXJzZS0+c29ydENsYXVzZSwKKwkJCQkJCQkJCQkJCQkJCSByb290LT5wcm9jZXNz ZWRfdGxpc3QpOworCisJCQlpZiAocGF0aGtleXNfY29udGFpbmVkX2luKHdpbmRvd19wYXRo a2V5cywgb3JkZXJieV9wYXRoa2V5cykpCisJCQkJd2luZG93X3BhdGhrZXlzID0gb3JkZXJi eV9wYXRoa2V5czsKKworCQkJaXNfc29ydGVkID0gcGF0aGtleXNfY291bnRfY29udGFpbmVk X2luKHdpbmRvd19wYXRoa2V5cywKKwkJCQkJCQkJCQkJCQlwYXRoLT5wYXRoa2V5cywKKwkJ CQkJCQkJCQkJCQkmcHJlc29ydGVkX2tleXMpOworCQl9CisKIAkJLyogU29ydCBpZiBuZWNl c3NhcnkgKi8KIAkJaWYgKCFpc19zb3J0ZWQpCiAJCXsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvd2luZG93Lm91dAppbmRleCA5MGU4OWZiNWI2Li4yYjhiNWM0NTMzIDEwMDY0NAotLS0g YS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRvdy5vdXQKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0CkBAIC0zOTgyLDcgKzM5ODIsMTU4IEBAIE9S REVSIEJZIGRlcG5hbWUsIGVtcG5vOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIGVtcHNhbGFyeQogKDExIHJvd3MpCiAKKy0tIERvIG5vdCBw ZXJmb3JtIGFkZGl0aW9uYWwgc29ydCBpZiBjb2x1bW4gaXMgcHJlc29ydGVkCitDUkVBVEUg SU5ERVggZGVwbmFtZV9pZHggT04gZW1wc2FsYXJ5KGRlcG5hbWUpOworU0VUIGVuYWJsZV9z ZXFzY2FuPTA7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAg IG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBtaW5zYWxhcnkK K0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBkZXBuYW1lLCBlbXBubzsKKyAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBJbmNy ZW1lbnRhbCBTb3J0CisgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8KKyAgIFByZXNvcnRl ZCBLZXk6IGRlcG5hbWUKKyAgIC0+ICBXaW5kb3dBZ2cKKyAgICAgICAgIC0+ICBJbmRleCBT Y2FuIHVzaW5nIGRlcG5hbWVfaWR4IG9uIGVtcHNhbGFyeQorKDUgcm93cykKKworRFJPUCBJ TkRFWCBkZXBuYW1lX2lkeDsKK1JFU0VUIGVuYWJsZV9zZXFzY2FuOwogUkVTRVQgZW5hYmxl X2hhc2hhZ2c7CistLSBJZiB3aW5kb3cgZnVuY3Rpb24ncyBPUkRFUiBCWSBpcyBzdWJzZXQg b2YgUVVFUlkncyBPUkRFUiBCWSwgc29ydCBhcyBwZXIgYXMKKy0tIFFVRVJZJ3MgT1JERVIg QlkgdG8gc2F2ZSBhZGRpdGlvbmFsIHNvcnRpbmcgaW4gdGhlIGVuZAorRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNh bGFyeSkgT1ZFUiAoT1JERVIgQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5CitGUk9NIGVtcHNh bGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CisgICAgICAgICAgICBRVUVSWSBQTEFO ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBX aW5kb3dBZ2cKKyAgIC0+ICBTb3J0CisgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1w bm8KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKKyg0IHJvd3MpCisKKy0t IFNhbWUgYXMgYWJvdmUsIGJ1dCBQQVJUSVRJT04gQlkgY2xhdXNlIGlzIGluY2x1ZGVkIGFz IHdlbGwKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywKKyAgICAgICBkZXBu YW1lLAorICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lIE9S REVSIEJZIGVtcG5vKSBkZXBtaW5zYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBk ZXBuYW1lLCBlbXBubywgZW5yb2xsX2RhdGU7CisgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBXaW5kb3dBZ2cKKyAgIC0+ICBTb3J0CisgICAgICAgICBT b3J0IEtleTogZGVwbmFtZSwgZW1wbm8sIGVucm9sbF9kYXRlCisgICAgICAgICAtPiAgU2Vx IFNjYW4gb24gZW1wc2FsYXJ5CisoNCByb3dzKQorCistLSBOZWdhdGlvbiBvZiBhYm92ZSwg d2hlbiBzb3J0IG9wdGltaXphdGlvbiBpcyBub3QgbmVlZGVkIHRvIGJlIHBlcmZvcm1lZAor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisg ICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUgT1JERVIgQlkg ZW1wbm8pIGRlcG1pbnNhbGFyeQorRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZIGVtcG5vLCBl bnJvbGxfZGF0ZTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNvcnQKKyAg IFNvcnQgS2V5OiBlbXBubywgZW5yb2xsX2RhdGUKKyAgIC0+ICBXaW5kb3dBZ2cKKyAgICAg ICAgIC0+ICBTb3J0CisgICAgICAgICAgICAgICBTb3J0IEtleTogZGVwbmFtZSwgZW1wbm8K KyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXBzYWxhcnkKKyg2IHJvd3MpCisK Ky0tIE9SREVSIEJZJ3MgaW4gbXVsdGlwbGUgV2luZG93IGZ1bmN0aW9ucyBjYW4gYmUgY29t YmluZWQgaW50byBvbmUKKy0tIGlmIHRoZXkgYXJlIHN1YnNldCBvZiBRVUVSWSdzIE9SREVS IEJZCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgZGVwbmFt ZSwKKyAgICAgICBtaW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRF UiBCWSBlbXBubykgZGVwbWluc2FsYXJ5LAorICAgICAgIHN1bShzYWxhcnkpIE9WRVIgKFBB UlRJVElPTiBCWSBkZXBuYW1lKSBkZXBzYWxhcnksCisgICAgICAgY291bnQoKikgT1ZFUiAo T1JERVIgQlkgZW5yb2xsX2RhdGUgREVTQykgYworRlJPTSBlbXBzYWxhcnkKK09SREVSIEJZ IGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICBR VUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgV2luZG93QWdnCisgICAtPiAg V2luZG93QWdnCisgICAgICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgU29ydCBLZXk6 IGRlcG5hbWUsIGVtcG5vLCBlbnJvbGxfZGF0ZQorICAgICAgICAgICAgICAgLT4gIFdpbmRv d0FnZworICAgICAgICAgICAgICAgICAgICAgLT4gIFNvcnQKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgIFNvcnQgS2V5OiBlbnJvbGxfZGF0ZSBERVNDCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoOCByb3dzKQorCistLSBT T1JUIE9QVElNSVpBVElPTiAoYXMgaW4gY2FzZXMgYWJvdmUpIGlzIG5vdCBuZWVkZWQgdG8g YmUgcGVyZm9ybWVkCistLSBpbiBjYXNlcywgYXMgbWVudGlvbmVkIGJlbG93LgorLS0gQ2Fz ZSAjMTogV2hlbiBkaXN0aW5jdCBjbGF1c2UgaXMgaW5jbHVkZWQKK0VYUExBSU4gKENPU1RT IE9GRikKK1NFTEVDVCBESVNUSU5DVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAorICAgICAg IG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBtaW5zYWxhcnks CisgICAgICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5hbWUpIGRlcHNh bGFyeSwKKyAgICAgICBjb3VudCgqKSBPVkVSIChPUkRFUiBCWSBlbnJvbGxfZGF0ZSBERVND KSBjCitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgVW5pcXVlCisgICAt PiAgU29ydAorICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUsIGVtcG5vLCAobWluKHNhbGFy eSkgT1ZFUiAoPykpLCAoc3VtKHNhbGFyeSkgT1ZFUiAoPykpLCAoY291bnQoKikgT1ZFUiAo PykpCisgICAgICAgICAtPiAgV2luZG93QWdnCisgICAgICAgICAgICAgICAtPiAgU29ydAor ICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IGRlcG5hbWUKKyAgICAgICAgICAgICAg ICAgICAgIC0+ICBXaW5kb3dBZ2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBT b3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IEtleTogZW5yb2xs X2RhdGUgREVTQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBT Y2FuIG9uIGVtcHNhbGFyeQorKDEwIHJvd3MpCisKKy0tIENhc2UgIzI6IFdoZW4gTGltaXQg Y2xhdXNlIGlzIHNwZWNpZmllZAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5v LAorICAgICAgIGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9O IEJZIGVtcG5vKSBkZXBtaW5zYWxhcnksCisgICAgICAgc3VtKHNhbGFyeSkgT1ZFUiAoUEFS VElUSU9OIEJZIGVtcG5vKSBkZXBzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBl bXBubywgZGVwbmFtZSBMSU1JVCAxOworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTGltaXQKKyAgIC0+ICBJbmNyZW1lbnRhbCBTb3J0CisgICAgICAg ICBTb3J0IEtleTogZW1wbm8sIGRlcG5hbWUKKyAgICAgICAgIFByZXNvcnRlZCBLZXk6IGVt cG5vCisgICAgICAgICAtPiAgV2luZG93QWdnCisgICAgICAgICAgICAgICAtPiAgU29ydAor ICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6IGVtcG5vCisgICAgICAgICAgICAgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoOCByb3dzKQorCistLSBDYXNlICMz OiBXaGVuIE9SREVSIEJZIGNvbnRhaW5zIGFueSBXaW5kb3dGdW5jcworRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIHJvd19udW1iZXIoKSBvdmVyIChQQVJU SVRJT04gQlkgZW1wbm8pIGVzYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBlbXBu bywgZXNhbGFyeTsKKyAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIElu Y3JlbWVudGFsIFNvcnQKKyAgIFNvcnQgS2V5OiBlbXBubywgKHJvd19udW1iZXIoKSBPVkVS ICg/KSkKKyAgIFByZXNvcnRlZCBLZXk6IGVtcG5vCisgICAtPiAgV2luZG93QWdnCisgICAg ICAgICAtPiAgU29ydAorICAgICAgICAgICAgICAgU29ydCBLZXk6IGVtcG5vCisgICAgICAg ICAgICAgICAtPiAgU2VxIFNjYW4gb24gZW1wc2FsYXJ5CisoNyByb3dzKQorCiAtLSBUZXN0 IFNvcnQgbm9kZSByZW9yZGVyaW5nCiBFWFBMQUlOIChDT1NUUyBPRkYpCiBTRUxFQ1QKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwgYi9zcmMvdGVzdC9y ZWdyZXNzL3NxbC93aW5kb3cuc3FsCmluZGV4IGI3YmQwYTgzZGEuLjFmNDI2NGNlMDMgMTAw NjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvd2luZG93LnNxbApAQCAtMTMyNCw4ICsxMzI0LDg0IEBAIFNFTEVD VCBESVNUSU5DVAogRlJPTSBlbXBzYWxhcnkKIE9SREVSIEJZIGRlcG5hbWUsIGVtcG5vOwog CistLSBEbyBub3QgcGVyZm9ybSBhZGRpdGlvbmFsIHNvcnQgaWYgY29sdW1uIGlzIHByZXNv cnRlZAorQ1JFQVRFIElOREVYIGRlcG5hbWVfaWR4IE9OIGVtcHNhbGFyeShkZXBuYW1lKTsK K1NFVCBlbmFibGVfc2Vxc2Nhbj0wOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1Qg ZW1wbm8sCisgICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1l KSBkZXBtaW5zYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBkZXBuYW1lLCBlbXBu bzsKK0RST1AgSU5ERVggZGVwbmFtZV9pZHg7CitSRVNFVCBlbmFibGVfc2Vxc2NhbjsKIFJF U0VUIGVuYWJsZV9oYXNoYWdnOwogCistLSBJZiB3aW5kb3cgZnVuY3Rpb24ncyBPUkRFUiBC WSBpcyBzdWJzZXQgb2YgUVVFUlkncyBPUkRFUiBCWSwgc29ydCBhcyBwZXIgYXMKKy0tIFFV RVJZJ3MgT1JERVIgQlkgdG8gc2F2ZSBhZGRpdGlvbmFsIHNvcnRpbmcgaW4gdGhlIGVuZAor RVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAgIGRlcG5hbWUsCisg ICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoT1JERVIgQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5 CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZGVwbmFtZSwgZW1wbm87CisKKy0tIFNhbWUg YXMgYWJvdmUsIGJ1dCBQQVJUSVRJT04gQlkgY2xhdXNlIGlzIGluY2x1ZGVkIGFzIHdlbGwK K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAor ICAgICAgIG1pbihzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lIE9SREVSIEJZ IGVtcG5vKSBkZXBtaW5zYWxhcnkKK0ZST00gZW1wc2FsYXJ5CitPUkRFUiBCWSBkZXBuYW1l LCBlbXBubywgZW5yb2xsX2RhdGU7CisKKy0tIE5lZ2F0aW9uIG9mIGFib3ZlLCB3aGVuIHNv cnQgb3B0aW1pemF0aW9uIGlzIG5vdCBuZWVkZWQgdG8gYmUgcGVyZm9ybWVkCitFWFBMQUlO IChDT1NUUyBPRkYpCitTRUxFQ1QgZW1wbm8sCisgICAgICAgZGVwbmFtZSwKKyAgICAgICBt aW4oc2FsYXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSBPUkRFUiBCWSBlbXBubykg ZGVwbWluc2FsYXJ5CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZW1wbm8sIGVucm9sbF9k YXRlOworCistLSBPUkRFUiBCWSdzIGluIG11bHRpcGxlIFdpbmRvdyBmdW5jdGlvbnMgY2Fu IGJlIGNvbWJpbmVkIGludG8gb25lCistLSBpZiB0aGV5IGFyZSBzdWJzZXQgb2YgUVVFUlkn cyBPUkRFUiBCWQorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGVtcG5vLAorICAgICAg IGRlcG5hbWUsCisgICAgICAgbWluKHNhbGFyeSkgT1ZFUiAoUEFSVElUSU9OIEJZIGRlcG5h bWUgT1JERVIgQlkgZW1wbm8pIGRlcG1pbnNhbGFyeSwKKyAgICAgICBzdW0oc2FsYXJ5KSBP VkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSkgZGVwc2FsYXJ5LAorICAgICAgIGNvdW50KCop IE9WRVIgKE9SREVSIEJZIGVucm9sbF9kYXRlIERFU0MpIGMKK0ZST00gZW1wc2FsYXJ5CitP UkRFUiBCWSBkZXBuYW1lLCBlbXBubywgZW5yb2xsX2RhdGU7CisKKy0tIFNPUlQgT1BUSU1J WkFUSU9OIChhcyBpbiBjYXNlcyBhYm92ZSkgaXMgbm90IG5lZWRlZCB0byBiZSBwZXJmb3Jt ZWQKKy0tIGluIGNhc2VzLCBhcyBtZW50aW9uZWQgYmVsb3cuCisKKy0tIENhc2UgIzE6IFdo ZW4gZGlzdGluY3QgY2xhdXNlIGlzIGluY2x1ZGVkCitFWFBMQUlOIChDT1NUUyBPRkYpCitT RUxFQ1QgRElTVElOQ1QgZW1wbm8sCisgICAgICAgZGVwbmFtZSwKKyAgICAgICBtaW4oc2Fs YXJ5KSBPVkVSIChQQVJUSVRJT04gQlkgZGVwbmFtZSkgZGVwbWluc2FsYXJ5LAorICAgICAg IHN1bShzYWxhcnkpIE9WRVIgKFBBUlRJVElPTiBCWSBkZXBuYW1lKSBkZXBzYWxhcnksCisg ICAgICAgY291bnQoKikgT1ZFUiAoT1JERVIgQlkgZW5yb2xsX2RhdGUgREVTQykgYworRlJP TSBlbXBzYWxhcnkKK09SREVSIEJZIGRlcG5hbWUsIGVtcG5vOworCistLSBDYXNlICMyOiBX aGVuIExpbWl0IGNsYXVzZSBpcyBzcGVjaWZpZWQKK0VYUExBSU4gKENPU1RTIE9GRikKK1NF TEVDVCBlbXBubywKKyAgICAgICBkZXBuYW1lLAorICAgICAgIG1pbihzYWxhcnkpIE9WRVIg KFBBUlRJVElPTiBCWSBlbXBubykgZGVwbWluc2FsYXJ5LAorICAgICAgIHN1bShzYWxhcnkp IE9WRVIgKFBBUlRJVElPTiBCWSBlbXBubykgZGVwc2FsYXJ5CitGUk9NIGVtcHNhbGFyeQor T1JERVIgQlkgZW1wbm8sIGRlcG5hbWUgTElNSVQgMTsKKworLS0gQ2FzZSAjMzogV2hlbiBP UkRFUiBCWSBjb250YWlucyBhbnkgV2luZG93RnVuY3MKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCBlbXBubywKKyAgICAgICByb3dfbnVtYmVyKCkgb3ZlciAoUEFSVElUSU9OIEJZ IGVtcG5vKSBlc2FsYXJ5CitGUk9NIGVtcHNhbGFyeQorT1JERVIgQlkgZW1wbm8sIGVzYWxh cnk7CisKIC0tIFRlc3QgU29ydCBub2RlIHJlb3JkZXJpbmcKIEVYUExBSU4gKENPU1RTIE9G RikKIFNFTEVDVAotLSAKMi4zNy4yCgo= --------------G0cjyM0CRbGkjaeJXpyVcoiH--