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 1p2CuH-0002nW-Qi for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Dec 2022 14:57:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1p2CuF-0001sA-Qy for pgsql-hackers@arkaria.postgresql.org; Mon, 05 Dec 2022 14:57:19 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p2CuF-0001s1-GR for pgsql-hackers@lists.postgresql.org; Mon, 05 Dec 2022 14:57:19 +0000 Received: from relay11.mail.gandi.net ([2001:4b98:dc4:8::231]) by magus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1p2CuD-0004Am-38 for pgsql-hackers@lists.postgresql.org; Mon, 05 Dec 2022 14:57:19 +0000 Received: (Authenticated sender: vik@postgresfriends.org) by mail.gandi.net (Postfix) with ESMTPSA id 8FEF7100018 for ; Mon, 5 Dec 2022 14:57:14 +0000 (UTC) Content-Type: multipart/mixed; boundary="------------TMjLTF6a54Ap0hSthRWSJdIA" Message-ID: <5cff866c-10a8-d2df-32cb-e9072e6b04a2@postgresfriends.org> Date: Mon, 5 Dec 2022 15:57:13 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.2 Content-Language: en-US To: PostgreSQL Hackers From: Vik Fearing Subject: ANY_VALUE aggregate 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. --------------TMjLTF6a54Ap0hSthRWSJdIA Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit The SQL:2023 Standard defines a new aggregate named ANY_VALUE. It returns an implementation-dependent (i.e. non-deterministic) value from the rows in its group. PFA an implementation of this aggregate. Ideally, the transition function would stop being called after the first non-null was found, and then the entire aggregation would stop when all functions say they are finished[*], but this patch does not go anywhere near that far. This patch is based off of commit fb958b5da8. [*] I can imagine something like array_agg(c ORDER BY x LIMIT 5) to get the top five of something without going through a LATERAL subquery. -- Vik Fearing --------------TMjLTF6a54Ap0hSthRWSJdIA Content-Type: text/x-patch; charset=UTF-8; name="0001-Implement-ANY_VALUE-aggregate.patch" Content-Disposition: attachment; filename="0001-Implement-ANY_VALUE-aggregate.patch" Content-Transfer-Encoding: base64 RnJvbSA3NDY1ZmFjMTJmYzYzNmZmMjYwODhhZTMxZGUyOTM3ZjdjM2E0NTlmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRy YXV0Lm9yZz4KRGF0ZTogU2F0LCA5IEFwciAyMDIyIDAwOjA3OjM4ICswMjAwClN1YmplY3Q6 IFtQQVRDSF0gSW1wbGVtZW50IEFOWV9WQUxVRSBhZ2dyZWdhdGUKClNRTDoyMDIzIGRlZmlu ZXMgYW4gQU5ZX1ZBTFVFIGFnZ3JlZ2F0ZSB3aG9zZSBwdXJwb3NlIGlzIHRvIGVtaXQgYW4K aW1wbGVtZW50YXRpb24tZGVwZW5kZW50IChpLmUuIG5vbi1kZXRlcm1pbmlzdGljKSB2YWx1 ZSBmcm9tIHRoZQphZ2dyZWdhdGVkIHJvd3MuCi0tLQogZG9jL3NyYy9zZ21sL2Z1bmMuc2dt bCAgICAgICAgICAgICAgICAgICB8IDE0ICsrKysrKysrKysrKysrCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvbWlzYy5jICAgICAgICAgICAgIHwgMTIgKysrKysrKysrKysrCiBzcmMvaW5j bHVkZS9jYXRhbG9nL3BnX2FnZ3JlZ2F0ZS5kYXQgICAgIHwgIDQgKysrKwogc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICB8ICA4ICsrKysrKysrCiBzcmMvdGVz dC9yZWdyZXNzL2V4cGVjdGVkL2FnZ3JlZ2F0ZXMub3V0IHwgMTggKysrKysrKysrKysrKysr KysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9hZ2dyZWdhdGVzLnNxbCAgICAgIHwgIDUgKysr KysKIDYgZmlsZXMgY2hhbmdlZCwgNjEgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL2Rv Yy9zcmMvc2dtbC9mdW5jLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCmluZGV4IDIw NTJkM2M4NDQuLjE4MjNlZTcxZDcgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jLnNn bWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbApAQCAtMTk3MDYsMTYgKzE5NzA2LDMw IEBAIFNFTEVDVCBOVUxMSUYodmFsdWUsICcobm9uZSknKSAuLi4KICAgICAgICA8cGFyYT4K ICAgICAgICAgRGVzY3JpcHRpb24KICAgICAgICA8L3BhcmE+PC9lbnRyeT4KICAgICAgICA8 ZW50cnk+UGFydGlhbCBNb2RlPC9lbnRyeT4KICAgICAgIDwvcm93PgogICAgICA8L3RoZWFk PgogCiAgICAgIDx0Ym9keT4KKyAgICAgIDxyb3c+CisgICAgICAgPGVudHJ5IHJvbGU9ImZ1 bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4KKyAgICAgICAg PGluZGV4dGVybT4KKyAgICAgICAgIDxwcmltYXJ5PmFueV92YWx1ZTwvcHJpbWFyeT4KKyAg ICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5hbnlfdmFsdWU8L2Z1bmN0 aW9uPiAoIDx0eXBlPiJhbnkiPC90eXBlPiApCisgICAgICAgIDxyZXR1cm52YWx1ZT48cmVw bGFjZWFibGU+c2FtZSBhcyBpbnB1dCB0eXBlPC9yZXBsYWNlYWJsZT48L3JldHVybnZhbHVl PgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgQ2hvb3NlcyBhIG5v bi1kZXRlcm1pbmlzdGljIHZhbHVlIGZyb20gdGhlIG5vbi1udWxsIGlucHV0IHZhbHVlcy4K KyAgICAgICA8L3BhcmE+PC9lbnRyeT4KKyAgICAgICA8ZW50cnk+WWVzPC9lbnRyeT4KKyAg ICAgIDwvcm93PgorCiAgICAgICA8cm93PgogICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3Rh YmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CiAgICAgICAgIDxpbmRl eHRlcm0+CiAgICAgICAgICA8cHJpbWFyeT5hcnJheV9hZ2c8L3ByaW1hcnk+CiAgICAgICAg IDwvaW5kZXh0ZXJtPgogICAgICAgICA8ZnVuY3Rpb24+YXJyYXlfYWdnPC9mdW5jdGlvbj4g KCA8dHlwZT5hbnlub25hcnJheTwvdHlwZT4gKQogICAgICAgICA8cmV0dXJudmFsdWU+YW55 YXJyYXk8L3JldHVybnZhbHVlPgogICAgICAgIDwvcGFyYT4KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9taXNjLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbWlzYy5j CmluZGV4IDljMTMyNTEyMzEuLjk0YzkyZGUwNmQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3V0aWxzL2FkdC9taXNjLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21pc2MuYwpA QCAtOTI4LDggKzkyOCwyMCBAQCBwZ19nZXRfcmVwbGljYV9pZGVudGl0eV9pbmRleChQR19G VU5DVElPTl9BUkdTKQogCWlkeG9pZCA9IFJlbGF0aW9uR2V0UmVwbGljYUluZGV4KHJlbCk7 CiAJdGFibGVfY2xvc2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOwogCiAJaWYgKE9pZElzVmFs aWQoaWR4b2lkKSkKIAkJUEdfUkVUVVJOX09JRChpZHhvaWQpOwogCWVsc2UKIAkJUEdfUkVU VVJOX05VTEwoKTsKIH0KKworRGF0dW0KK2FueV92YWx1ZV90cmFucyhQR19GVU5DVElPTl9B UkdTKQoreworCS8qIFJldHVybiB0aGUgZmlyc3Qgbm9uLW51bGwgYXJndW1lbnQgKi8KKwlp ZiAoIVBHX0FSR0lTTlVMTCgwKSkKKwkJUEdfUkVUVVJOX0RBVFVNKFBHX0dFVEFSR19EQVRV TSgwKSk7CisJaWYgKCFQR19BUkdJU05VTEwoMSkpCisJCVBHX1JFVFVSTl9EQVRVTShQR19H RVRBUkdfREFUVU0oMSkpOworCVBHX1JFVFVSTl9OVUxMKCk7Cit9CisKZGlmZiAtLWdpdCBh L3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfYWdncmVnYXRlLmRhdCBiL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfYWdncmVnYXRlLmRhdAppbmRleCBiOTExMGE1Mjk4Li4zNzYyNmQ2ZjBjIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX2FnZ3JlZ2F0ZS5kYXQKKysrIGIv c3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19hZ2dyZWdhdGUuZGF0CkBAIC02MjAsOSArNjIwLDEz IEBACiAgIGFnZ3RyYW5zZm4gPT4gJ29yZGVyZWRfc2V0X3RyYW5zaXRpb25fbXVsdGknLCBh Z2dmaW5hbGZuID0+ICdjdW1lX2Rpc3RfZmluYWwnLAogICBhZ2dmaW5hbGV4dHJhID0+ICd0 JywgYWdnZmluYWxtb2RpZnkgPT4gJ3cnLCBhZ2dtZmluYWxtb2RpZnkgPT4gJ3cnLAogICBh Z2d0cmFuc3R5cGUgPT4gJ2ludGVybmFsJyB9LAogeyBhZ2dmbm9pZCA9PiAnZGVuc2VfcmFu ayhhbnkpJywgYWdna2luZCA9PiAnaCcsIGFnZ251bWRpcmVjdGFyZ3MgPT4gJzEnLAogICBh Z2d0cmFuc2ZuID0+ICdvcmRlcmVkX3NldF90cmFuc2l0aW9uX211bHRpJywKICAgYWdnZmlu YWxmbiA9PiAnZGVuc2VfcmFua19maW5hbCcsIGFnZ2ZpbmFsZXh0cmEgPT4gJ3QnLCBhZ2dm aW5hbG1vZGlmeSA9PiAndycsCiAgIGFnZ21maW5hbG1vZGlmeSA9PiAndycsIGFnZ3RyYW5z dHlwZSA9PiAnaW50ZXJuYWwnIH0sCiAKKyMgYW55X3ZhbHVlCit7IGFnZ2Zub2lkID0+ICdh bnlfdmFsdWUoYW55ZWxlbWVudCknLCBhZ2d0cmFuc2ZuID0+ICdhbnlfdmFsdWVfdHJhbnMn LAorICBhZ2djb21iaW5lZm4gPT4gJ2FueV92YWx1ZV90cmFucycsIGFnZ3RyYW5zdHlwZSA9 PiAnYW55ZWxlbWVudCcgfSwKKwogXQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXgg ZjkzMDFiMjYyNy4uMmVlNDc5NzU1OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBA IC0xMTg0OSw5ICsxMTg0OSwxNyBAQAogICBwcm9uYW1lID0+ICdicmluX21pbm1heF9tdWx0 aV9zdW1tYXJ5X3JlY3YnLCBwcm92b2xhdGlsZSA9PiAncycsCiAgIHByb3JldHR5cGUgPT4g J3BnX2JyaW5fbWlubWF4X211bHRpX3N1bW1hcnknLCBwcm9hcmd0eXBlcyA9PiAnaW50ZXJu YWwnLAogICBwcm9zcmMgPT4gJ2JyaW5fbWlubWF4X211bHRpX3N1bW1hcnlfcmVjdicgfSwK IHsgb2lkID0+ICc0NjQxJywgZGVzY3IgPT4gJ0kvTycsCiAgIHByb25hbWUgPT4gJ2JyaW5f bWlubWF4X211bHRpX3N1bW1hcnlfc2VuZCcsIHByb3ZvbGF0aWxlID0+ICdzJywKICAgcHJv cmV0dHlwZSA9PiAnYnl0ZWEnLCBwcm9hcmd0eXBlcyA9PiAncGdfYnJpbl9taW5tYXhfbXVs dGlfc3VtbWFyeScsCiAgIHByb3NyYyA9PiAnYnJpbl9taW5tYXhfbXVsdGlfc3VtbWFyeV9z ZW5kJyB9LAogCit7IG9pZCA9PiAnODk4MScsIGRlc2NyID0+ICdhcmJpdHJhcnkgdmFsdWUg ZnJvbSBhbW9uZyBpbnB1dCB2YWx1ZXMnLAorICBwcm9uYW1lID0+ICdhbnlfdmFsdWUnLCBw cm9raW5kID0+ICdhJywgcHJvaXNzdHJpY3QgPT4gJ2YnLAorICBwcm9yZXR0eXBlID0+ICdh bnllbGVtZW50JywgcHJvYXJndHlwZXMgPT4gJ2FueWVsZW1lbnQnLAorICBwcm9zcmMgPT4g J2FnZ3JlZ2F0ZV9kdW1teScgfSwKK3sgb2lkID0+ICc4OTgyJywgZGVzY3IgPT4gJ2FueV92 YWx1ZSB0cmFuc2l0aW9uIGZ1bmN0aW9uJywKKyAgcHJvbmFtZSA9PiAnYW55X3ZhbHVlX3Ry YW5zJywgcHJvcmV0dHlwZSA9PiAnYW55ZWxlbWVudCcsIHByb2FyZ3R5cGVzID0+ICdhbnll bGVtZW50IGFueWVsZW1lbnQnLAorICBwcm9zcmMgPT4gJ2FueV92YWx1ZV90cmFucycgfSwK KwogXQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9hZ2dyZWdhdGVz Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvYWdncmVnYXRlcy5vdXQKaW5kZXgg ZmMyYmQ0MGJlMi4uZmI4N2I5YWJmMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9hZ2dyZWdhdGVzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L2FnZ3JlZ2F0ZXMub3V0CkBAIC0yMCwxNiArMjAsMjggQEAgU0VMRUNUIGF2Zyhmb3VyKSBB UyBhdmdfMSBGUk9NIG9uZWs7CiAoMSByb3cpCiAKIFNFTEVDVCBhdmcoYSkgQVMgYXZnXzMy IEZST00gYWdndGVzdCBXSEVSRSBhIDwgMTAwOwogICAgICAgIGF2Z18zMiAgICAgICAgCiAt LS0tLS0tLS0tLS0tLS0tLS0tLS0KICAzMi42NjY2NjY2NjY2NjY2NjY3CiAoMSByb3cpCiAK K1NFTEVDVCBhbnlfdmFsdWUodikgRlJPTSAoVkFMVUVTICgxKSkgQVMgdiAodik7CisgYW55 X3ZhbHVlIAorLS0tLS0tLS0tLS0KKyAgICAgICAgIDEKKygxIHJvdykKKworU0VMRUNUIGFu eV92YWx1ZSh2KSBGUk9NIChWQUxVRVMgKE5VTEwpKSBBUyB2ICh2KTsKKyBhbnlfdmFsdWUg CistLS0tLS0tLS0tLQorIAorKDEgcm93KQorCiAtLSBJbiA3LjEsIGF2ZyhmbG9hdDQpIGlz IGNvbXB1dGVkIHVzaW5nIGZsb2F0OCBhcml0aG1ldGljLgogLS0gUm91bmQgdGhlIHJlc3Vs dCB0byAzIGRpZ2l0cyB0byBhdm9pZCBwbGF0Zm9ybS1zcGVjaWZpYyByZXN1bHRzLgogU0VM RUNUIGF2ZyhiKTo6bnVtZXJpYygxMCwzKSBBUyBhdmdfMTA3Xzk0MyBGUk9NIGFnZ3Rlc3Q7 CiAgYXZnXzEwN185NDMgCiAtLS0tLS0tLS0tLS0tCiAgICAgIDEwNy45NDMKICgxIHJvdykK IApAQCAtMTg3NSwxNiArMTg4NywyMiBAQCBoYXZpbmcgZXhpc3RzIChzZWxlY3QgMSBmcm9t IG9uZWsgYiB3aGVyZSBzdW0oZGlzdGluY3QgYS5mb3VyKSA9IGIuZm91cik7CiAKIHNlbGVj dCBtYXgoZm9vIENPTExBVEUgIkMiKSBmaWx0ZXIgKHdoZXJlIChiYXIgY29sbGF0ZSAiUE9T SVgiKSA+ICcwJykKIGZyb20gKHZhbHVlcyAoJ2EnLCAnYicpKSBBUyB2KGZvbyxiYXIpOwog IG1heCAKIC0tLS0tCiAgYQogKDEgcm93KQogCitTRUxFQ1QgYW55X3ZhbHVlKHYpIEZJTFRF UiAoV0hFUkUgdiA+IDIpIEZST00gKFZBTFVFUyAoMSksICgyKSwgKDMpKSBBUyB2ICh2KTsK KyBhbnlfdmFsdWUgCistLS0tLS0tLS0tLQorICAgICAgICAgMworKDEgcm93KQorCiAtLSBv dXRlciByZWZlcmVuY2UgaW4gRklMVEVSIChQb3N0Z3JlU1FMIGV4dGVuc2lvbikKIHNlbGVj dCAoc2VsZWN0IGNvdW50KCopCiAgICAgICAgIGZyb20gKHZhbHVlcyAoMSkpIHQwKGlubmVy X2MpKQogZnJvbSAodmFsdWVzICgyKSwoMykpIHQxKG91dGVyX2MpOyAtLSBpbm5lciBxdWVy eSBpcyBhZ2dyZWdhdGlvbiBxdWVyeQogIGNvdW50IAogLS0tLS0tLQogICAgICAxCiAgICAg IDEKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2FnZ3JlZ2F0ZXMuc3FsIGIv c3JjL3Rlc3QvcmVncmVzcy9zcWwvYWdncmVnYXRlcy5zcWwKaW5kZXggYTRjMDBmZjdhOS4u NzIwNmU0NzVhMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvYWdncmVnYXRl cy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvYWdncmVnYXRlcy5zcWwKQEAgLTE5 LDE2ICsxOSwxOSBAQCBDT1BZIGFnZ3Rlc3QgRlJPTSA6J2ZpbGVuYW1lJzsKIAogQU5BTFla RSBhZ2d0ZXN0OwogCiAKIFNFTEVDVCBhdmcoZm91cikgQVMgYXZnXzEgRlJPTSBvbmVrOwog CiBTRUxFQ1QgYXZnKGEpIEFTIGF2Z18zMiBGUk9NIGFnZ3Rlc3QgV0hFUkUgYSA8IDEwMDsK IAorU0VMRUNUIGFueV92YWx1ZSh2KSBGUk9NIChWQUxVRVMgKDEpKSBBUyB2ICh2KTsKK1NF TEVDVCBhbnlfdmFsdWUodikgRlJPTSAoVkFMVUVTIChOVUxMKSkgQVMgdiAodik7CisKIC0t IEluIDcuMSwgYXZnKGZsb2F0NCkgaXMgY29tcHV0ZWQgdXNpbmcgZmxvYXQ4IGFyaXRobWV0 aWMuCiAtLSBSb3VuZCB0aGUgcmVzdWx0IHRvIDMgZGlnaXRzIHRvIGF2b2lkIHBsYXRmb3Jt LXNwZWNpZmljIHJlc3VsdHMuCiAKIFNFTEVDVCBhdmcoYik6Om51bWVyaWMoMTAsMykgQVMg YXZnXzEwN185NDMgRlJPTSBhZ2d0ZXN0OwogCiBTRUxFQ1QgYXZnKGdwYSkgQVMgYXZnXzNf NCBGUk9NIE9OTFkgc3R1ZGVudDsKIAogCkBAIC03MTEsMTYgKzcxNCwxOCBAQCBncm91cCBi eSB0ZW47CiAKIHNlbGVjdCB0ZW4sIHN1bShkaXN0aW5jdCBmb3VyKSBmaWx0ZXIgKHdoZXJl IGZvdXIgPiAxMCkgZnJvbSBvbmVrIGEKIGdyb3VwIGJ5IHRlbgogaGF2aW5nIGV4aXN0cyAo c2VsZWN0IDEgZnJvbSBvbmVrIGIgd2hlcmUgc3VtKGRpc3RpbmN0IGEuZm91cikgPSBiLmZv dXIpOwogCiBzZWxlY3QgbWF4KGZvbyBDT0xMQVRFICJDIikgZmlsdGVyICh3aGVyZSAoYmFy IGNvbGxhdGUgIlBPU0lYIikgPiAnMCcpCiBmcm9tICh2YWx1ZXMgKCdhJywgJ2InKSkgQVMg dihmb28sYmFyKTsKIAorU0VMRUNUIGFueV92YWx1ZSh2KSBGSUxURVIgKFdIRVJFIHYgPiAy KSBGUk9NIChWQUxVRVMgKDEpLCAoMiksICgzKSkgQVMgdiAodik7CisKIC0tIG91dGVyIHJl ZmVyZW5jZSBpbiBGSUxURVIgKFBvc3RncmVTUUwgZXh0ZW5zaW9uKQogc2VsZWN0IChzZWxl Y3QgY291bnQoKikKICAgICAgICAgZnJvbSAodmFsdWVzICgxKSkgdDAoaW5uZXJfYykpCiBm cm9tICh2YWx1ZXMgKDIpLCgzKSkgdDEob3V0ZXJfYyk7IC0tIGlubmVyIHF1ZXJ5IGlzIGFn Z3JlZ2F0aW9uIHF1ZXJ5CiBzZWxlY3QgKHNlbGVjdCBjb3VudCgqKSBmaWx0ZXIgKHdoZXJl IG91dGVyX2MgPD4gMCkKICAgICAgICAgZnJvbSAodmFsdWVzICgxKSkgdDAoaW5uZXJfYykp CiBmcm9tICh2YWx1ZXMgKDIpLCgzKSkgdDEob3V0ZXJfYyk7IC0tIG91dGVyIHF1ZXJ5IGlz IGFnZ3JlZ2F0aW9uIHF1ZXJ5CiBzZWxlY3QgKHNlbGVjdCBjb3VudChpbm5lcl9jKSBmaWx0 ZXIgKHdoZXJlIG91dGVyX2MgPD4gMCkKLS0gCjIuMzQuMQoK --------------TMjLTF6a54Ap0hSthRWSJdIA--