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 1sN58y-006g2D-2g for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Jun 2024 06:31:36 +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 1sN58v-001V6z-Jl for pgsql-hackers@arkaria.postgresql.org; Fri, 28 Jun 2024 06:31:33 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sN58t-001V6q-My for pgsql-hackers@lists.postgresql.org; Fri, 28 Jun 2024 06:31:33 +0000 Received: from fout1-smtp.messagingengine.com ([103.168.172.144]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sN58p-003VJd-K3 for pgsql-hackers@postgresql.org; Fri, 28 Jun 2024 06:31:30 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailfout.nyi.internal (Postfix) with ESMTP id D8CD01380507; Fri, 28 Jun 2024 02:31:25 -0400 (EDT) Received: from mailfrontend1 ([10.202.2.162]) by compute2.internal (MEProxy); Fri, 28 Jun 2024 02:31:25 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eisentraut.org; h=cc:cc:content-type:content-type:date:date:from:from :in-reply-to:in-reply-to:message-id:mime-version:references :reply-to:subject:subject:to:to; s=fm1; t=1719556285; x= 1719642685; bh=YtoLMQjOok4Z2EPOMmrGjCDAbaFr2UZ7SEWdvWZXF3A=; b=N dfF4hVYkngltXTBabCmJ+PI5gm4kk6aGaFltniYm/TNqRfhWwOcGUFguWZPB+yS1 CAXRurvYIEnZ298QenbwDOLT206q+f5NicQS5YVBdjZs0Tm90yPSw37GIWIb607v hnRFgfZZzrYFSFQ8+OcQ5+7tQL0N25zJxiA4tX2jNzw1eewHI8GCbYKkVHbasB9u s76FtPCAocyf2Y5k6c8soPWasd/VGdS4XtpL038TIP0AA4w1ZEIJNViPQ1qHVgmS tDA0YoScy7nQBL0Vxp8XqgARaof0n1dRO3QRlpl69iqwK7o8zcclrZNod1hAo4eM zBT2VozQuwdqkT0KD5DxQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm2; t=1719556285; x=1719642685; bh=YtoLMQjOok4Z2EPOMmrGjCDAbaFr 2UZ7SEWdvWZXF3A=; b=qwE5cTTYcy3jOH9/IUXyAhP9d0GQc7vetX8mCphg4B6t dQw/ZZi+xeLS8b4ROjh9+MRb0g7UAODNZnrEPT3iKB4+dplJHIbcNXju9UJRzZkg FeL4cgF3N0YxnOOi00UIYGMbtpBa72mHdnVe/YrN9l2//8Pczb+Er7utBz+/Df6o xSgWKHUCghC2mKZoPInaMHdre8jNtL6PnVGNWyPV3WblDs3pYxeY1gTV/w4fQllC /VuwQWJ8k+zlJ+QGJ9g+dEE6FWI9CMXdP2jNpTSKwkuXM+jabqrnONoiHc6YhZ4R UzEASHlFnyCR9e5CQioixjE/Nm/+LtbTKKRlkurbEw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeftddrtdehgdduudduucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurheptgfkffggfgfuvfevfhfhjgesmhdtreertddvjeenucfhrhhomheprfgvthgv rhcugfhishgvnhhtrhgruhhtuceophgvthgvrhesvghishgvnhhtrhgruhhtrdhorhhgqe enucggtffrrghtthgvrhhnpeektdeutdfhvdfhveeigfffteegvdejvdfhhfevfeevgfdt gfelgeehieevhffgieenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrih hlfhhrohhmpehpvghtvghrsegvihhsvghnthhrrghuthdrohhrgh X-ME-Proxy: Feedback-ID: ie0a040ee:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Fri, 28 Jun 2024 02:31:24 -0400 (EDT) Content-Type: multipart/mixed; boundary="------------PJIwCt8xH24Jho0GU99HD8dO" Message-ID: Date: Fri, 28 Jun 2024 08:31:23 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Support LIKE with nondeterministic collations To: pgsql-hackers Cc: Daniel Verite References: Content-Language: en-US From: Peter Eisentraut 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. --------------PJIwCt8xH24Jho0GU99HD8dO Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Here is an updated patch for this. I have added some more documentation based on the discussions, including some examples taken directly from the emails here. One thing I have been struggling with a bit is the correct use of LIKE_FALSE versus LIKE_ABORT in the MatchText() code. I have made some small tweaks about this in this version that I think are more correct, but it could use another look. Maybe also some more tests to verify this one way or the other. On 30.04.24 14:39, Daniel Verite wrote: > Peter Eisentraut wrote: > >> This patch adds support for using LIKE with nondeterministic >> collations. So you can do things such as >> >> col LIKE 'foo%' COLLATE case_insensitive > > Nice! > >> The pattern is partitioned into substrings at wildcard characters >> (so 'foo%bar' is partitioned into 'foo', '%', 'bar') and then then >> whole predicate matches if a match can be found for each partition >> under the applicable collation > > Trying with a collation that ignores punctuation: > > postgres=# CREATE COLLATION "ign_punct" ( > provider = 'icu', > locale='und-u-ka-shifted', > deterministic = false > ); > > postgres=# SELECT '.foo.' like 'foo' COLLATE ign_punct; > ?column? > ---------- > t > (1 row) > > postgres=# SELECT '.foo.' like 'f_o' COLLATE ign_punct; > ?column? > ---------- > t > (1 row) > > postgres=# SELECT '.foo.' like '_oo' COLLATE ign_punct; > ?column? > ---------- > f > (1 row) > > The first two results look fine, but the next one is inconsistent. --------------PJIwCt8xH24Jho0GU99HD8dO Content-Type: text/plain; charset=UTF-8; name="v2-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Disposition: attachment; filename*0="v2-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Transfer-Encoding: base64 RnJvbSAzNGY1YmIxZThmMGZmYmIzOWIxZWZjOTc3NzczNmY2YjRkNmM0Y2FhIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogRnJpLCAyOCBKdW4gMjAyNCAwNjo1NTo0NSArMDIwMApTdWJqZWN0 OiBbUEFUQ0ggdjJdIFN1cHBvcnQgTElLRSB3aXRoIG5vbmRldGVybWluaXN0aWMgY29sbGF0 aW9ucwpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJz ZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhpcyBhbGxvd3Mg Zm9yIGV4YW1wbGUgdXNpbmcgTElLRSB3aXRoIGNhc2UtaW5zZW5zaXRpdmUgY29sbGF0aW9u cy4KVGhlcmUgd2FzIHByZXZpb3VzbHkgbm8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2Yg dGhpcywgc28gaXQgd2FzIG1ldAp3aXRoIGEgbm90LXN1cHBvcnRlZCBlcnJvci4gIFRoaXMg YWRkcyB0aGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gYW5kCnJlbW92ZXMgdGhlIGVycm9y LgoKVW5saWtlIHdpdGggZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLCB0aGUgTElLRSBtYXRj aGluZyBjYW5ub3QgZ28KY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciBidXQgaGFzIHRvIGdvIHN1 YnN0cmluZyBieSBzdWJzdHJpbmcuICBGb3IKZXhhbXBsZSwgaWYgd2UgYXJlIG1hdGNoaW5n IGFnYWluc3QgTElLRSAnZm9vJWJhcicsIHdlIGNhbid0IHN0YXJ0IGJ5Cmxvb2tpbmcgZm9y IGFuICdmJywgdGhlbiBhbiAnbycsIGJ1dCBpbnN0ZWFkIHdpdGggaGF2ZSB0byBmaW5kCnNv bWV0aGluZyB0aGF0IG1hdGNoZXMgJ2ZvbycuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGNvbGxh dGlvbiBjb3VsZApjb25zaWRlciBzdWJzdHJpbmdzIG9mIGRpZmZlcmVudCBsZW5ndGhzIHRv IGJlIGVxdWFsLiAgVGhpcyBpcyBhbGwKaW50ZXJuYWwgdG8gTWF0Y2hUZXh0KCkgaW4gbGlr ZV9tYXRjaC5jLgoKVGhlIGNoYW5nZXMgaW4gR2VuZXJpY01hdGNoVGV4dCgpIGluIGxpa2Uu YyBqdXN0IHBhc3MgdGhyb3VnaCB0aGUKbG9jYWxlIGluZm9ybWF0aW9uIHRvIE1hdGNoVGV4 dCgpLCB3aGljaCB3YXMgcHJldmlvdXNseSBub3QgbmVlZGVkLgpUaGlzIG1hdGNoZXMgZXhh Y3RseSBHZW5lcmljX1RleHRfSUNfbGlrZSgpIGJlbG93LgoKTm90ZSB0aGF0IElMSUtFIGlz IG5vdCBhZmZlY3RlZC4gIEl0J3MgdW5jbGVhciB3aGV0aGVyIElMSUtFIG1ha2VzCnNlbnNl IHVuZGVyIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucy4KClRoaXMgYWxzbyB1cGRhdGVz IG1hdGNoX3BhdHRlcm5fcHJlZml4KCkgaW4gbGlrZV9zdXBwb3J0LmMgdG8gc3VwcG9ydApv cHRpbWl6aW5nIHRoZSBjYXNlIG9mIGFuIGV4YWN0IHBhdHRlcm4gd2l0aCBub25kZXRlcm1p bmlzdGljCmNvbGxhdGlvbnMuICBUaGlzIHdhcyBhbHJlYWR5IGFsbHVkZWQgdG8gaW4gdGhl IHByZXZpb3VzIGNvZGUuCgooaW5jbHVkZXMgZG9jdW1lbnRhdGlvbiBleGFtcGxlcyBmcm9t IERhbmllbCBWw6lyaXTDqSkKCkRpc2N1c3Npb246IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwu b3JnL21lc3NhZ2UtaWQvZmxhdC83MDBkMmU4Ni1iZjc1LTQ2MDctOWNmMi1mNWI3ODAyZjZl ODhAZWlzZW50cmF1dC5vcmcKLS0tCiBkb2Mvc3JjL3NnbWwvY2hhcnNldC5zZ21sICAgICAg ICAgICAgICAgICAgICAgfCAgIDIgKy0KIGRvYy9zcmMvc2dtbC9mdW5jLnNnbWwgICAgICAg ICAgICAgICAgICAgICAgICB8ICA1MSArKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2xpa2UuYyAgICAgICAgICAgICAgICAgIHwgIDMwICsrKy0tCiBzcmMvYmFja2VuZC91dGls cy9hZHQvbGlrZV9tYXRjaC5jICAgICAgICAgICAgfCAxMTggKysrKysrKysrKysrKysrKysr CiBzcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMgICAgICAgICAgfCAgMjkg KystLS0KIC4uLi9yZWdyZXNzL2V4cGVjdGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0ICAgICB8 ICA4MSArKysrKysrKysrLS0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvbGxhdGUuaWN1LnV0 Zjguc3FsICAgICB8ICAyMyArKystCiA3IGZpbGVzIGNoYW5nZWQsIDI5MiBpbnNlcnRpb25z KCspLCA0MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY2hhcnNl dC5zZ21sIGIvZG9jL3NyYy9zZ21sL2NoYXJzZXQuc2dtbAppbmRleCA4MzRjYjMwYzg1YS4u NTMzYjNhZjkwNDUgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwKKysr IGIvZG9jL3NyYy9zZ21sL2NoYXJzZXQuc2dtbApAQCAtMTE5Nyw3ICsxMTk3LDcgQEAgPHRp dGxlPk5vbmRldGVybWluaXN0aWMgQ29sbGF0aW9uczwvdGl0bGU+CiAgICAgIHRvIGEgcGVy Zm9ybWFuY2UgcGVuYWx0eS4gIE5vdGUsIGluIHBhcnRpY3VsYXIsIHRoYXQgQi10cmVlIGNh bm5vdCB1c2UKICAgICAgZGVkdXBsaWNhdGlvbiB3aXRoIGluZGV4ZXMgdGhhdCB1c2UgYSBu b25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbi4gIEFsc28sCiAgICAgIGNlcnRhaW4gb3BlcmF0 aW9ucyBhcmUgbm90IHBvc3NpYmxlIHdpdGggbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25z LAotICAgICBzdWNoIGFzIHBhdHRlcm4gbWF0Y2hpbmcgb3BlcmF0aW9ucy4gIFRoZXJlZm9y ZSwgdGhleSBzaG91bGQgYmUgdXNlZAorICAgICBzdWNoIGFzIHNvbWUgcGF0dGVybiBtYXRj aGluZyBvcGVyYXRpb25zLiAgVGhlcmVmb3JlLCB0aGV5IHNob3VsZCBiZSB1c2VkCiAgICAg IG9ubHkgaW4gY2FzZXMgd2hlcmUgdGhleSBhcmUgc3BlY2lmaWNhbGx5IHdhbnRlZC4KICAg ICA8L3BhcmE+CiAKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwgYi9kb2Mv c3JjL3NnbWwvZnVuYy5zZ21sCmluZGV4IDI2MDkyNjk2MTBiLi44MzNkYjEyMGNiMyAxMDA2 NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvZnVu Yy5zZ21sCkBAIC01Mzc0LDkgKzUzNzQsMTAgQEAgPHRpdGxlPlBhdHRlcm4gTWF0Y2hpbmc8 L3RpdGxlPgogICAgPC9jYXV0aW9uPgogCiAgICA8cGFyYT4KLSAgICBUaGUgcGF0dGVybiBt YXRjaGluZyBvcGVyYXRvcnMgb2YgYWxsIHRocmVlIGtpbmRzIGRvIG5vdCBzdXBwb3J0Ci0g ICAgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLiAgSWYgcmVxdWlyZWQsIGFwcGx5IGEg ZGlmZmVyZW50IGNvbGxhdGlvbiB0bwotICAgIHRoZSBleHByZXNzaW9uIHRvIHdvcmsgYXJv dW5kIHRoaXMgbGltaXRhdGlvbi4KKyAgICA8ZnVuY3Rpb24+U0lNSUxBUiBUTzwvZnVuY3Rp b24+IGFuZCA8YWNyb255bT5QT1NJWDwvYWNyb255bT4tc3R5bGUgcmVndWxhcgorICAgIGV4 cHJlc3Npb25zIGRvIG5vdCBzdXBwb3J0IG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucy4g IElmIHJlcXVpcmVkLCB1c2UKKyAgICA8ZnVuY3Rpb24+TElLRTwvZnVuY3Rpb24+IG9yIGFw cGx5IGEgZGlmZmVyZW50IGNvbGxhdGlvbiB0byB0aGUgZXhwcmVzc2lvbgorICAgIHRvIHdv cmsgYXJvdW5kIHRoaXMgbGltaXRhdGlvbi4KICAgIDwvcGFyYT4KIAogICA8c2VjdDIgaWQ9 ImZ1bmN0aW9ucy1saWtlIj4KQEAgLTU0MjIsNiArNTQyMyw0NSBAQCA8dGl0bGU+PGZ1bmN0 aW9uPkxJS0U8L2Z1bmN0aW9uPjwvdGl0bGU+CiA8L3Byb2dyYW1saXN0aW5nPgogICAgPC9w YXJhPgogCisgICA8cGFyYT4KKyAgICA8ZnVuY3Rpb24+TElLRTwvZnVuY3Rpb24+IHBhdHRl cm4gbWF0Y2hpbmcgc3VwcG9ydHMgbm9uZGV0ZXJtaW5pc3RpYworICAgIGNvbGxhdGlvbnMg KHNlZSA8eHJlZiBsaW5rZW5kPSJjb2xsYXRpb24tbm9uZGV0ZXJtaW5pc3RpYyIvPiksIHN1 Y2ggYXMKKyAgICBjYXNlLWluc2Vuc2l0aXZlIGNvbGxhdGlvbnMgb3IgY29sbGF0aW9ucyB0 aGF0LCBzYXksIGlnbm9yZSBwdW5jdHVhdGlvbi4KKyAgICBTbyB3aXRoIGEgY2FzZS1pbnNl bnNpdGl2ZSBjb2xsYXRpb24sIG9uZSBjb3VsZCBoYXZlOgorPHByb2dyYW1saXN0aW5nPgor J0FiQycgTElLRSAnYWJjJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUgICAgPGxpbmVhbm5v dGF0aW9uPnRydWU8L2xpbmVhbm5vdGF0aW9uPgorJ0FiQycgTElLRSAnYSUnIENPTExBVEUg Y2FzZV9pbnNlbnNpdGl2ZSAgICAgPGxpbmVhbm5vdGF0aW9uPnRydWU8L2xpbmVhbm5vdGF0 aW9uPgorPC9wcm9ncmFtbGlzdGluZz4KKyAgICBXaXRoIGNvbGxhdGlvbnMgdGhhdCBpZ25v cmUgY2VydGFpbiBjaGFyYWN0ZXJzIG9yIGluIGdlbmVyYWwgdGhhdCBjb25zaWRlcgorICAg IHN0cmluZ3Mgb2YgZGlmZmVyZW50IGxlbmd0aHMgZXF1YWwsIHRoZSBzZW1hbnRpY3MgY2Fu IGJlY29tZSBhIGJpdCBtb3JlCisgICAgY29tcGxpY2F0ZWQuICBDb25zaWRlciB0aGVzZSBl eGFtcGxlczoKKzxwcm9ncmFtbGlzdGluZz4KKycuZm9vLicgTElLRSAnZm9vJyBDT0xMQVRF IGlnbl9wdW5jdCAgICA8bGluZWFubm90YXRpb24+dHJ1ZTwvbGluZWFubm90YXRpb24+Cisn LmZvby4nIExJS0UgJ2ZfbycgQ09MTEFURSBpZ25fcHVuY3QgICAgPGxpbmVhbm5vdGF0aW9u PnRydWU8L2xpbmVhbm5vdGF0aW9uPgorJy5mb28uJyBMSUtFICdfb28nIENPTExBVEUgaWdu X3B1bmN0ICAgIDxsaW5lYW5ub3RhdGlvbj5mYWxzZTwvbGluZWFubm90YXRpb24+Cis8L3By b2dyYW1saXN0aW5nPgorICAgIFRoZSB3YXkgdGhlIG1hdGNoaW5nIHdvcmtzIGlzIHRoYXQg dGhlIHBhdHRlcm4gaXMgcGFydGl0aW9uZWQgaW50bworICAgIHNlcXVlbmNlcyBvZiB3aWxk Y2FyZHMgYW5kIG5vbi13aWxkY2FyZCBzdHJpbmdzLiAgRm9yIGV4YW1wbGUsIHRoZSBwYXR0 ZXJuCisgICAgPGxpdGVyYWw+Zl9vPC9saXRlcmFsPiBpcyBwYXJ0aXRpb25lZCBpbnRvIDxs aXRlcmFsPmYsIF8sIG88L2xpdGVyYWw+LCB0aGUKKyAgICBwYXR0ZXJuIDxsaXRlcmFsPl9v bzwvbGl0ZXJhbD4gaXMgcGFydGl0aW9uZWQgaW50byA8bGl0ZXJhbD5fLAorICAgIG9vPC9s aXRlcmFsPi4gIFRoZSBpbnB1dCBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybiBpZiBpdCBj YW4gYmUKKyAgICBwYXJ0aXRpb25lZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHdpbGRjYXJk cyBtYXRjaCBvbmUgY2hhcmFjdGVyIG9yIGFueQorICAgIG51bWJlciBvZiBjaGFyYWN0ZXJz IHJlc3BlY3RpdmVseSBhbmQgdGhlIG5vbi13aWxkY2FyZCBwYXJ0aXRpb25zIGFyZQorICAg IGVxdWFsIHVuZGVyIHRoZSBhcHBsaWNhYmxlIGNvbGxhdGlvbi4gIFNvIGZvciBleGFtcGxl LCA8bGl0ZXJhbD4nLmZvby4nCisgICAgTElLRSAnZl9vJyBDT0xMQVRFIGlnbl9wdW5jdDwv bGl0ZXJhbD4gaXMgdHJ1ZSBiZWNhdXNlIG9uZSBjYW4gcGFydGl0aW9uCisgICAgPGxpdGVy YWw+LmZvby48L2xpdGVyYWw+IGludG8gPGxpdGVyYWw+LmYsIG8sIG8uPC9saXRlcmFsPiwg YW5kIHRoZW4KKyAgICA8bGl0ZXJhbD4nLmYnID0gJ2YnIENPTExBVEUgaWduX3B1bmN0PC9s aXRlcmFsPiwgPGxpdGVyYWw+J28nPC9saXRlcmFsPgorICAgIG1hdGNoZXMgdGhlIDxsaXRl cmFsPl88L2xpdGVyYWw+IHdpbGRjYXJkLCBhbmQgPGxpdGVyYWw+J28uJyA9ICdvJyBDT0xM QVRFCisgICAgaWduX3B1bmN0PC9saXRlcmFsPi4gIEJ1dCA8bGl0ZXJhbD4nLmZvby4nIExJ S0UgJ19vbycgQ09MTEFURQorICAgIGlnbl9wdW5jdDwvbGl0ZXJhbD4gaXMgZmFsc2UgYmVj YXVzZSA8bGl0ZXJhbD4uZm9vLjwvbGl0ZXJhbD4gY2Fubm90IGJlCisgICAgcGFydGl0aW9u ZWQgaW4gYSB3YXkgdGhhdCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIGFueSBjaGFyYWN0ZXIg YW5kIHRoZQorICAgIHJlc3Qgb2YgdGhlIHN0cmluZyBjb21wYXJlcyBlcXVhbCB0byA8bGl0 ZXJhbD5vbzwvbGl0ZXJhbD4uICAoTm90ZSB0aGF0CisgICAgdGhlIHNpbmdsZS1jaGFyYWN0 ZXIgd2lsZGNhcmQgYWx3YXlzIG1hdGNoZXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyLAorICAg IGluZGVwZW5kZW50IG9mIHRoZSBjb2xsYXRpb24uICBTbyBpbiB0aGlzIGV4YW1wbGUsIHRo ZQorICAgIDxsaXRlcmFsPl88L2xpdGVyYWw+IHdvdWxkIG1hdGNoIDxsaXRlcmFsPi48L2xp dGVyYWw+LCBidXQgdGhlbiB0aGUgcmVzdAorICAgIG9mIHRoZSBpbnB1dCBzdHJpbmcgd29u J3QgbWF0Y2ggdGhlIHJlc3Qgb2YgdGhlIHBhdHRlcm4uKQorICAgPC9wYXJhPgorCiAgICA8 cGFyYT4KICAgICA8ZnVuY3Rpb24+TElLRTwvZnVuY3Rpb24+IHBhdHRlcm4gbWF0Y2hpbmcg YWx3YXlzIGNvdmVycyB0aGUgZW50aXJlCiAgICAgc3RyaW5nLiAgVGhlcmVmb3JlLCBpZiBp dCdzIGRlc2lyZWQgdG8gbWF0Y2ggYSBzZXF1ZW5jZSBhbnl3aGVyZSB3aXRoaW4KQEAgLTU0 NjMsOCArNTUwMyw5IEBAIDx0aXRsZT48ZnVuY3Rpb24+TElLRTwvZnVuY3Rpb24+PC90aXRs ZT4KIAogICAgPHBhcmE+CiAgICAgVGhlIGtleSB3b3JkIDx0b2tlbj5JTElLRTwvdG9rZW4+ IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICA8dG9rZW4+TElLRTwvdG9rZW4+IHRvIG1h a2UgdGhlIG1hdGNoIGNhc2UtaW5zZW5zaXRpdmUgYWNjb3JkaW5nCi0gICAgdG8gdGhlIGFj dGl2ZSBsb2NhbGUuICBUaGlzIGlzIG5vdCBpbiB0aGUgPGFjcm9ueW0+U1FMPC9hY3Jvbnlt PiBzdGFuZGFyZCBidXQgaXMgYQorICAgIDx0b2tlbj5MSUtFPC90b2tlbj4gdG8gbWFrZSB0 aGUgbWF0Y2ggY2FzZS1pbnNlbnNpdGl2ZSBhY2NvcmRpbmcgdG8gdGhlCisgICAgYWN0aXZl IGxvY2FsZS4gIChCdXQgdGhpcyBkb2VzIG5vdCBzdXBwb3J0IG5vbmRldGVybWluaXN0aWMg Y29sbGF0aW9ucy4pCisgICAgVGhpcyBpcyBub3QgaW4gdGhlIDxhY3JvbnltPlNRTDwvYWNy b255bT4gc3RhbmRhcmQgYnV0IGlzIGEKICAgICA8cHJvZHVjdG5hbWU+UG9zdGdyZVNRTDwv cHJvZHVjdG5hbWU+IGV4dGVuc2lvbi4KICAgIDwvcGFyYT4KIApkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvdXRpbHMvYWR0L2xpa2UuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtl LmMKaW5kZXggNTdlYWQ2NmI1YWEuLmJiYmU2YzA5ZDE4IDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC91dGlscy9hZHQvbGlrZS5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtl LmMKQEAgLTE0OSwyMiArMTQ5LDMyIEBAIFNCX2xvd2VyX2NoYXIodW5zaWduZWQgY2hhciBj LCBwZ19sb2NhbGVfdCBsb2NhbGUsIGJvb2wgbG9jYWxlX2lzX2MpCiBzdGF0aWMgaW5saW5l IGludAogR2VuZXJpY01hdGNoVGV4dChjb25zdCBjaGFyICpzLCBpbnQgc2xlbiwgY29uc3Qg Y2hhciAqcCwgaW50IHBsZW4sIE9pZCBjb2xsYXRpb24pCiB7Ci0JaWYgKGNvbGxhdGlvbiAm JiAhbGNfY3R5cGVfaXNfYyhjb2xsYXRpb24pKQotCXsKLQkJcGdfbG9jYWxlX3QgbG9jYWxl ID0gcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9uKGNvbGxhdGlvbik7CisJcGdfbG9jYWxl X3QgbG9jYWxlID0gMDsKKwlib29sCQlsb2NhbGVfaXNfYyA9IGZhbHNlOwogCi0JCWlmICgh cGdfbG9jYWxlX2RldGVybWluaXN0aWMobG9jYWxlKSkKLQkJCWVyZXBvcnQoRVJST1IsCi0J CQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkJIGVy cm1zZygibm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZv ciBMSUtFIikpKTsKKwlpZiAoIU9pZElzVmFsaWQoY29sbGF0aW9uKSkKKwl7CisJCS8qCisJ CSAqIFRoaXMgdHlwaWNhbGx5IG1lYW5zIHRoYXQgdGhlIHBhcnNlciBjb3VsZCBub3QgcmVz b2x2ZSBhIGNvbmZsaWN0CisJCSAqIG9mIGltcGxpY2l0IGNvbGxhdGlvbnMsIHNvIHJlcG9y dCBpdCB0aGF0IHdheS4KKwkJICovCisJCWVyZXBvcnQoRVJST1IsCisJCQkJKGVycmNvZGUo RVJSQ09ERV9JTkRFVEVSTUlOQVRFX0NPTExBVElPTiksCisJCQkJIGVycm1zZygiY291bGQg bm90IGRldGVybWluZSB3aGljaCBjb2xsYXRpb24gdG8gdXNlIGZvciBMSUtFIiksCisJCQkJ IGVycmhpbnQoIlVzZSB0aGUgQ09MTEFURSBjbGF1c2UgdG8gc2V0IHRoZSBjb2xsYXRpb24g ZXhwbGljaXRseS4iKSkpOwogCX0KIAorCWlmIChsY19jdHlwZV9pc19jKGNvbGxhdGlvbikp CisJCWxvY2FsZV9pc19jID0gdHJ1ZTsKKwllbHNlCisJCWxvY2FsZSA9IHBnX25ld2xvY2Fs ZV9mcm9tX2NvbGxhdGlvbihjb2xsYXRpb24pOworCiAJaWYgKHBnX2RhdGFiYXNlX2VuY29k aW5nX21heF9sZW5ndGgoKSA9PSAxKQotCQlyZXR1cm4gU0JfTWF0Y2hUZXh0KHMsIHNsZW4s IHAsIHBsZW4sIDAsIHRydWUpOworCQlyZXR1cm4gU0JfTWF0Y2hUZXh0KHMsIHNsZW4sIHAs IHBsZW4sIGxvY2FsZSwgbG9jYWxlX2lzX2MpOwogCWVsc2UgaWYgKEdldERhdGFiYXNlRW5j b2RpbmcoKSA9PSBQR19VVEY4KQotCQlyZXR1cm4gVVRGOF9NYXRjaFRleHQocywgc2xlbiwg cCwgcGxlbiwgMCwgdHJ1ZSk7CisJCXJldHVybiBVVEY4X01hdGNoVGV4dChzLCBzbGVuLCBw LCBwbGVuLCBsb2NhbGUsIGxvY2FsZV9pc19jKTsKIAllbHNlCi0JCXJldHVybiBNQl9NYXRj aFRleHQocywgc2xlbiwgcCwgcGxlbiwgMCwgdHJ1ZSk7CisJCXJldHVybiBNQl9NYXRjaFRl eHQocywgc2xlbiwgcCwgcGxlbiwgbG9jYWxlLCBsb2NhbGVfaXNfYyk7CiB9CiAKIHN0YXRp YyBpbmxpbmUgaW50CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9t YXRjaC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2VfbWF0Y2guYwppbmRleCBmMjk5 MGVkZmY3ZS4uMDc1MWIzMjliOGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9saWtlX21hdGNoLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2VfbWF0Y2gu YwpAQCAtMTk4LDYgKzE5OCwxMjQgQEAgTWF0Y2hUZXh0KGNvbnN0IGNoYXIgKnQsIGludCB0 bGVuLCBjb25zdCBjaGFyICpwLCBpbnQgcGxlbiwKIAkJCU5leHRCeXRlKHAsIHBsZW4pOwog CQkJY29udGludWU7CiAJCX0KKwkJZWxzZSBpZiAobG9jYWxlICYmICFsb2NhbGUtPmRldGVy bWluaXN0aWMpCisJCXsKKwkJCS8qCisJCQkgKiBGb3Igbm9uZGV0ZXJtaW5pc3RpYyBsb2Nh bGVzLCB3ZSBmaW5kIHRoZSBuZXh0IHN1YnN0cmluZyBvZiB0aGUKKwkJCSAqIHBhdHRlcm4g dGhhdCBkb2VzIG5vdCBjb250YWluIHdpbGRjYXJkcyBhbmQgdHJ5IHRvIGZpbmQgYQorCQkJ ICogbWF0Y2hpbmcgc3Vic3RyaW5nIGluIHRoZSB0ZXh0LiAgQ3J1Y2lhbGx5LCB3ZSBjYW5u b3QgZG8gdGhpcworCQkJICogY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciwgYXMgaW4gdGhlIG5v cm1hbCBjYXNlLCBidXQgbXVzdCBkbyBpdAorCQkJICogc3Vic3RyaW5nIGJ5IHN1YnN0cmlu ZywgcGFydGl0aW9uZWQgYnkgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMuCisJCQkgKi8KKwkJ CWNvbnN0IGNoYXIgKnAxOworCQkJc2l6ZV90CQlwMWxlbjsKKwkJCWNvbnN0IGNoYXIgKnQx OworCQkJc2l6ZV90CQl0MWxlbjsKKwkJCWJvb2wJCWZvdW5kX2VzY2FwZTsKKwkJCWNvbnN0 IGNoYXIgKnN1YnBhdDsKKwkJCXNpemVfdAkJc3VicGF0bGVuOworCQkJY2hhcgkgICAqYnVm ID0gTlVMTDsKKworCQkJLyoKKwkJCSAqIERldGVybWluZSBuZXh0IHN1YnN0cmluZyBvZiBw YXR0ZXJuIHdpdGhvdXQgd2lsZGNhcmRzLiAgcCBpcworCQkJICogdGhlIHN0YXJ0IG9mIHRo ZSBzdWJwYXR0ZXJuLCBwMSBpcyBvbmUgcGFzdCB0aGUgbGFzdCBieXRlLiBBbHNvCisJCQkg KiB0cmFjayBpZiB3ZSBmb3VuZCBhbiBlc2NhcGUgY2hhcmFjdGVyLgorCQkJICovCisJCQlw MSA9IHA7CisJCQlwMWxlbiA9IHBsZW47CisJCQlmb3VuZF9lc2NhcGUgPSBmYWxzZTsKKwkJ CXdoaWxlIChwMWxlbiA+IDApCisJCQl7CisJCQkJaWYgKCpwMSA9PSAnXFwnKQorCQkJCXsK KwkJCQkJZm91bmRfZXNjYXBlID0gdHJ1ZTsKKwkJCQkJTmV4dEJ5dGUocDEsIHAxbGVuKTsK KwkJCQl9CisJCQkJZWxzZSBpZiAoKnAxID09ICdfJyB8fCAqcDEgPT0gJyUnKQorCQkJCQli cmVhazsKKwkJCQlOZXh0Qnl0ZShwMSwgcDFsZW4pOworCQkJfQorCisJCQkvKgorCQkJICog SWYgd2UgZm91bmQgYW4gZXNjYXBlIGNoYXJhY3RlciwgdGhlbiBtYWtlIGFuIHVuZXNjYXBl ZCBjb3B5IG9mCisJCQkgKiB0aGUgc3VicGF0dGVybi4KKwkJCSAqLworCQkJaWYgKGZvdW5k X2VzY2FwZSkKKwkJCXsKKwkJCQljaGFyCSAgICpiOworCisJCQkJYiA9IGJ1ZiA9IHBhbGxv YyhwMSAtIHApOworCQkJCWZvciAoY29uc3QgY2hhciAqYyA9IHA7IGMgPCBwMTsgYysrKQor CQkJCXsKKwkJCQkJaWYgKCpjID09ICdcXCcpCisJCQkJCQk7CisJCQkJCWVsc2UKKwkJCQkJ CSooYisrKSA9ICpjOworCQkJCX0KKworCQkJCXN1YnBhdCA9IGJ1ZjsKKwkJCQlzdWJwYXRs ZW4gPSBiIC0gYnVmOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN1YnBhdCA9IHA7CisJ CQkJc3VicGF0bGVuID0gcDEgLSBwOworCQkJfQorCisJCQkvKgorCQkJICogTm93IGJ1aWxk IGEgc3Vic3RyaW5nIG9mIHRoZSB0ZXh0IGFuZCB0cnkgdG8gbWF0Y2ggaXQgYWdhaW5zdAor CQkJICogdGhlIHN1YnBhdHRlcm4uICB0IGlzIHRoZSBzdGFydCBvZiB0aGUgdGV4dCwgdDEg aXMgb25lIHBhc3QgdGhlCisJCQkgKiBsYXN0IGJ5dGUuICBXZSBzdGFydCB3aXRoIGEgemVy by1sZW5ndGggc3RyaW5nLgorCQkJICovCisJCQl0MSA9IHQ7CisJCQl0MWxlbiA9IHRsZW47 CisJCQlmb3IgKDs7KQorCQkJeworCQkJCWludAkJCWNtcDsKKworCQkJCWNtcCA9IHBnX3N0 cm5jb2xsKHN1YnBhdCwgc3VicGF0bGVuLCB0LCAodDEgLSB0KSwgbG9jYWxlKTsKKworCQkJ CS8qCisJCQkJICogSWYgd2UgZm91bmQgYSBtYXRjaCwgd2UgaGF2ZSB0byB0ZXN0IGlmIHRo ZSByZXN0IG9mIHBhdHRlcm4KKwkJCQkgKiBjYW4gbWF0Y2ggYWdhaW5zdCB0aGUgcmVzdCBv ZiB0aGUgc3RyaW5nLiAgT3RoZXJ3aXNlIHdlCisJCQkJICogaGF2ZSB0byBjb250aW51ZSBo ZXJlIHRyeSBtYXRjaGluZyB3aXRoIGEgbG9uZ2VyIHN1YnN0cmluZy4KKwkJCQkgKiAoVGhp cyBpcyBzaW1pbGFyIHRvIHRoZSByZWN1cnNpb24gZm9yIHRoZSAnJScgd2lsZGNhcmQKKwkJ CQkgKiBhYm92ZS4pCisJCQkJICoKKwkJCQkgKiBOb3RlIHRoYXQgd2UgY2FuJ3QganVzdCB3 aW5kIGZvcndhcmQgcCBhbmQgdCBhbmQgY29udGludWUKKwkJCQkgKiB3aXRoIHRoZSBtYWlu IGxvb3AuICBUaGlzIHdvdWxkIGZhaWwgZm9yIGV4YW1wbGUgd2l0aAorCQkJCSAqCisJCQkJ ICogVSYnXDAwNjFcMDMwOGJjJyBMSUtFIFUmJ1wwMEU0X2MnIENPTExBVEUgaWdub3JlX2Fj Y2VudHMKKwkJCQkgKgorCQkJCSAqIFlvdSdkIGZpbmQgdGhhdCB0PVwwMDYxIG1hdGNoZXMg cD1cMDBFNCwgYnV0IHRoZW4gdGhlIHJlc3QKKwkJCQkgKiB3b24ndCBtYXRjaDsgYnV0IHQ9 XDAwNjFcMDMwOCBhbHNvIG1hdGNoZXMgcD1cMDBFNCwgYW5kCisJCQkJICogdGhlbiB0aGUg cmVzdCB3aWxsIG1hdGNoLgorCQkJCSAqLworCQkJCWlmIChjbXAgPT0gMCkKKwkJCQl7CisJ CQkJCWludAkJCW1hdGNoZWQgPSBNYXRjaFRleHQodDEsIHQxbGVuLCBwMSwgcDFsZW4sIGxv Y2FsZSwgbG9jYWxlX2lzX2MpOworCisJCQkJCWlmIChtYXRjaGVkID09IExJS0VfVFJVRSkK KwkJCQkJeworCQkJCQkJaWYgKGJ1ZikKKwkJCQkJCQlwZnJlZShidWYpOworCQkJCQkJcmV0 dXJuIG1hdGNoZWQ7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKgorCQkJCSAqIERpZG4ndCBt YXRjaC4gIElmIHdlIHVzZWQgdXAgdGhlIHdob2xlIHRleHQsIHRoZW4gdGhlIG1hdGNoCisJ CQkJICogZmFpbHMuICBPdGhlcndpc2UsIHRyeSBhZ2FpbiB3aXRoIGEgbG9uZ2VyIHN1YnN0 cmluZy4KKwkJCQkgKi8KKwkJCQlpZiAodDFsZW4gPT0gMCkKKwkJCQkJcmV0dXJuIExJS0Vf RkFMU0U7CisJCQkJZWxzZQorCQkJCQlOZXh0Q2hhcih0MSwgdDFsZW4pOworCQkJfQorCQkJ aWYgKGJ1ZikKKwkJCQlwZnJlZShidWYpOworCQkJY29udGludWU7CisJCX0KIAkJZWxzZSBp ZiAoR0VUQ0hBUigqcCkgIT0gR0VUQ0hBUigqdCkpCiAJCXsKIAkJCS8qIG5vbi13aWxkY2Fy ZCBwYXR0ZXJuIGNoYXIgZmFpbHMgdG8gbWF0Y2ggdGV4dCBjaGFyICovCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMKaW5kZXggMjYzNTA1MDg2MWYuLjNjNjkxYTVjYzk1 IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMKKysr IGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2Vfc3VwcG9ydC5jCkBAIC0yNzIsMjIgKzI3 Miw2IEBAIG1hdGNoX3BhdHRlcm5fcHJlZml4KE5vZGUgKmxlZnRvcCwKIAkJcmV0dXJuIE5J TDsKIAlwYXR0ID0gKENvbnN0ICopIHJpZ2h0b3A7CiAKLQkvKgotCSAqIE5vdCBzdXBwb3J0 ZWQgaWYgdGhlIGV4cHJlc3Npb24gY29sbGF0aW9uIGlzIG5vbmRldGVybWluaXN0aWMuICBU aGUKLQkgKiBvcHRpbWl6ZWQgZXF1YWxpdHkgb3IgcHJlZml4IHRlc3RzIHVzZSBieXRld2lz ZSBjb21wYXJpc29ucywgd2hpY2ggaXMKLQkgKiBub3QgY29uc2lzdGVudCB3aXRoIG5vbmRl dGVybWluaXN0aWMgY29sbGF0aW9ucy4gIFRoZSBhY3R1YWwKLQkgKiBwYXR0ZXJuLW1hdGNo aW5nIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucyB3aWxsIGxhdGVyIGVycm9yIG91dCB0aGF0 Ci0JICogcGF0dGVybi1tYXRjaGluZyBpcyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uZGV0ZXJt aW5pc3RpYyBjb2xsYXRpb25zLiAoV2UKLQkgKiBjb3VsZCBhbHNvIGVycm9yIG91dCBoZXJl LCBidXQgYnkgZG9pbmcgaXQgbGF0ZXIgd2UgZ2V0IG1vcmUgcHJlY2lzZQotCSAqIGVycm9y IG1lc3NhZ2VzLikgIChJdCBzaG91bGQgYmUgcG9zc2libGUgdG8gc3VwcG9ydCBhdCBsZWFz dAotCSAqIFBhdHRlcm5fUHJlZml4X0V4YWN0LCBidXQgbm8gcG9pbnQgYXMgbG9uZyBhcyB0 aGUgYWN0dWFsCi0JICogcGF0dGVybi1tYXRjaGluZyBpbXBsZW1lbnRhdGlvbnMgZG9uJ3Qg c3VwcG9ydCBpdC4pCi0JICoKLQkgKiBleHByX2NvbGwgaXMgbm90IHNldCBmb3IgYSBub24t Y29sbGF0aW9uLWF3YXJlIGRhdGEgdHlwZSBzdWNoIGFzIGJ5dGVhLgotCSAqLwotCWlmIChl eHByX2NvbGwgJiYgIWdldF9jb2xsYXRpb25faXNkZXRlcm1pbmlzdGljKGV4cHJfY29sbCkp Ci0JCXJldHVybiBOSUw7Ci0KIAkvKgogCSAqIFRyeSB0byBleHRyYWN0IGEgZml4ZWQgcHJl Zml4IGZyb20gdGhlIHBhdHRlcm4uCiAJICovCkBAIC00MDQsNiArMzg4LDggQEAgbWF0Y2hf cGF0dGVybl9wcmVmaXgoTm9kZSAqbGVmdG9wLAogCXsKIAkJaWYgKCFvcF9pbl9vcGZhbWls eShlcW9wciwgb3BmYW1pbHkpKQogCQkJcmV0dXJuIE5JTDsKKwkJaWYgKGluZGV4Y29sbGF0 aW9uICE9IGV4cHJfY29sbCkKKwkJCXJldHVybiBOSUw7CiAJCWV4cHIgPSBtYWtlX29wY2xh dXNlKGVxb3ByLCBCT09MT0lELCBmYWxzZSwKIAkJCQkJCQkgKEV4cHIgKikgbGVmdG9wLCAo RXhwciAqKSBwcmVmaXgsCiAJCQkJCQkJIEludmFsaWRPaWQsIGluZGV4Y29sbGF0aW9uKTsK QEAgLTQxMSw2ICszOTcsMTcgQEAgbWF0Y2hfcGF0dGVybl9wcmVmaXgoTm9kZSAqbGVmdG9w LAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAorCS8qCisJICogQW55dGhpbmcgb3RoZXIgdGhh biBQYXR0ZXJuX1ByZWZpeF9FeGFjdCBpcyBub3Qgc3VwcG9ydGVkIGlmIHRoZQorCSAqIGV4 cHJlc3Npb24gY29sbGF0aW9uIGlzIG5vbmRldGVybWluaXN0aWMuICBUaGUgb3B0aW1pemVk IGVxdWFsaXR5IG9yCisJICogcHJlZml4IHRlc3RzIHVzZSBieXRld2lzZSBjb21wYXJpc29u cywgd2hpY2ggaXMgbm90IGNvbnNpc3RlbnQgd2l0aAorCSAqIG5vbmRldGVybWluaXN0aWMg Y29sbGF0aW9ucy4KKwkgKgorCSAqIGV4cHJfY29sbCBpcyBub3Qgc2V0IGZvciBhIG5vbi1j b2xsYXRpb24tYXdhcmUgZGF0YSB0eXBlIHN1Y2ggYXMgYnl0ZWEuCisJICovCisJaWYgKGV4 cHJfY29sbCAmJiAhZ2V0X2NvbGxhdGlvbl9pc2RldGVybWluaXN0aWMoZXhwcl9jb2xsKSkK KwkJcmV0dXJuIE5JTDsKKwogCS8qCiAJICogT3RoZXJ3aXNlLCB3ZSBoYXZlIGEgbm9uZW1w dHkgcmVxdWlyZWQgcHJlZml4IG9mIHRoZSB2YWx1ZXMuICBTb21lCiAJICogb3BjbGFzc2Vz IHN1cHBvcnQgcHJlZml4IGNoZWNrcyBkaXJlY3RseSwgb3RoZXJ3aXNlIHdlJ2xsIHRyeSB0 bwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51 dGY4Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5v dXQKaW5kZXggN2Q1OWZiNDQzMTYuLjhiZmRmMzNjMmZhIDEwMDY0NAotLS0gYS9zcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0CisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQKQEAgLTEyNzIsNiArMTI3 MiwzMCBAQCBDUkVBVEUgQ09MTEFUSU9OIGN0ZXN0X2RldCAocHJvdmlkZXIgPSBpY3UsIGxv Y2FsZSA9ICcnLCBkZXRlcm1pbmlzdGljID0gdHJ1ZSk7CiBOT1RJQ0U6ICB1c2luZyBzdGFu ZGFyZCBmb3JtICJ1bmQiIGZvciBJQ1UgbG9jYWxlICIiCiBDUkVBVEUgQ09MTEFUSU9OIGN0 ZXN0X25vbmRldCAocHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICcnLCBkZXRlcm1pbmlzdGlj ID0gZmFsc2UpOwogTk9USUNFOiAgdXNpbmcgc3RhbmRhcmQgZm9ybSAidW5kIiBmb3IgSUNV IGxvY2FsZSAiIgorU0VMRUNUICdhYmMnIExJS0UgJ2FiYycgQ09MTEFURSBjdGVzdF9kZXQ7 CisgP2NvbHVtbj8gCistLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitTRUxFQ1QgJ2FiYycg TElLRSAnYVxiYycgQ09MTEFURSBjdGVzdF9kZXQ7CisgP2NvbHVtbj8gCistLS0tLS0tLS0t CisgdAorKDEgcm93KQorCitTRUxFQ1QgJ2FiYycgTElLRSAnYWJjJyBDT0xMQVRFIGN0ZXN0 X25vbmRldDsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVD VCAnYWJjJyBMSUtFICdhXGJjJyBDT0xMQVRFIGN0ZXN0X25vbmRldDsKKyA/Y29sdW1uPyAK Ky0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKIENSRUFURSBUQUJMRSB0ZXN0NiAoYSBpbnQs IGIgdGV4dCk7CiAtLSBzYW1lIHN0cmluZyBpbiBkaWZmZXJlbnQgbm9ybWFsIGZvcm1zCiBJ TlNFUlQgSU5UTyB0ZXN0NiBWQUxVRVMgKDEsIFUmJ1wwMEU0YmMnKTsKQEAgLTEyOTYsNiAr MTMyMCwxOSBAQCBTRUxFQ1QgKiBGUk9NIHRlc3Q2IFdIRVJFIGIgPSAnw6RiYycgQ09MTEFU RSBjdGVzdF9ub25kZXQ7CiAgMiB8IGHMiGJjCiAoMiByb3dzKQogCitTRUxFQ1QgKiBGUk9N IHRlc3Q2IFdIRVJFIGIgTElLRSAnw6RiYycgQ09MTEFURSBjdGVzdF9kZXQ7CisgYSB8ICBi ICAKKy0tLSstLS0tLQorIDEgfCDDpGJjCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gdGVz dDYgV0hFUkUgYiBMSUtFICfDpGJjJyBDT0xMQVRFIGN0ZXN0X25vbmRldDsKKyBhIHwgIGIg IAorLS0tKy0tLS0tCisgMSB8IMOkYmMKKyAyIHwgYcyIYmMKKygyIHJvd3MpCisKIC0tIHNh bWUgd2l0aCBhcnJheXMKIENSRUFURSBUQUJMRSB0ZXN0NmEgKGEgaW50LCBiIHRleHRbXSk7 CiBJTlNFUlQgSU5UTyB0ZXN0NmEgVkFMVUVTICgxLCBBUlJBWVtVJidcMDBFNGJjJ10pOwpA QCAtMTUxMiw3ICsxNTQ5LDEyIEBAIFNFTEVDVCB4IEZST00gdGVzdDNjaSBXSEVSRSB4IDw+ ICdhYmMnOwogKDIgcm93cykKIAogU0VMRUNUIHggRlJPTSB0ZXN0M2NpIFdIRVJFIHggTElL RSAnYSUnOwotRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBz dXBwb3J0ZWQgZm9yIExJS0UKKyAgeCAgCistLS0tLQorIGFiYworIEFCQworKDIgcm93cykK KwogU0VMRUNUIHggRlJPTSB0ZXN0M2NpIFdIRVJFIHggSUxJS0UgJ2ElJzsKIEVSUk9SOiAg bm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBJTElL RQogU0VMRUNUIHggRlJPTSB0ZXN0M2NpIFdIRVJFIHggU0lNSUxBUiBUTyAnYSUnOwpAQCAt MTYzMCw3ICsxNjcyLDEyIEBAIFNFTEVDVCB4IEZST00gdGVzdDNicGNpIFdIRVJFIHggPD4g J2FiYyc7CiAoMiByb3dzKQogCiBTRUxFQ1QgeCBGUk9NIHRlc3QzYnBjaSBXSEVSRSB4IExJ S0UgJ2ElJzsKLUVSUk9SOiAgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGFyZSBub3Qg c3VwcG9ydGVkIGZvciBMSUtFCisgIHggIAorLS0tLS0KKyBhYmMKKyBBQkMKKygyIHJvd3Mp CisKIFNFTEVDVCB4IEZST00gdGVzdDNicGNpIFdIRVJFIHggSUxJS0UgJ2ElJzsKIEVSUk9S OiAgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBJ TElLRQogU0VMRUNUIHggRlJPTSB0ZXN0M2JwY2kgV0hFUkUgeCBTSU1JTEFSIFRPICdhJSc7 CkBAIC0xNzI3LDcgKzE3NzQsNyBAQCBTRUxFQ1Qgc3RyaW5nX3RvX2FycmF5KCdBQkNERUZH SEknOjpjaGFyKDkpIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSwgTlVMTCwgJ2InKQogLS0g VGhpcyB0ZXN0cyB0aGUgaXNzdWUgZGVzY3JpYmVkIGluIG1hdGNoX3BhdHRlcm5fcHJlZml4 KCkuICBJbiB0aGUKIC0tIGFic2VuY2Ugb2YgdGhhdCBjaGVjaywgdGhlIGNhc2VfaW5zZW5z aXRpdmUgdGVzdHMgYmVsb3cgd291bGQKIC0tIHJldHVybiBubyByb3dzIHdoZXJlIHRoZXkg c2hvdWxkIGxvZ2ljYWxseSByZXR1cm4gb25lLgotQ1JFQVRFIFRBQkxFIHRlc3Q0YyAoeCB0 ZXh0IENPTExBVEUgIkMiKTsKK0NSRUFURSBUQUJMRSB0ZXN0NGMgKHggdGV4dCBDT0xMQVRF IGNhc2VfaW5zZW5zaXRpdmUpOwogSU5TRVJUIElOVE8gdGVzdDRjIFZBTFVFUyAoJ2FiYycp OwogQ1JFQVRFIElOREVYIE9OIHRlc3Q0YyAoeCk7CiBTRVQgZW5hYmxlX3NlcXNjYW4gPSBv ZmY7CkBAIC0xNzQxLDEwICsxNzg4LDE4IEBAIFNFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJF IHggTElLRSAnQUJDJScgQ09MTEFURSBjYXNlX3NlbnNpdGl2ZTsgIC0tIG9rLCBubyByb3dz CiAtLS0KICgwIHJvd3MpCiAKLVNFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAn QUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7ICAtLSBlcnJvcgotRVJST1I6ICBub25k ZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIExJS0UKLVNF TEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJScgQ09MTEFURSBjYXNlX2lu c2Vuc2l0aXZlOyAgLS0gZXJyb3IKLUVSUk9SOiAgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRp b25zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBMSUtFCitTRUxFQ1QgeCBGUk9NIHRlc3Q0YyBX SEVSRSB4IExJS0UgJ0FCQycgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOyAgLS0gb2sKKyAg eCAgCistLS0tLQorIGFiYworKDEgcm93KQorCitTRUxFQ1QgeCBGUk9NIHRlc3Q0YyBXSEVS RSB4IExJS0UgJ0FCQyUnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0tIG9rCisgIHgg IAorLS0tLS0KKyBhYmMKKygxIHJvdykKKwogUkVTRVQgZW5hYmxlX3NlcXNjYW47CiAtLSBV bmljb2RlIHNwZWNpYWwgY2FzZTogZGlmZmVyZW50IHZhcmlhbnRzIG9mIEdyZWVrIGxvd2Vy IGNhc2Ugc2lnbWEuCiAtLSBBIG5haXZlIGltcGxlbWVudGF0aW9uIGxpa2UgY2l0ZXh0IHRo YXQganVzdCBkb2VzIGxvd2VyKHgpID0KQEAgLTE4MzgsNiArMTg5MywxOCBAQCBTRUxFQ1Qg KiBGUk9NIHRlc3Q0IFdIRVJFIGIgPSAnQ290ZScgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZl OwogIDEgfCBjb3RlCiAoMSByb3cpCiAKKy0tIFRoaXMgaXMgYSB0cmlja3kgb25lLiAgQSBu YWl2ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBmaXJzdCB0ZXN0CistLSBcMDBFNCBtYXRjaGVz IFwwMDYxLCB3aGljaCBpcyB0cnVlIHVuZGVyIGlnbm9yZV9hY2NlbnRzLCBidXQgdGhlbgor LS0gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB3b24ndCBtYXRjaCBhbnltb3JlLiAgVGhlcmVm b3JlLCB0aGUKKy0tIGFsZ29yaXRobSBoYXMgdG8gdGVzdCB3aGV0aGVyIHRoZSByZXN0IG9m IHRoZSBzdHJpbmcgbWF0Y2hlcywgYW5kCistLSBpZiBub3QgdHJ5IG1hdGNoaW5nIFwwMEU0 IGFnYWluc3QgYSBsb25nZXIgc3Vic3RyaW5nIGxpa2UKKy0tIFwwMDYxXDAzMDgsIHdoaWNo IHdpbGwgdGhlbiB3b3JrIG91dC4KK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYn XDAwRTRfYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKyA/Y29sdW1uPyAKKy0tLS0tLS0t LS0KKyB0CisoMSByb3cpCisKIC0tIGZvcmVpZ24ga2V5cyAoc2hvdWxkIHVzZSBjb2xsYXRp b24gb2YgcHJpbWFyeSBrZXkpCiAtLSBQSyBpcyBjYXNlLXNlbnNpdGl2ZSwgRksgaXMgY2Fz ZS1pbnNlbnNpdGl2ZQogQ1JFQVRFIFRBQkxFIHRlc3QxMHBrICh4IHRleHQgQ09MTEFURSBj YXNlX3NlbnNpdGl2ZSBQUklNQVJZIEtFWSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Nv bGxhdGUuaWN1LnV0Zjguc3FsCmluZGV4IDgwZjI4YTk3ZDc4Li40ODFhOTk1Yzk5OCAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwKQEAgLTUxNCw2 ICs1MTQsMTIgQEAgQ1JFQVRFIENPTExBVElPTiB0ZXN0Y29sbF9ydWxlc3ggKHByb3ZpZGVy ID0gaWN1LCBsb2NhbGUgPSAnJywgcnVsZXMgPSAnISF3cm9uZyEKIENSRUFURSBDT0xMQVRJ T04gY3Rlc3RfZGV0IChwcm92aWRlciA9IGljdSwgbG9jYWxlID0gJycsIGRldGVybWluaXN0 aWMgPSB0cnVlKTsKIENSRUFURSBDT0xMQVRJT04gY3Rlc3Rfbm9uZGV0IChwcm92aWRlciA9 IGljdSwgbG9jYWxlID0gJycsIGRldGVybWluaXN0aWMgPSBmYWxzZSk7CiAKK1NFTEVDVCAn YWJjJyBMSUtFICdhYmMnIENPTExBVEUgY3Rlc3RfZGV0OworU0VMRUNUICdhYmMnIExJS0Ug J2FcYmMnIENPTExBVEUgY3Rlc3RfZGV0OworCitTRUxFQ1QgJ2FiYycgTElLRSAnYWJjJyBD T0xMQVRFIGN0ZXN0X25vbmRldDsKK1NFTEVDVCAnYWJjJyBMSUtFICdhXGJjJyBDT0xMQVRF IGN0ZXN0X25vbmRldDsKKwogQ1JFQVRFIFRBQkxFIHRlc3Q2IChhIGludCwgYiB0ZXh0KTsK IC0tIHNhbWUgc3RyaW5nIGluIGRpZmZlcmVudCBub3JtYWwgZm9ybXMKIElOU0VSVCBJTlRP IHRlc3Q2IFZBTFVFUyAoMSwgVSYnXDAwRTRiYycpOwpAQCAtNTIyLDYgKzUyOCw5IEBAIENS RUFURSBUQUJMRSB0ZXN0NiAoYSBpbnQsIGIgdGV4dCk7CiBTRUxFQ1QgKiBGUk9NIHRlc3Q2 IFdIRVJFIGIgPSAnw6RiYycgQ09MTEFURSBjdGVzdF9kZXQ7CiBTRUxFQ1QgKiBGUk9NIHRl c3Q2IFdIRVJFIGIgPSAnw6RiYycgQ09MTEFURSBjdGVzdF9ub25kZXQ7CiAKK1NFTEVDVCAq IEZST00gdGVzdDYgV0hFUkUgYiBMSUtFICfDpGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKK1NF TEVDVCAqIEZST00gdGVzdDYgV0hFUkUgYiBMSUtFICfDpGJjJyBDT0xMQVRFIGN0ZXN0X25v bmRldDsKKwogLS0gc2FtZSB3aXRoIGFycmF5cwogQ1JFQVRFIFRBQkxFIHRlc3Q2YSAoYSBp bnQsIGIgdGV4dFtdKTsKIElOU0VSVCBJTlRPIHRlc3Q2YSBWQUxVRVMgKDEsIEFSUkFZW1Um J1wwMEU0YmMnXSk7CkBAIC02MzcsMTQgKzY0NiwxNCBAQCBDUkVBVEUgVU5JUVVFIElOREVY IE9OIHRlc3QzYnBjaSAoeCk7ICAtLSBlcnJvcgogLS0gVGhpcyB0ZXN0cyB0aGUgaXNzdWUg ZGVzY3JpYmVkIGluIG1hdGNoX3BhdHRlcm5fcHJlZml4KCkuICBJbiB0aGUKIC0tIGFic2Vu Y2Ugb2YgdGhhdCBjaGVjaywgdGhlIGNhc2VfaW5zZW5zaXRpdmUgdGVzdHMgYmVsb3cgd291 bGQKIC0tIHJldHVybiBubyByb3dzIHdoZXJlIHRoZXkgc2hvdWxkIGxvZ2ljYWxseSByZXR1 cm4gb25lLgotQ1JFQVRFIFRBQkxFIHRlc3Q0YyAoeCB0ZXh0IENPTExBVEUgIkMiKTsKK0NS RUFURSBUQUJMRSB0ZXN0NGMgKHggdGV4dCBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUpOwog SU5TRVJUIElOVE8gdGVzdDRjIFZBTFVFUyAoJ2FiYycpOwogQ1JFQVRFIElOREVYIE9OIHRl c3Q0YyAoeCk7CiBTRVQgZW5hYmxlX3NlcXNjYW4gPSBvZmY7CiBTRUxFQ1QgeCBGUk9NIHRl c3Q0YyBXSEVSRSB4IExJS0UgJ0FCQycgQ09MTEFURSBjYXNlX3NlbnNpdGl2ZTsgIC0tIG9r LCBubyByb3dzCiBTRUxFQ1QgeCBGUk9NIHRlc3Q0YyBXSEVSRSB4IExJS0UgJ0FCQyUnIENP TExBVEUgY2FzZV9zZW5zaXRpdmU7ICAtLSBvaywgbm8gcm93cwotU0VMRUNUIHggRlJPTSB0 ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0t IGVycm9yCi1TRUxFQ1QgeCBGUk9NIHRlc3Q0YyBXSEVSRSB4IExJS0UgJ0FCQyUnIENPTExB VEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0tIGVycm9yCitTRUxFQ1QgeCBGUk9NIHRlc3Q0YyBX SEVSRSB4IExJS0UgJ0FCQycgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOyAgLS0gb2sKK1NF TEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJScgQ09MTEFURSBjYXNlX2lu c2Vuc2l0aXZlOyAgLS0gb2sKIFJFU0VUIGVuYWJsZV9zZXFzY2FuOwogCiAtLSBVbmljb2Rl IHNwZWNpYWwgY2FzZTogZGlmZmVyZW50IHZhcmlhbnRzIG9mIEdyZWVrIGxvd2VyIGNhc2Ug c2lnbWEuCkBAIC02ODcsNiArNjk2LDE0IEBAIENSRUFURSBUQUJMRSB0ZXN0NCAoYSBpbnQs IGIgdGV4dCk7CiBTRUxFQ1QgKiBGUk9NIHRlc3Q0IFdIRVJFIGIgPSAnQ290ZScgQ09MTEFU RSBpZ25vcmVfYWNjZW50czsgIC0tIHN0aWxsIGNhc2Utc2Vuc2l0aXZlCiBTRUxFQ1QgKiBG Uk9NIHRlc3Q0IFdIRVJFIGIgPSAnQ290ZScgQ09MTEFURSBjYXNlX2luc2Vuc2l0aXZlOwog CistLSBUaGlzIGlzIGEgdHJpY2t5IG9uZS4gIEEgbmFpdmUgaW1wbGVtZW50YXRpb24gd291 bGQgZmlyc3QgdGVzdAorLS0gXDAwRTQgbWF0Y2hlcyBcMDA2MSwgd2hpY2ggaXMgdHJ1ZSB1 bmRlciBpZ25vcmVfYWNjZW50cywgYnV0IHRoZW4KKy0tIHRoZSByZXN0IG9mIHRoZSBzdHJp bmcgd29uJ3QgbWF0Y2ggYW55bW9yZS4gIFRoZXJlZm9yZSwgdGhlCistLSBhbGdvcml0aG0g aGFzIHRvIHRlc3Qgd2hldGhlciB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIG1hdGNoZXMsIGFu ZAorLS0gaWYgbm90IHRyeSBtYXRjaGluZyBcMDBFNCBhZ2FpbnN0IGEgbG9uZ2VyIHN1YnN0 cmluZyBsaWtlCistLSBcMDA2MVwwMzA4LCB3aGljaCB3aWxsIHRoZW4gd29yayBvdXQuCitT RUxFQ1QgVSYnXDAwNjFcMDMwOGJjJyBMSUtFIFUmJ1wwMEU0X2MnIENPTExBVEUgaWdub3Jl X2FjY2VudHM7CisKIC0tIGZvcmVpZ24ga2V5cyAoc2hvdWxkIHVzZSBjb2xsYXRpb24gb2Yg cHJpbWFyeSBrZXkpCiAKIC0tIFBLIGlzIGNhc2Utc2Vuc2l0aXZlLCBGSyBpcyBjYXNlLWlu c2Vuc2l0aXZlCgpiYXNlLWNvbW1pdDogM2U1MzQ5MmFhNzA4NGJjZWFhOTI3NTdjOTBlMDY3 ZDc5NzY4Nzk3ZQotLSAKMi40NS4yCgo= --------------PJIwCt8xH24Jho0GU99HD8dO--