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.96) (envelope-from ) id 1vajvP-00CsGg-0F for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 00:18:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vajvN-004nkR-2X for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Dec 2025 00:18:50 +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.96) (envelope-from ) id 1vajvN-004nkI-0P for pgsql-hackers@lists.postgresql.org; Wed, 31 Dec 2025 00:18:50 +0000 Received: from smtp.outgoing.loopia.se ([93.188.3.37]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vajvK-003Pft-10 for pgsql-hackers@postgresql.org; Wed, 31 Dec 2025 00:18:48 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id 1A5D8509C87 for ; Wed, 31 Dec 2025 01:18:42 +0100 (CET) Received: from s980.loopia.se (unknown [172.22.191.5]) by s807.loopia.se (Postfix) with ESMTP id EDE5E509032; Wed, 31 Dec 2025 01:18:41 +0100 (CET) Received: from localhost (unknown [172.22.191.5]) by s980.loopia.se (Postfix) with ESMTP id EBDBA22015EC; Wed, 31 Dec 2025 01:18:41 +0100 (CET) X-Virus-Scanned: amavis at amavis.loopia.se X-Spam-Flag: NO X-Spam-Score: -1.2 X-Spam-Level: X-Spam-Status: No, score=-1.2 tagged_above=-999 required=6.2 tests=[ALL_TRUSTED=-1, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1] autolearn=disabled Authentication-Results: s471.loopia.se (amavis); dkim=pass (2048-bit key) header.d=proxel.se Received: from s979.loopia.se ([172.22.191.6]) by localhost (s471.loopia.se [172.22.190.35]) (amavis, port 10024) with LMTP id srNu7FP4dRQP; Wed, 31 Dec 2025 01:18:41 +0100 (CET) X-Loopia-Auth: user X-Loopia-User: andreas@proxel.se X-Loopia-Originating-IP: 147.28.75.140 Received: from [192.168.0.121] (customer-147-28-75-140.stosn.net [147.28.75.140]) (Authenticated sender: andreas@proxel.se) by s979.loopia.se (Postfix) with ESMTPSA id 23C5710BC46A; Wed, 31 Dec 2025 01:18:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1767140321; bh=GyXvLwUxXVln8awYYCt0AemuxfS/8M4HZ6c4XEPj5GE=; h=Date:Subject:To:References:From:In-Reply-To; b=jAlafnmE9xN8OECpsQyn0OVYyCIBt3m1EC4f3QODApHTnYx+QjJh9jO2NlwUUSBRj kfUYBAinP9cxfZ/YBuW8ilp1x3cc0e/jeX118WB0Jjf3SJnfg3GCiCHbMQ6M0uddDz fyiqgQFe3MSvVnx9L4BtDQa39l3w+AaO0SoDN8EjDPFIVG641WduOsUe9EQs0Psl/V ans3cR9PKgliNmfdOP1CB1hE91OzVDpcGefT/ecxUT5Q/fVbKOLjM9NVQE3GcW6/nZ s+U1axC/A68+XUSMnaxgt9xEj7bG5N+ny5ifzX/Jo5dK4QlvR/DvVa0tUdsrBKkpqN TC6OVg4w3iWyg== Content-Type: multipart/mixed; boundary="------------sZMAg0tE1W6VCKOt5kHRGVLD" Message-ID: Date: Wed, 31 Dec 2025 01:18:40 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Speed up ICU case conversion by using ucasemap_utf8To*() To: Jeff Davis , pgsql-hackers References: <167986ff-afcf-4542-94c6-61ee8474e138@proxel.se> <72c7c2b5848da44caddfe0f20f6c7ebc7c0c6e60.camel@j-davis.com> From: Andreas Karlsson Content-Language: en-US In-Reply-To: <72c7c2b5848da44caddfe0f20f6c7ebc7c0c6e60.camel@j-davis.com> 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. --------------sZMAg0tE1W6VCKOt5kHRGVLD Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12/20/24 8:24 PM, Jeff Davis wrote: > On Fri, 2024-12-20 at 06:20 +0100, Andreas Karlsson wrote: >> SELECT count(upper) FROM (SELECT upper(('Kålhuvud ' || i) COLLATE >> "sv-SE-x-icu") FROM generate_series(1, 1000000) i); >> >> master:  ~540 ms >> Patched: ~460 ms >> glibc:   ~410 ms > > It looks like you are opening and closing the UCaseMap object each > time. Why not save it in pg_locale_t? That should speed it up even more > and hopefully beat libc. Fixed. New benchmarks are: SELECT count(upper) FROM (SELECT upper(('Kålhuvud ' || i) COLLATE "sv-SE-x-icu") FROM generate_series(1, 1000000) i); master: ~570 ms Patched: ~340 ms glibc: ~400 ms So it does indeed seem like we got a further speedup and now are faster than glibc. > Also, to support older ICU versions consistently, we need to fix up the > locale name to support "und"; cf. pg_ucol_open(). Perhaps factor out > that logic? Fixed. Andreas --------------sZMAg0tE1W6VCKOt5kHRGVLD Content-Type: text/x-patch; charset=UTF-8; name="v2-0001-Use-optimized-versions-of-ICU-case-conversion-for.patch" Content-Disposition: attachment; filename*0="v2-0001-Use-optimized-versions-of-ICU-case-conversion-for.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSAxMzhlY2M2NWM4NWFlZWM3YTFjMDQ1OWY2OTY0MmZkMWVhMzEwM2RiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogVHVlLCAxNyBEZWMgMjAyNCAyMjo0NzowMCArMDEwMApTdWJqZWN0OiBb UEFUQ0ggdjJdIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgSUNVIGNhc2UgY29udmVyc2lv biBmb3IgVVRGLTgKCkluc3RlYWQgb2YgY29udmVydGluZyB0byBhbmQgZnJvbSBVQ2hhciB3 aGVuIGRvaW5nIGNhc2UgY29udmVyc2lvbnMgd2UKdXNlIHRoZSBVVEYtOCB2ZXJzaW9ucyBv ZiB0aGUgZnVuY3Rpb25zLiBUaGlzIGNhbiBnaXZlIGEgc2lnbmZpY2FudApzcGVlZHVwLCAz MC00MCUsIG9uIHNob3J0IHRvIG1lZGl1bSBsZW5ndGggc3RyaW5ncy4KClRoZSBvbmx5IGNv c3Qgd2UgaW5jdXIgaXMgdGhhdCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgY2FzZW1hcCBvYmpl Y3Qgb24KbG9jYWxlIGluaXRpYWxpemF0aW9uIGZvciBVVEYtOCBkYXRhYmFzZXMgYnV0IHRo ZSBvYmplY3QgaXMgcmVhbHRpdmVseQpzbWFsbCBhbmQgdGhlIGFzc3VtcHRpb24gaXMgdGhh dCBtb3N0IHVzZXJzIHdpbGwgYXQgc29tZSBwb2ludCB3YW50IHRvCnJ1biBjYXNlIGNvbnZl cnNpb24gZnVuY3Rpb25zLgoKV2hpbGUgYXQgaXQgd2UgYWxzbyByZW1vdmUgc29tZSBkdXBs aWNhdGlvbiBpbiB0aGUgbm9uLVVURi04IGNvZGUuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3BnX2xvY2FsZV9pY3UuYyB8IDI1MyArKysrKysrKysrKysrKysrKy0tLS0tLS0tLQog c3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggICAgICAgICB8ICAgMiArCiAyIGZpbGVz IGNoYW5nZWQsIDE2NCBpbnNlcnRpb25zKCspLCA5MSBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwppbmRleCA0M2Q0NGZlNDNiZC4uMDJkOWVm ZDBkNjQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1 LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwpAQCAtNTIs NiArNTIsNyBAQCBleHRlcm4gcGdfbG9jYWxlX3QgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lk IGNvbGxpZCwgTWVtb3J5Q29udGV4dCBjb250ZXh0KTsKICNpZmRlZiBVU0VfSUNVCiAKIGV4 dGVybiBVQ29sbGF0b3IgKnBnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsKK3N0 YXRpYyBVQ2FzZU1hcCAqcGdfdWNhc2VtYXBfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsK IAogc3RhdGljIHNpemVfdCBzdHJsb3dlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3Rz aXplLCBjb25zdCBjaGFyICpzcmMsCiAJCQkJCQkgICBzc2l6ZV90IHNyY2xlbiwgcGdfbG9j YWxlX3QgbG9jYWxlKTsKQEAgLTExMSw5ICsxMTIsMTIgQEAgc3RhdGljIHNpemVfdCBpY3Vf ZnJvbV91Y2hhcihjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsCiAJCQkJCQkJIGNvbnN0 IFVDaGFyICpidWZmX3VjaGFyLCBpbnQzMl90IGxlbl91Y2hhcik7CiBzdGF0aWMgdm9pZCBp Y3Vfc2V0X2NvbGxhdGlvbl9hdHRyaWJ1dGVzKFVDb2xsYXRvciAqY29sbGF0b3IsIGNvbnN0 IGNoYXIgKmxvYywKIAkJCQkJCQkJCQkgVUVycm9yQ29kZSAqc3RhdHVzKTsKLXN0YXRpYyBp bnQzMl90IGljdV9jb252ZXJ0X2Nhc2UoSUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBwZ19sb2Nh bGVfdCBteWxvY2FsZSwKLQkJCQkJCQkJVUNoYXIgKipidWZmX2Rlc3QsIFVDaGFyICpidWZm X3NvdXJjZSwKLQkJCQkJCQkJaW50MzJfdCBsZW5fc291cmNlKTsKK3N0YXRpYyBpbnQzMl90 IGljdV9jb252ZXJ0X2Nhc2Vfbm9fdXRmOChJQ1VfQ29udmVydF9GdW5jIGZ1bmMsIGNoYXIg KmRlc3QsCisJCQkJCQkJCQkJc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCisJ CQkJCQkJCQkJc3NpemVfdCBzcmNsZW4sIHBnX2xvY2FsZV90IGxvY2FsZSk7CitzdGF0aWMg aW50MzJfdCBpY3VfY29udmVydF9jYXNlX3VjaGFyKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywg cGdfbG9jYWxlX3QgbXlsb2NhbGUsCisJCQkJCQkJCQkgIFVDaGFyICoqYnVmZl9kZXN0LCBV Q2hhciAqYnVmZl9zb3VyY2UsCisJCQkJCQkJCQkgIGludDMyX3QgbGVuX3NvdXJjZSk7CiBz dGF0aWMgaW50MzJfdCB1X3N0clRvVGl0bGVfZGVmYXVsdF9CSShVQ2hhciAqZGVzdCwgaW50 MzJfdCBkZXN0Q2FwYWNpdHksCiAJCQkJCQkJCQkgICBjb25zdCBVQ2hhciAqc3JjLCBpbnQz Ml90IHNyY0xlbmd0aCwKIAkJCQkJCQkJCSAgIGNvbnN0IGNoYXIgKmxvY2FsZSwKQEAgLTE0 MCw2ICsxNDQsOCBAQCB0b2xvd2VyX2ljdShwZ193Y2hhciB3YywgcGdfbG9jYWxlX3QgbG9j YWxlKQogCXJldHVybiB1X3RvbG93ZXIod2MpOwogfQogCitzdGF0aWMgaW50MzJfdCBpY3Vf Zm9sZGNhc2Vfb3B0aW9ucyhjb25zdCBjaGFyICpsb2NhbGUpOworCiBzdGF0aWMgY29uc3Qg c3RydWN0IGNvbGxhdGVfbWV0aG9kcyBjb2xsYXRlX21ldGhvZHNfaWN1ID0gewogCS5zdHJu Y29sbCA9IHN0cm5jb2xsX2ljdSwKIAkuc3Rybnhmcm0gPSBzdHJueGZybV9pY3UsCkBAIC0y NzgsNiArMjg0LDcgQEAgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lkIGNvbGxpZCwgTWVtb3J5 Q29udGV4dCBjb250ZXh0KQogCWNvbnN0IGNoYXIgKmljdXJ1bGVzID0gTlVMTDsKIAlVQ29s bGF0b3IgICpjb2xsYXRvcjsKIAlsb2NhbGVfdAlsb2MgPSAobG9jYWxlX3QpIDA7CisJVUNh c2VNYXAgICAqY2FzZW1hcCA9IE5VTEw7CiAJcGdfbG9jYWxlX3QgcmVzdWx0OwogCiAJaWYg KGNvbGxpZCA9PSBERUZBVUxUX0NPTExBVElPTl9PSUQpCkBAIC0zMzksMTAgKzM0NiwxNCBA QCBjcmVhdGVfcGdfbG9jYWxlX2ljdShPaWQgY29sbGlkLCBNZW1vcnlDb250ZXh0IGNvbnRl eHQpCiAKIAljb2xsYXRvciA9IG1ha2VfaWN1X2NvbGxhdG9yKGljdWxvY3N0ciwgaWN1cnVs ZXMpOwogCisJaWYgKEdldERhdGFiYXNlRW5jb2RpbmcoKSA9PSBQR19VVEY4KQorCQljYXNl bWFwID0gcGdfdWNhc2VtYXBfb3BlbihpY3Vsb2NzdHIpOworCiAJcmVzdWx0ID0gTWVtb3J5 Q29udGV4dEFsbG9jWmVybyhjb250ZXh0LCBzaXplb2Yoc3RydWN0IHBnX2xvY2FsZV9zdHJ1 Y3QpKTsKIAlyZXN1bHQtPmljdS5sb2NhbGUgPSBNZW1vcnlDb250ZXh0U3RyZHVwKGNvbnRl eHQsIGljdWxvY3N0cik7CiAJcmVzdWx0LT5pY3UudWNvbCA9IGNvbGxhdG9yOwogCXJlc3Vs dC0+aWN1Lmx0ID0gbG9jOworCXJlc3VsdC0+aWN1LnVjYXNlbWFwID0gY2FzZW1hcDsKIAly ZXN1bHQtPmRldGVybWluaXN0aWMgPSBkZXRlcm1pbmlzdGljOwogCXJlc3VsdC0+Y29sbGF0 ZV9pc19jID0gZmFsc2U7CiAJcmVzdWx0LT5jdHlwZV9pc19jID0gZmFsc2U7CkBAIC0zNjYs NDEgKzM3NywxOCBAQCBjcmVhdGVfcGdfbG9jYWxlX2ljdShPaWQgY29sbGlkLCBNZW1vcnlD b250ZXh0IGNvbnRleHQpCiAjaWZkZWYgVVNFX0lDVQogCiAvKgotICogV3JhcHBlciBhcm91 bmQgdWNvbF9vcGVuKCkgdG8gaGFuZGxlIEFQSSBkaWZmZXJlbmNlcyBmb3Igb2xkZXIgSUNV Ci0gKiB2ZXJzaW9ucy4KLSAqCi0gKiBFbnN1cmUgdGhhdCBubyBwYXRoIGxlYWtzIGEgVUNv bGxhdG9yLgorICogSW4gSUNVIHZlcnNpb25zIDU0IGFuZCBlYXJsaWVyLCAidW5kIiBpcyBu b3QgYSByZWNvZ25pemVkIHNwZWxsaW5nIG9mIHRoZQorICogcm9vdCBsb2NhbGUuIElmIHRo ZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIGxvY2FsZSBpcyAidW5kIiwgcmVwbGFjZSB3aXRo CisgKiAicm9vdCIgYmVmb3JlIG9wZW5pbmcuCiAgKi8KLVVDb2xsYXRvciAqCi1wZ191Y29s X29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKK3N0YXRpYyBjaGFyICoKK2ZpeF9pY3VfbG9j YWxlX3N0cihjb25zdCBjaGFyICpsb2Nfc3RyKQogewotCVVDb2xsYXRvciAgKmNvbGxhdG9y OwotCVVFcnJvckNvZGUJc3RhdHVzOwotCWNvbnN0IGNoYXIgKm9yaWdfc3RyID0gbG9jX3N0 cjsKLQljaGFyCSAgICpmaXhlZF9zdHIgPSBOVUxMOwotCi0JLyoKLQkgKiBNdXN0IG5ldmVy IG9wZW4gZGVmYXVsdCBjb2xsYXRvciwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIHRoZSBlbnZp cm9ubWVudAotCSAqIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLiBTaG91bGQgbm90IGhh cHBlbiwgYnV0IGNoZWNrIGhlcmUgdG8gY2F0Y2gKLQkgKiBidWdzIHRoYXQgbWlnaHQgYmUg aGFyZCB0byBjYXRjaCBvdGhlcndpc2UuCi0JICoKLQkgKiBOQjogdGhlIGRlZmF1bHQgY29s bGF0b3IgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjb2xsYXRvciBmb3IgdGhlIHJvb3QKLQkg KiBsb2NhbGUuIFRoZSByb290IGxvY2FsZSBtYXkgYmUgc3BlY2lmaWVkIGFzIHRoZSBlbXB0 eSBzdHJpbmcsICJ1bmQiLCBvcgotCSAqICJyb290Ii4gVGhlIGRlZmF1bHQgY29sbGF0b3Ig aXMgb3BlbmVkIGJ5IHBhc3NpbmcgTlVMTCB0byB1Y29sX29wZW4oKS4KLQkgKi8KLQlpZiAo bG9jX3N0ciA9PSBOVUxMKQotCQllbG9nKEVSUk9SLCAib3BlbmluZyBkZWZhdWx0IGNvbGxh dG9yIGlzIG5vdCBzdXBwb3J0ZWQiKTsKLQotCS8qCi0JICogSW4gSUNVIHZlcnNpb25zIDU0 IGFuZCBlYXJsaWVyLCAidW5kIiBpcyBub3QgYSByZWNvZ25pemVkIHNwZWxsaW5nIG9mCi0J ICogdGhlIHJvb3QgbG9jYWxlLiBJZiB0aGUgZmlyc3QgY29tcG9uZW50IG9mIHRoZSBsb2Nh bGUgaXMgInVuZCIsIHJlcGxhY2UKLQkgKiB3aXRoICJyb290IiBiZWZvcmUgb3BlbmluZy4K LQkgKi8KIAlpZiAoVV9JQ1VfVkVSU0lPTl9NQUpPUl9OVU0gPCA1NSkKIAl7CiAJCWNoYXIJ CWxhbmdbVUxPQ19MQU5HX0NBUEFDSVRZXTsKKwkJVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pF Uk9fRVJST1I7CiAKLQkJc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogCQl1bG9jX2dldExhbmd1 YWdlKGxvY19zdHIsIGxhbmcsIFVMT0NfTEFOR19DQVBBQ0lUWSwgJnN0YXR1cyk7CiAJCWlm IChVX0ZBSUxVUkUoc3RhdHVzKSB8fCBzdGF0dXMgPT0gVV9TVFJJTkdfTk9UX1RFUk1JTkFU RURfV0FSTklORykKIAkJewpAQCAtNDEzLDE1ICs0MDEsNDkgQEAgcGdfdWNvbF9vcGVuKGNv bnN0IGNoYXIgKmxvY19zdHIpCiAJCWlmIChzdHJjbXAobGFuZywgInVuZCIpID09IDApCiAJ CXsKIAkJCWNvbnN0IGNoYXIgKnJlbWFpbmRlciA9IGxvY19zdHIgKyBzdHJsZW4oInVuZCIp OworCQkJY2hhcgkgICAqZml4ZWRfc3RyOwogCiAJCQlmaXhlZF9zdHIgPSBwYWxsb2Moc3Ry bGVuKCJyb290IikgKyBzdHJsZW4ocmVtYWluZGVyKSArIDEpOwogCQkJc3RyY3B5KGZpeGVk X3N0ciwgInJvb3QiKTsKIAkJCXN0cmNhdChmaXhlZF9zdHIsIHJlbWFpbmRlcik7CiAKLQkJ CWxvY19zdHIgPSBmaXhlZF9zdHI7CisJCQlyZXR1cm4gZml4ZWRfc3RyOwogCQl9CiAJfQog CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBXcmFwcGVyIGFyb3VuZCB1Y29sX29wZW4o KSB0byBoYW5kbGUgQVBJIGRpZmZlcmVuY2VzIGZvciBvbGRlciBJQ1UKKyAqIHZlcnNpb25z LgorICoKKyAqIEVuc3VyZSB0aGF0IG5vIHBhdGggbGVha3MgYSBVQ29sbGF0b3IuCisgKi8K K1VDb2xsYXRvciAqCitwZ191Y29sX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKK3sKKwlV Q29sbGF0b3IgICpjb2xsYXRvcjsKKwlVRXJyb3JDb2RlCXN0YXR1czsKKwljb25zdCBjaGFy ICpvcmlnX3N0ciA9IGxvY19zdHI7CisJY2hhcgkgICAqZml4ZWRfc3RyOworCisJLyoKKwkg KiBNdXN0IG5ldmVyIG9wZW4gZGVmYXVsdCBjb2xsYXRvciwgYmVjYXVzZSBpdCBkZXBlbmRz IG9uIHRoZSBlbnZpcm9ubWVudAorCSAqIGFuZCBtYXkgY2hhbmdlIGF0IGFueSB0aW1lLiBT aG91bGQgbm90IGhhcHBlbiwgYnV0IGNoZWNrIGhlcmUgdG8gY2F0Y2gKKwkgKiBidWdzIHRo YXQgbWlnaHQgYmUgaGFyZCB0byBjYXRjaCBvdGhlcndpc2UuCisJICoKKwkgKiBOQjogdGhl IGRlZmF1bHQgY29sbGF0b3IgaXMgbm90IHRoZSBzYW1lIGFzIHRoZSBjb2xsYXRvciBmb3Ig dGhlIHJvb3QKKwkgKiBsb2NhbGUuIFRoZSByb290IGxvY2FsZSBtYXkgYmUgc3BlY2lmaWVk IGFzIHRoZSBlbXB0eSBzdHJpbmcsICJ1bmQiLCBvcgorCSAqICJyb290Ii4gVGhlIGRlZmF1 bHQgY29sbGF0b3IgaXMgb3BlbmVkIGJ5IHBhc3NpbmcgTlVMTCB0byB1Y29sX29wZW4oKS4K KwkgKi8KKwlpZiAobG9jX3N0ciA9PSBOVUxMKQorCQllbG9nKEVSUk9SLCAib3BlbmluZyBk ZWZhdWx0IGNvbGxhdG9yIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKworCWZpeGVkX3N0ciA9IGZp eF9pY3VfbG9jYWxlX3N0cihsb2Nfc3RyKTsKKwlpZiAoZml4ZWRfc3RyKQorCQlsb2Nfc3Ry ID0gZml4ZWRfc3RyOworCiAJc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogCWNvbGxhdG9yID0g dWNvbF9vcGVuKGxvY19zdHIsICZzdGF0dXMpOwogCWlmIChVX0ZBSUxVUkUoc3RhdHVzKSkK QEAgLTQ1Niw2ICs0NzgsMzQgQEAgcGdfdWNvbF9vcGVuKGNvbnN0IGNoYXIgKmxvY19zdHIp CiAJcmV0dXJuIGNvbGxhdG9yOwogfQogCisvKgorICogV3JhcHBlciBhcm91bmQgdWNhc2Vt YXBfb3BlbigpIHRvIGhhbmRsZSBBUEkgZGlmZmVyZW5jZXMgZm9yIG9sZGVyIElDVQorICog dmVyc2lvbnMuCisgKgorICogQWRkaXRpb25hbCBtYWtlcyBzdXJlIHdlIGdldCB0aGUgcmln aHQgb3B0aW9ucyBmb3IgY2FzZSBmb2xkaW5nLgorICovCitzdGF0aWMgVUNhc2VNYXAgKgor cGdfdWNhc2VtYXBfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKQoreworCVVFcnJvckNvZGUJ c3RhdHVzID0gVV9aRVJPX0VSUk9SOworCVVDYXNlTWFwICAgKmNhc2VtYXA7CisJY2hhcgkg ICAqZml4ZWRfc3RyOworCisJZml4ZWRfc3RyID0gZml4X2ljdV9sb2NhbGVfc3RyKGxvY19z dHIpOworCWlmIChmaXhlZF9zdHIpCisJCWxvY19zdHIgPSBmaXhlZF9zdHI7CisKKwljYXNl bWFwID0gdWNhc2VtYXBfb3Blbihsb2Nfc3RyLCBpY3VfZm9sZGNhc2Vfb3B0aW9ucyhsb2Nf c3RyKSwgJnN0YXR1cyk7CisJaWYgKFVfRkFJTFVSRShzdGF0dXMpKQorCQllcmVwb3J0KEVS Uk9SLAorCQkJCShlcnJtc2coImNhc2VtYXAgbG9va3VwIGZhaWxlZDogJXMiLCB1X2Vycm9y TmFtZShzdGF0dXMpKSkpOworCisJaWYgKGZpeGVkX3N0ciAhPSBOVUxMKQorCQlwZnJlZShm aXhlZF9zdHIpOworCisJcmV0dXJuIGNhc2VtYXA7Cit9CisKIC8qCiAgKiBDcmVhdGUgYSBV Q29sbGF0b3Igd2l0aCB0aGUgZ2l2ZW4gbG9jYWxlIHN0cmluZyBhbmQgcnVsZXMuCiAgKgpA QCAtNTI4LDgwICs1NzgsNzYgQEAgc3RhdGljIHNpemVfdAogc3RybG93ZXJfaWN1KGNoYXIg KmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xl biwKIAkJCSBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7Ci0JaW50MzJfdAkJbGVuX3VjaGFyOwot CWludDMyX3QJCWxlbl9jb252OwotCVVDaGFyCSAgICpidWZmX3VjaGFyOwotCVVDaGFyCSAg ICpidWZmX2NvbnY7Ci0Jc2l6ZV90CQlyZXN1bHRfbGVuOwotCi0JbGVuX3VjaGFyID0gaWN1 X3RvX3VjaGFyKCZidWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7Ci0JbGVuX2NvbnYgPSBpY3Vf Y29udmVydF9jYXNlKHVfc3RyVG9Mb3dlciwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252 LCBidWZmX3VjaGFyLCBsZW5fdWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hh cihkZXN0LCBkZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91 Y2hhcik7Ci0JcGZyZWUoYnVmZl9jb252KTsKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygp ID09IFBHX1VURjgpCisJeworCQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsK KwkJaW50MzJfdAkJbmVlZGVkOwogCi0JcmV0dXJuIHJlc3VsdF9sZW47CisJCW5lZWRlZCA9 IHVjYXNlbWFwX3V0ZjhUb0xvd2VyKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0LCBkZXN0 c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IFVfQlVGRkVS X09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJP UiwKKwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9y TmFtZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNlCisJCXJldHVy biBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJUb0xvd2VyLCBkZXN0LCBkZXN0c2l6 ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBzaXplX3QKIHN0cnRpdGxl X2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3Np emVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCWludDMyX3QJCWxl bl91Y2hhcjsKLQlpbnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsK LQlVQ2hhcgkgICAqYnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0X2xlbjsKLQotCWxlbl91 Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNsZW4pOwotCWxlbl9j b252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRvVGl0bGVfZGVmYXVsdF9CSSwgbG9jYWxl LAotCQkJCQkJCQkmYnVmZl9jb252LCBidWZmX3VjaGFyLCBsZW5fdWNoYXIpOwotCXJlc3Vs dF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwgYnVmZl9jb252LCBsZW5f Y29udik7Ci0JcGZyZWUoYnVmZl91Y2hhcik7Ci0JcGZyZWUoYnVmZl9jb252KTsKKwlpZiAo R2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgpCisJeworCQlVRXJyb3JDb2RlCXN0 YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJaW50MzJfdAkJbmVlZGVkOwogCi0JcmV0dXJuIHJl c3VsdF9sZW47CisJCW5lZWRlZCA9IHVjYXNlbWFwX3V0ZjhUb1RpdGxlKGxvY2FsZS0+aWN1 LnVjYXNlbWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlp ZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0 dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9u IGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVk OworCX0KKwllbHNlCisJCXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJU b1RpdGxlX2RlZmF1bHRfQkksIGRlc3QsIGRlc3RzaXplLCBzcmMsIHNyY2xlbiwgbG9jYWxl KTsKIH0KIAogc3RhdGljIHNpemVfdAogc3RydXBwZXJfaWN1KGNoYXIgKmRlc3QsIHNpemVf dCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKIAkJCSBwZ19s b2NhbGVfdCBsb2NhbGUpCiB7Ci0JaW50MzJfdAkJbGVuX3VjaGFyOwotCWludDMyX3QJCWxl bl9jb252OwotCVVDaGFyCSAgICpidWZmX3VjaGFyOwotCVVDaGFyCSAgICpidWZmX2NvbnY7 Ci0Jc2l6ZV90CQlyZXN1bHRfbGVuOwotCi0JbGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZi dWZmX3VjaGFyLCBzcmMsIHNyY2xlbik7Ci0JbGVuX2NvbnYgPSBpY3VfY29udmVydF9jYXNl KHVfc3RyVG9VcHBlciwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252LCBidWZmX3VjaGFy LCBsZW5fdWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0 c2l6ZSwgYnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91Y2hhcik7Ci0JcGZy ZWUoYnVmZl9jb252KTsKKwlpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgp CisJeworCQlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwkJaW50MzJfdAkJ bmVlZGVkOwogCi0JcmV0dXJuIHJlc3VsdF9sZW47CisJCW5lZWRlZCA9IHVjYXNlbWFwX3V0 ZjhUb1VwcGVyKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBz cmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VS Uk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVy cm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMp KSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNlCisJCXJldHVybiBpY3VfY29udmVy dF9jYXNlX25vX3V0ZjgodV9zdHJUb1VwcGVyLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNs ZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBzaXplX3QKIHN0cmZvbGRfaWN1KGNoYXIgKmRl c3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwK IAkJCXBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQlpbnQzMl90CQlsZW5fdWNoYXI7Ci0JaW50 MzJfdAkJbGVuX2NvbnY7Ci0JVUNoYXIJICAgKmJ1ZmZfdWNoYXI7Ci0JVUNoYXIJICAgKmJ1 ZmZfY29udjsKLQlzaXplX3QJCXJlc3VsdF9sZW47Ci0KLQlsZW5fdWNoYXIgPSBpY3VfdG9f dWNoYXIoJmJ1ZmZfdWNoYXIsIHNyYywgc3JjbGVuKTsKLQlsZW5fY29udiA9IGljdV9jb252 ZXJ0X2Nhc2UodV9zdHJGb2xkQ2FzZV9kZWZhdWx0LCBsb2NhbGUsCi0JCQkJCQkJCSZidWZm X2NvbnYsIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7Ci0JcmVzdWx0X2xlbiA9IGljdV9mcm9t X3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsKLQlwZnJlZShi dWZmX3VjaGFyKTsKLQlwZnJlZShidWZmX2NvbnYpOworCWlmIChHZXREYXRhYmFzZUVuY29k aW5nKCkgPT0gUEdfVVRGOCkKKwl7CisJCVVFcnJvckNvZGUJc3RhdHVzID0gVV9aRVJPX0VS Uk9SOworCQlpbnQzMl90CQluZWVkZWQ7CiAKLQlyZXR1cm4gcmVzdWx0X2xlbjsKKwkJbmVl ZGVkID0gdWNhc2VtYXBfdXRmOEZvbGRDYXNlKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0 LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZzdGF0dXMpOworCQlpZiAoc3RhdHVzICE9IFVf QlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQkJZXJlcG9y dChFUlJPUiwKKwkJCQkJKGVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1 X2Vycm9yTmFtZShzdGF0dXMpKSkpOworCQlyZXR1cm4gbmVlZGVkOworCX0KKwllbHNlCisJ CXJldHVybiBpY3VfY29udmVydF9jYXNlX25vX3V0ZjgodV9zdHJGb2xkQ2FzZV9kZWZhdWx0 LCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIC8qCkBAIC04 MjksOCArODc1LDI4IEBAIGljdV9mcm9tX3VjaGFyKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0 c2l6ZSwgY29uc3QgVUNoYXIgKmJ1ZmZfdWNoYXIsIGludDMyX3QgbGVuCiB9CiAKIHN0YXRp YyBpbnQzMl90Ci1pY3VfY29udmVydF9jYXNlKElDVV9Db252ZXJ0X0Z1bmMgZnVuYywgcGdf bG9jYWxlX3QgbXlsb2NhbGUsCi0JCQkJIFVDaGFyICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVm Zl9zb3VyY2UsIGludDMyX3QgbGVuX3NvdXJjZSkKK2ljdV9jb252ZXJ0X2Nhc2Vfbm9fdXRm OChJQ1VfQ29udmVydF9GdW5jIGZ1bmMsIGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwK KwkJCQkJCSBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLCBwZ19sb2NhbGVfdCBs b2NhbGUpCit7CisJaW50MzJfdAkJbGVuX3VjaGFyOworCWludDMyX3QJCWxlbl9jb252Owor CVVDaGFyCSAgICpidWZmX3VjaGFyOworCVVDaGFyCSAgICpidWZmX2NvbnY7CisJc2l6ZV90 CQlyZXN1bHRfbGVuOworCisJbGVuX3VjaGFyID0gaWN1X3RvX3VjaGFyKCZidWZmX3VjaGFy LCBzcmMsIHNyY2xlbik7CisJbGVuX2NvbnYgPSBpY3VfY29udmVydF9jYXNlX3VjaGFyKGZ1 bmMsIGxvY2FsZSwgJmJ1ZmZfY29udiwKKwkJCQkJCQkJCSAgYnVmZl91Y2hhciwgbGVuX3Vj aGFyKTsKKwlyZXN1bHRfbGVuID0gaWN1X2Zyb21fdWNoYXIoZGVzdCwgZGVzdHNpemUsIGJ1 ZmZfY29udiwgbGVuX2NvbnYpOworCXBmcmVlKGJ1ZmZfdWNoYXIpOworCXBmcmVlKGJ1ZmZf Y29udik7CisKKwlyZXR1cm4gcmVzdWx0X2xlbjsKK30KKworc3RhdGljIGludDMyX3QKK2lj dV9jb252ZXJ0X2Nhc2VfdWNoYXIoSUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBwZ19sb2NhbGVf dCBteWxvY2FsZSwKKwkJCQkJICAgVUNoYXIgKipidWZmX2Rlc3QsIFVDaGFyICpidWZmX3Nv dXJjZSwgaW50MzJfdCBsZW5fc291cmNlKQogewogCVVFcnJvckNvZGUJc3RhdHVzOwogCWlu dDMyX3QJCWxlbl9kZXN0OwpAQCAtODcwLDEwICs5MzYsMTcgQEAgdV9zdHJGb2xkQ2FzZV9k ZWZhdWx0KFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkJCQkJICBjb25z dCBVQ2hhciAqc3JjLCBpbnQzMl90IHNyY0xlbmd0aCwKIAkJCQkJICBjb25zdCBjaGFyICps b2NhbGUsCiAJCQkJCSAgVUVycm9yQ29kZSAqcEVycm9yQ29kZSkKK3sKKwlyZXR1cm4gdV9z dHJGb2xkQ2FzZShkZXN0LCBkZXN0Q2FwYWNpdHksIHNyYywgc3JjTGVuZ3RoLAorCQkJCQkJ IGljdV9mb2xkY2FzZV9vcHRpb25zKGxvY2FsZSksIHBFcnJvckNvZGUpOworfQorCitzdGF0 aWMgaW50MzJfdAoraWN1X2ZvbGRjYXNlX29wdGlvbnMoY29uc3QgY2hhciAqbG9jYWxlKQog ewogCXVpbnQzMgkJb3B0aW9ucyA9IFVfRk9MRF9DQVNFX0RFRkFVTFQ7CiAJY2hhcgkJbGFu Z1szXTsKLQlVRXJyb3JDb2RlCXN0YXR1czsKKwlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVS T19FUlJPUjsKIAogCS8qCiAJICogVW5saWtlIHRoZSBJQ1UgQVBJcyBmb3IgbG93ZXJjYXNp bmcsIHRpdGxlY2FzaW5nLCBhbmQgdXBwZXJjYXNpbmcsIGNhc2UKQEAgLTg4MSw3ICs5NTQs NiBAQCB1X3N0ckZvbGRDYXNlX2RlZmF1bHQoVUNoYXIgKmRlc3QsIGludDMyX3QgZGVzdENh cGFjaXR5LAogCSAqIG9wdGlvbiByZWxldmFudCB0byBUdXJraWMgbGFuZ3VhZ2VzICdheicg YW5kICd0cic7IGNoZWNrIGZvciB0aG9zZQogCSAqIGxhbmd1YWdlcyB0byBlbmFibGUgdGhl IG9wdGlvbi4KIAkgKi8KLQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAJdWxvY19nZXRMYW5n dWFnZShsb2NhbGUsIGxhbmcsIDMsICZzdGF0dXMpOwogCWlmIChVX1NVQ0NFU1Moc3RhdHVz KSkKIAl7CkBAIC04OTMsOCArOTY1LDcgQEAgdV9zdHJGb2xkQ2FzZV9kZWZhdWx0KFVDaGFy ICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkJCW9wdGlvbnMgPSBVX0ZPTERfQ0FT RV9FWENMVURFX1NQRUNJQUxfSTsKIAl9CiAKLQlyZXR1cm4gdV9zdHJGb2xkQ2FzZShkZXN0 LCBkZXN0Q2FwYWNpdHksIHNyYywgc3JjTGVuZ3RoLAotCQkJCQkJIG9wdGlvbnMsIHBFcnJv ckNvZGUpOworCXJldHVybiBvcHRpb25zOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2lu Y2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggYi9zcmMvaW5jbHVkZS91dGlscy9wZ19sb2NhbGUu aAppbmRleCA4NjAxNmI5MzQ0ZS4uYTQ5OTVlMDQ2YWEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL3V0aWxzL3BnX2xvY2FsZS5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2Fs ZS5oCkBAIC0yMSw2ICsyMSw3IEBACiAjdW5kZWYgVV9TSE9XX0NQTFVTUExVU19IRUFERVJf QVBJCiAjZGVmaW5lIFVfU0hPV19DUExVU1BMVVNfSEVBREVSX0FQSSAwCiAjaW5jbHVkZSA8 dW5pY29kZS91Y29sLmg+CisjaW5jbHVkZSA8dW5pY29kZS91Y2FzZW1hcC5oPgogI2VuZGlm CiAKIC8qIHVzZSBmb3IgbGliYyBsb2NhbGUgbmFtZXMgKi8KQEAgLTE2OCw2ICsxNjksNyBA QCBzdHJ1Y3QgcGdfbG9jYWxlX3N0cnVjdAogCQkJY29uc3QgY2hhciAqbG9jYWxlOwogCQkJ VUNvbGxhdG9yICAqdWNvbDsKIAkJCWxvY2FsZV90CWx0OworCQkJVUNhc2VNYXAgICAqdWNh c2VtYXA7CiAJCX0JCQlpY3U7CiAjZW5kaWYKIAl9OwotLSAKMi40Ny4zCgo= --------------sZMAg0tE1W6VCKOt5kHRGVLD--