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 1ullUU-005D9p-7Q for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Aug 2025 09:40:22 +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 1ullUS-006ekg-Iw for pgsql-hackers@arkaria.postgresql.org; Tue, 12 Aug 2025 09:40:20 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ullUS-006ekY-8C for pgsql-hackers@lists.postgresql.org; Tue, 12 Aug 2025 09:40:20 +0000 Received: from mail.postgrespro.ru ([93.174.132.70]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1ullUQ-000B2Y-0h for pgsql-hackers@lists.postgresql.org; Tue, 12 Aug 2025 09:40:20 +0000 Received: from [192.168.18.35] (unknown [188.241.102.96]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 855AC60416; Tue, 12 Aug 2025 12:40:16 +0300 (MSK) Content-Type: multipart/mixed; boundary="------------KzccqGkCmsnc4XScwYcmU0gi" Message-ID: Date: Tue, 12 Aug 2025 11:40:15 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Correction of RowMark Removal During Sel-Join Elimination To: Greg Sabino Mullane Cc: PostgreSQL Hackers , Alexander Korotkov References: <18c6bd6c-6d2a-419a-b0da-dfedef34b585@gmail.com> Content-Language: en-US From: Andrei Lepikhov In-Reply-To: X-KSMG-AntiPhishing: NotDetected X-KSMG-AntiSpam-Interceptor-Info: not scanned X-KSMG-AntiSpam-Status: not scanned, disabled by settings X-KSMG-AntiVirus: Kaspersky Secure Mail Gateway, version 2.1.0.7854, bases: 2025/08/12 08:48:00 #27655498 X-KSMG-AntiVirus-Status: NotDetected, skipped X-KSMG-LinksScanning: not scanned, disabled by settings X-KSMG-Message-Action: skipped X-KSMG-Rule-ID: 1 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------KzccqGkCmsnc4XScwYcmU0gi Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/8/2025 20:15, Greg Sabino Mullane wrote: > I'm not convinced this is an improvement from someone just coming in to > this part of the code, especially given (for example) the comment right > above it: > >  * Determine if the inner table can duplicate outer rows.  We must >  * bypass the unique rel cache here since we're possibly using aThanks for your feedback. I made some minor adjustments to the comments to make the code more consistent. Sure, rrel and krel don't seem like the best solution - I guess natives could find less wordy synonyms than just dumb 'keeping_rel' and 'removing_rel'. But it is simpler to track which relation and RowMark should be removed. -- regards, Andrei Lepikhov --------------KzccqGkCmsnc4XScwYcmU0gi Content-Type: text/plain; charset=UTF-8; name="v1-0001-Force-RowMark-Sanity-Checking.patch" Content-Disposition: attachment; filename="v1-0001-Force-RowMark-Sanity-Checking.patch" Content-Transfer-Encoding: base64 RnJvbSA3NDljODZiZWE3MGJlZDBkNmI5MWZkNjU2NjI3Yjg2NGU3NDM2OWQzIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IFdlZCwgMjMgSnVsIDIwMjUgMTM6NDY6MDIgKzAyMDAKU3ViamVj dDogW1BBVENIIHYxXSBGb3JjZSBSb3dNYXJrIFNhbml0eSBDaGVja2luZwoKVGhlIFNKRSBm ZWF0dXJlIGVsaW1pbmF0ZXMgaW5jb3JyZWN0IFJvd01hcmtzIHdpdGhvdXQgaW50cm9kdWNp bmcgYW55IHBvdGVudGlhbAplcnJvcnMuIFRoaXMgaXMgZHVlIHRvIGEgc3RyYWlnaHRmb3J3 YXJkIHJlYXNvbjogdGhlIHBsYW5uZWQgUm93TWFyayBpcyB1c2VkIHRvCnJlZmVyZW5jZSBh IHJ0YWJsZSBlbnRyeSBpbiBsYXRlciBleGVjdXRpb24gc3RhZ2VzLiBBbiBSVEUgZW50cnkg Zm9yIGtlZXBpbmcKYW5kIHJlbW92aW5nIHJlbGF0aW9ucyBpcyBpZGVudGljYWwgYW5kIHJl ZmVycyB0byB0aGUgc2FtZSByZWxhdGlvbiBPSUQuCgpUbyByZWR1Y2UgY29uZnVzaW9uIGFu ZCBwcmV2ZW50IGZ1dHVyZSBpc3N1ZXMsIHRoaXMgY29tbWl0IGNsZWFucyB1cCB0aGUgY29k ZQphbmQgZml4ZXMgdGhlIGluY29ycmVjdCBiZWhhdmlvdXIuIEFkZGl0aW9uYWxseSwgaXQg cmVuYW1lcyB2YXJpYWJsZXMgdG8gbWFrZQpzaW1pbGFyIGVycm9ycyBtb3JlIGFwcGFyZW50 IGluIHRoZSBmdXR1cmUuIEZ1cnRoZXJtb3JlLCBpdCBpbmNsdWRlcyBzYW5pdHkKY2hlY2tz IGluIHNldHJlZnMuYyBvbiBleGlzdGluZyBub24tbnVsbCBSVEUgYW5kIFJlbE9wdEluZm8g ZW50cmllcwpmb3IgZWFjaCBSb3dNYXJrLgotLS0KIHNyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2FuYWx5emVqb2lucy5jIHwgNDkgKysrKysrKysrKysrLS0tLS0tLS0tLS0KIHNyYy9i YWNrZW5kL29wdGltaXplci9wbGFuL3NldHJlZnMuYyAgICAgIHwgIDQgKysKIDIgZmlsZXMg Y2hhbmdlZCwgMzAgaW5zZXJ0aW9ucygrKSwgMjMgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMgYi9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYwppbmRleCA0ZDU1YzJlYTU5MS4u ZGY2M2YxNjk5ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2Fu YWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVq b2lucy5jCkBAIC02MzEsNiArNjMxLDcgQEAgcmVtb3ZlX2xlZnRqb2lucmVsX2Zyb21fcXVl cnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwKIAkgKiByZW1vdmVfam9pbl9jbGF1 c2VfZnJvbV9yZWxzIHdpbGwgdG91Y2ggaXQuKQogCSAqLwogCXJvb3QtPnNpbXBsZV9yZWxf YXJyYXlbcmVsaWRdID0gTlVMTDsKKwlyb290LT5zaW1wbGVfcnRlX2FycmF5W3JlbGlkXSA9 IE5VTEw7CiAKIAkvKiBBbmQgbnVrZSB0aGUgUmVsT3B0SW5mbywganVzdCBpbiBjYXNlIHRo ZXJlJ3MgYW5vdGhlciBhY2Nlc3MgcGF0aCAqLwogCXBmcmVlKHJlbCk7CkBAIC0xOTc5LDEw ICsxOTgwLDEyIEBAIHJlbW92ZV9zZWxmX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LCBQ bGFuUm93TWFyayAqa21hcmssIFBsYW5Sb3dNYXJrICpybWFyaywKIAkgKiByZW1vdmVfam9p bl9jbGF1c2VfZnJvbV9yZWxzIHdpbGwgdG91Y2ggaXQuKQogCSAqLwogCXJvb3QtPnNpbXBs ZV9yZWxfYXJyYXlbdG9SZW1vdmUtPnJlbGlkXSA9IE5VTEw7CisJcm9vdC0+c2ltcGxlX3J0 ZV9hcnJheVt0b1JlbW92ZS0+cmVsaWRdID0gTlVMTDsKIAogCS8qIEFuZCBudWtlIHRoZSBS ZWxPcHRJbmZvLCBqdXN0IGluIGNhc2UgdGhlcmUncyBhbm90aGVyIGFjY2VzcyBwYXRoLiAq LwogCXBmcmVlKHRvUmVtb3ZlKTsKIAorCiAJLyoKIAkgKiBOb3cgcmVwZWF0IGNvbnN0cnVj dGlvbiBvZiBhdHRyX25lZWRlZCBiaXRzIGNvbWluZyBmcm9tIGFsbCBvdGhlcgogCSAqIHNv dXJjZXMuCkBAIC0yMTQyLDIxICsyMTQ1LDIxIEBAIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9n cm91cChQbGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcykKIAogCXdoaWxlICgociA9 IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIHIpKSA+IDApCiAJewotCQlSZWxPcHRJbmZvICpp bm5lciA9IHJvb3QtPnNpbXBsZV9yZWxfYXJyYXlbcl07CisJCVJlbE9wdEluZm8gKnJyZWwg PSByb290LT5zaW1wbGVfcmVsX2FycmF5W3JdOwogCiAJCWsgPSByOwogCiAJCXdoaWxlICgo ayA9IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIGspKSA+IDApCiAJCXsKIAkJCVJlbGlkcwkJ am9pbnJlbGlkcyA9IE5VTEw7Ci0JCQlSZWxPcHRJbmZvICpvdXRlciA9IHJvb3QtPnNpbXBs ZV9yZWxfYXJyYXlba107CisJCQlSZWxPcHRJbmZvICprcmVsID0gcm9vdC0+c2ltcGxlX3Jl bF9hcnJheVtrXTsKIAkJCUxpc3QJICAgKnJlc3RyaWN0bGlzdDsKIAkJCUxpc3QJICAgKnNl bGZqb2lucXVhbHM7CiAJCQlMaXN0CSAgICpvdGhlcmpvaW5xdWFsczsKIAkJCUxpc3RDZWxs ICAgKmxjOwogCQkJYm9vbAkJamluZm9fY2hlY2sgPSB0cnVlOwotCQkJUGxhblJvd01hcmsg Km9tYXJrID0gTlVMTDsKLQkJCVBsYW5Sb3dNYXJrICppbWFyayA9IE5VTEw7CisJCQlQbGFu Um93TWFyayAqa21hcmsgPSBOVUxMOworCQkJUGxhblJvd01hcmsgKnJtYXJrID0gTlVMTDsK IAkJCUxpc3QJICAgKnVjbGF1c2VzID0gTklMOwogCiAJCQkvKiBBIHNhbml0eSBjaGVjazog dGhlIHJlbGF0aW9ucyBoYXZlIHRoZSBzYW1lIE9pZC4gKi8KQEAgLTIxOTQsMjEgKzIxOTcs MjEgQEAgcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBS ZWxpZHMgcmVsaWRzKQogCQkJewogCQkJCVBsYW5Sb3dNYXJrICpyb3dNYXJrID0gKFBsYW5S b3dNYXJrICopIGxmaXJzdChsYyk7CiAKLQkJCQlpZiAocm93TWFyay0+cnRpID09IGspCisJ CQkJaWYgKHJvd01hcmstPnJ0aSA9PSByKQogCQkJCXsKLQkJCQkJQXNzZXJ0KGltYXJrID09 IE5VTEwpOwotCQkJCQlpbWFyayA9IHJvd01hcms7CisJCQkJCUFzc2VydChybWFyayA9PSBO VUxMKTsKKwkJCQkJcm1hcmsgPSByb3dNYXJrOwogCQkJCX0KLQkJCQllbHNlIGlmIChyb3dN YXJrLT5ydGkgPT0gcikKKwkJCQllbHNlIGlmIChyb3dNYXJrLT5ydGkgPT0gaykKIAkJCQl7 Ci0JCQkJCUFzc2VydChvbWFyayA9PSBOVUxMKTsKLQkJCQkJb21hcmsgPSByb3dNYXJrOwor CQkJCQlBc3NlcnQoa21hcmsgPT0gTlVMTCk7CisJCQkJCWttYXJrID0gcm93TWFyazsKIAkJ CQl9CiAKLQkJCQlpZiAob21hcmsgJiYgaW1hcmspCisJCQkJaWYgKGttYXJrICYmIHJtYXJr KQogCQkJCQlicmVhazsKIAkJCX0KLQkJCWlmIChvbWFyayAmJiBpbWFyayAmJiBvbWFyay0+ bWFya1R5cGUgIT0gaW1hcmstPm1hcmtUeXBlKQorCQkJaWYgKGttYXJrICYmIHJtYXJrICYm IGttYXJrLT5tYXJrVHlwZSAhPSBybWFyay0+bWFya1R5cGUpCiAJCQkJY29udGludWU7CiAK IAkJCS8qCkBAIC0yMjI5LDggKzIyMzIsOCBAQCByZW1vdmVfc2VsZl9qb2luc19vbmVfZ3Jv dXAoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMpCiAJCQkgKiBidWlsZF9qb2lu cmVsX3Jlc3RyaWN0bGlzdCgpIHJvdXRpbmUuCiAJCQkgKi8KIAkJCXJlc3RyaWN0bGlzdCA9 IGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVhbGl0aWVzKHJvb3QsIGpvaW5yZWxpZHMsCi0J CQkJCQkJCQkJCQkJCQlpbm5lci0+cmVsaWRzLAotCQkJCQkJCQkJCQkJCQkJb3V0ZXIsIE5V TEwpOworCQkJCQkJCQkJCQkJCQkJcnJlbC0+cmVsaWRzLAorCQkJCQkJCQkJCQkJCQkJa3Jl bCwgTlVMTCk7CiAJCQlpZiAocmVzdHJpY3RsaXN0ID09IE5JTCkKIAkJCQljb250aW51ZTsK IApAQCAtMjI0MCw3ICsyMjQzLDcgQEAgcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBs YW5uZXJJbmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQogCQkJICogb3RoZXJqb2lucXVhbHMu CiAJCQkgKi8KIAkJCXNwbGl0X3NlbGZqb2luX3F1YWxzKHJvb3QsIHJlc3RyaWN0bGlzdCwg JnNlbGZqb2lucXVhbHMsCi0JCQkJCQkJCSAmb3RoZXJqb2lucXVhbHMsIGlubmVyLT5yZWxp ZCwgb3V0ZXItPnJlbGlkKTsKKwkJCQkJCQkJICZvdGhlcmpvaW5xdWFscywgcnJlbC0+cmVs aWQsIGtyZWwtPnJlbGlkKTsKIAogCQkJQXNzZXJ0KGxpc3RfbGVuZ3RoKHJlc3RyaWN0bGlz dCkgPT0KIAkJCQkgICAobGlzdF9sZW5ndGgoc2VsZmpvaW5xdWFscykgKyBsaXN0X2xlbmd0 aChvdGhlcmpvaW5xdWFscykpKTsKQEAgLTIyNTEsMTcgKzIyNTQsMTcgQEAgcmVtb3ZlX3Nl bGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJbmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQog CQkJICogZGVnZW5lcmF0ZSBjYXNlIHdvcmtzIG9ubHkgaWYgYm90aCBzaWRlcyBoYXZlIHRo ZSBzYW1lIGNsYXVzZS4KIAkJCSAqIFNvIGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHNpZGUgdG8g YWRkLgogCQkJICovCi0JCQlzZWxmam9pbnF1YWxzID0gbGlzdF9jb25jYXQoc2VsZmpvaW5x dWFscywgb3V0ZXItPmJhc2VyZXN0cmljdGluZm8pOworCQkJc2VsZmpvaW5xdWFscyA9IGxp c3RfY29uY2F0KHNlbGZqb2lucXVhbHMsIGtyZWwtPmJhc2VyZXN0cmljdGluZm8pOwogCiAJ CQkvKgotCQkJICogRGV0ZXJtaW5lIGlmIHRoZSBpbm5lciB0YWJsZSBjYW4gZHVwbGljYXRl IG91dGVyIHJvd3MuICBXZSBtdXN0CisJCQkgKiBEZXRlcm1pbmUgaWYgdGhlIHJyZWwgY2Fu IGR1cGxpY2F0ZSBvdXRlciByb3dzLiBXZSBtdXN0CiAJCQkgKiBieXBhc3MgdGhlIHVuaXF1 ZSByZWwgY2FjaGUgaGVyZSBzaW5jZSB3ZSdyZSBwb3NzaWJseSB1c2luZyBhCiAJCQkgKiBz dWJzZXQgb2Ygam9pbiBxdWFscy4gV2UgY2FuIHVzZSAnZm9yY2VfY2FjaGUnID09IHRydWUg d2hlbiBhbGwKIAkJCSAqIGpvaW4gcXVhbHMgYXJlIHNlbGYtam9pbiBxdWFscy4gIE90aGVy d2lzZSwgd2UgY291bGQgZW5kIHVwCiAJCQkgKiBwdXR0aW5nIGZhbHNlIG5lZ2F0aXZlcyBp biB0aGUgY2FjaGUuCiAJCQkgKi8KLQkJCWlmICghaW5uZXJyZWxfaXNfdW5pcXVlX2V4dChy b290LCBqb2lucmVsaWRzLCBpbm5lci0+cmVsaWRzLAotCQkJCQkJCQkJCW91dGVyLCBKT0lO X0lOTkVSLCBzZWxmam9pbnF1YWxzLAorCQkJaWYgKCFpbm5lcnJlbF9pc191bmlxdWVfZXh0 KHJvb3QsIGpvaW5yZWxpZHMsIHJyZWwtPnJlbGlkcywKKwkJCQkJCQkJCQlrcmVsLCBKT0lO X0lOTkVSLCBzZWxmam9pbnF1YWxzLAogCQkJCQkJCQkJCWxpc3RfbGVuZ3RoKG90aGVyam9p bnF1YWxzKSA9PSAwLAogCQkJCQkJCQkJCSZ1Y2xhdXNlcykpCiAJCQkJY29udGludWU7CkBA IC0yMjc3LDE0ICsyMjgwLDE0IEBAIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChQbGFu bmVySW5mbyAqcm9vdCwgUmVsaWRzIHJlbGlkcykKIAkJCSAqIGV4cHJlc3Npb25zLCBvciB3 ZSB3b24ndCBtYXRjaCB0aGUgc2FtZSByb3cgb24gZWFjaCBzaWRlIG9mIHRoZQogCQkJICog am9pbi4KIAkJCSAqLwotCQkJaWYgKCFtYXRjaF91bmlxdWVfY2xhdXNlcyhyb290LCBpbm5l ciwgdWNsYXVzZXMsIG91dGVyLT5yZWxpZCkpCisJCQlpZiAoIW1hdGNoX3VuaXF1ZV9jbGF1 c2VzKHJvb3QsIHJyZWwsIHVjbGF1c2VzLCBrcmVsLT5yZWxpZCkpCiAJCQkJY29udGludWU7 CiAKIAkJCS8qCi0JCQkgKiBXZSBjYW4gcmVtb3ZlIGVpdGhlciByZWxhdGlvbiwgc28gcmVt b3ZlIHRoZSBpbm5lciBvbmUgaW4gb3JkZXIKLQkJCSAqIHRvIHNpbXBsaWZ5IHRoaXMgbG9v cC4KKwkJCSAqIFJlbW92ZSBycmVsIFJlbG9wdEluZm8gZnJvbSB0aGUgcGxhbm5lciBzdHJ1 Y3R1cmVzIGFuZCB0aGUKKwkJCSAqIGNvcnJlc3BvbmRpbmcgcm93IG1hcmsuCiAJCQkgKi8K LQkJCXJlbW92ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIG9tYXJrLCBpbWFyaywgb3V0ZXIsIGlu bmVyLCByZXN0cmljdGxpc3QpOworCQkJcmVtb3ZlX3NlbGZfam9pbl9yZWwocm9vdCwga21h cmssIHJtYXJrLCBrcmVsLCBycmVsLCByZXN0cmljdGxpc3QpOwogCiAJCQlyZXN1bHQgPSBi bXNfYWRkX21lbWJlcihyZXN1bHQsIHIpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9z ZXRyZWZzLmMKaW5kZXggODQ2ZTQ0MTg2YzMuLmQ3MDY1NDZmMzMyIDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9zZXRyZWZzLmMKKysrIGIvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vc2V0cmVmcy5jCkBAIC0zMDcsNiArMzA3LDEwIEBAIHNldF9wbGFu X3JlZmVyZW5jZXMoUGxhbm5lckluZm8gKnJvb3QsIFBsYW4gKnBsYW4pCiAJCVBsYW5Sb3dN YXJrICpyYyA9IGxmaXJzdF9ub2RlKFBsYW5Sb3dNYXJrLCBsYyk7CiAJCVBsYW5Sb3dNYXJr ICpuZXdyYzsKIAorCQkvKiBzYW5pdHkgY2hlY2sgb24gZXhpc3Rpbmcgcm93IG1hcmtzICov CisJCUFzc2VydChyb290LT5zaW1wbGVfcmVsX2FycmF5W3JjLT5ydGldICE9IE5VTEwgJiYK KwkJCSAgIHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlbcmMtPnJ0aV0gIT0gTlVMTCk7CisKIAkJ LyogZmxhdCBjb3B5IGlzIGVub3VnaCBzaW5jZSBhbGwgZmllbGRzIGFyZSBzY2FsYXJzICov CiAJCW5ld3JjID0gKFBsYW5Sb3dNYXJrICopIHBhbGxvYyhzaXplb2YoUGxhblJvd01hcmsp KTsKIAkJbWVtY3B5KG5ld3JjLCByYywgc2l6ZW9mKFBsYW5Sb3dNYXJrKSk7Ci0tIAoyLjUw LjEKCg== --------------KzccqGkCmsnc4XScwYcmU0gi--