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 1vbphI-00ECxC-2H for pgsql-hackers@arkaria.postgresql.org; Sat, 03 Jan 2026 00:40:50 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vbphH-00Bg4R-29 for pgsql-hackers@arkaria.postgresql.org; Sat, 03 Jan 2026 00:40:48 +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 1vbphH-00Bg4I-01 for pgsql-hackers@lists.postgresql.org; Sat, 03 Jan 2026 00:40:48 +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 1vbphE-003tV6-1h for pgsql-hackers@postgresql.org; Sat, 03 Jan 2026 00:40:46 +0000 Received: from s807.loopia.se (localhost [127.0.0.1]) by s807.loopia.se (Postfix) with ESMTP id C162450B5AA for ; Sat, 03 Jan 2026 01:40:40 +0100 (CET) Received: from s981.loopia.se (unknown [172.22.191.6]) by s807.loopia.se (Postfix) with ESMTP id AB68550A029; Sat, 03 Jan 2026 01:40:40 +0100 (CET) Received: from s474.loopia.se (unknown [172.22.191.5]) by s981.loopia.se (Postfix) with ESMTP id A9C9B22B16C1; Sat, 03 Jan 2026 01:40:40 +0100 (CET) X-Virus-Scanned: amavisd-new 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: s474.loopia.se (amavisd-new); dkim=pass (2048-bit key) header.d=proxel.se Received: from s980.loopia.se ([172.22.191.5]) by s474.loopia.se (s474.loopia.se [172.22.190.14]) (amavisd-new, port 10024) with LMTP id aYvtNjofu2or; Sat, 3 Jan 2026 01:40:40 +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 s980.loopia.se (Postfix) with ESMTPSA id 3AD6E22015CB; Sat, 03 Jan 2026 01:40:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=proxel.se; s=loopiadkim1707418970; t=1767400839; bh=gy/x98uVfT7b/NH2ukct+EnjMnz0Uk1/hnNN6JdVgzE=; h=Date:Subject:From:To:References:In-Reply-To; b=f8sQUtdfH/4U2z+Fodsxq0wUGqRkoaVMQWJ1qclAv/ncN0ursGgStgOjeJQGP8wSk PT96K7VhHhzTXMy7mPkndoRJwRbza6muT4juK92Dt/r4RUM4xodItMlBCXUXV1rj3y Mz8NlI+YRvqB9Xe8pCuPs1HzL050G18bGjPW3f8DyULg8ZYe4joJG1bQpN946gF42l 6Fe5JEjSmrjmeDYbTvK1zU2p72wO5xyjwvwcC1JiWXweJj5lzxZi0kD7pMcwWOLIth dYotQ1H7OtSgLjaKcuLDGIHnnqpChrvfYE/6+s8IC8xUyXtsqei96N5P3hYzuL9LvF 9e2cxhHEK3sJA== Content-Type: multipart/mixed; boundary="------------GR8OY1aikm1zCaqeEo0S7p6M" Message-ID: <744b9998-4463-4be5-b60e-a960eeb43202@proxel.se> Date: Sat, 3 Jan 2026 01:40:36 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Speed up ICU case conversion by using ucasemap_utf8To*() From: Andreas Karlsson To: zengman , Jeff Davis , pgsql-hackers References: <167986ff-afcf-4542-94c6-61ee8474e138@proxel.se> <72c7c2b5848da44caddfe0f20f6c7ebc7c0c6e60.camel@j-davis.com> <4cfde442-25dd-495f-8d76-a23502ce17b8@proxel.se> Content-Language: en-US In-Reply-To: <4cfde442-25dd-495f-8d76-a23502ce17b8@proxel.se> 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. --------------GR8OY1aikm1zCaqeEo0S7p6M Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Here is a version 4 of the patch which uses the fact that we have method tables to remove one level of indirection. I am not sure the extra lines of codes are worth it but on the other hand despite 40 more lines the code became easier to read to me. What do you think? Andreas --------------GR8OY1aikm1zCaqeEo0S7p6M Content-Type: text/x-patch; charset=UTF-8; name="v4-0001-Use-optimized-versions-of-ICU-case-conversion-for.patch" Content-Disposition: attachment; filename*0="v4-0001-Use-optimized-versions-of-ICU-case-conversion-for.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3MTkwOWJmMzFmNWNlODAzNTA3YmNiZjgzNDg4NTY0OGE4ZDZkMTc0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZWFzIEthcmxzc29uIDxhbmRyZWFzQHByb3hl bC5zZT4KRGF0ZTogVHVlLCAxNyBEZWMgMjAyNCAyMjo0NzowMCArMDEwMApTdWJqZWN0OiBb UEFUQ0ggdjRdIFVzZSBvcHRpbWl6ZWQgdmVyc2lvbnMgb2YgSUNVIGNhc2UgY29udmVyc2lv biBmb3IgVVRGLTgKCkluc3RlYWQgb2YgY29udmVydGluZyB0byBhbmQgZnJvbSBVQ2hhciB3 aGVuIGRvaW5nIGNhc2UgY29udmVyc2lvbnMgd2UKdXNlIHRoZSBVVEYtOCB2ZXJzaW9ucyBv ZiB0aGUgZnVuY3Rpb25zLiBUaGlzIGNhbiBnaXZlIGEgc2lnbmZpY2FudApzcGVlZHVwLCAz MC00MCUsIG9uIHNob3J0IHRvIG1lZGl1bSBsZW5ndGggc3RyaW5ncy4KClRoZSBvbmx5IGNv c3Qgd2UgaW5jdXIgaXMgdGhhdCB3ZSBoYXZlIHRvIGFsbG9jYXRlIGEgY2FzZW1hcCBvYmpl Y3Qgb24KbG9jYWxlIGluaXRpYWxpemF0aW9uIGZvciBVVEYtOCBkYXRhYmFzZXMgYnV0IHRo ZSBvYmplY3QgaXMgcmVhbHRpdmVseQpzbWFsbCBhbmQgdGhlIGFzc3VtcHRpb24gaXMgdGhh dCBtb3N0IHVzZXJzIHdpbGwgYXQgc29tZSBwb2ludCB3YW50IHRvCnJ1biBjYXNlIGNvbnZl cnNpb24gZnVuY3Rpb25zLgoKV2hpbGUgYXQgaXQgd2UgYWxzbyByZW1vdmUgc29tZSBkdXBs aWNhdGlvbiBpbiB0aGUgbm9uLVVURi04IGNvZGUuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMv YWR0L3BnX2xvY2FsZV9pY3UuYyB8IDMwMCArKysrKysrKysrKysrKysrKystLS0tLS0tLQog c3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmggICAgICAgICB8ICAgMiArCiAyIGZpbGVz IGNoYW5nZWQsIDIwOCBpbnNlcnRpb25zKCspLCA5NCBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2ljdS5jIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwppbmRleCBkZTgwNjQyZjlkYy4uOWYyODNk NGEzMzQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfaWN1 LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9pY3UuYwpAQCAtNTIs NiArNTIsNyBAQCBleHRlcm4gcGdfbG9jYWxlX3QgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lk IGNvbGxpZCwgTWVtb3J5Q29udGV4dCBjb250ZXh0KTsKICNpZmRlZiBVU0VfSUNVCiAKIGV4 dGVybiBVQ29sbGF0b3IgKnBnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsKK3N0 YXRpYyBVQ2FzZU1hcCAqcGdfdWNhc2VtYXBfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKTsK IAogc3RhdGljIHNpemVfdCBzdHJsb3dlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3Rz aXplLCBjb25zdCBjaGFyICpzcmMsCiAJCQkJCQkgICBzc2l6ZV90IHNyY2xlbiwgcGdfbG9j YWxlX3QgbG9jYWxlKTsKQEAgLTYxLDYgKzYyLDE0IEBAIHN0YXRpYyBzaXplX3Qgc3RydXBw ZXJfaWN1KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLAog CQkJCQkJICAgc3NpemVfdCBzcmNsZW4sIHBnX2xvY2FsZV90IGxvY2FsZSk7CiBzdGF0aWMg c2l6ZV90IHN0cmZvbGRfaWN1KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3Qg Y2hhciAqc3JjLAogCQkJCQkJICBzc2l6ZV90IHNyY2xlbiwgcGdfbG9jYWxlX3QgbG9jYWxl KTsKK3N0YXRpYyBzaXplX3Qgc3RybG93ZXJfaWN1X3V0ZjgoY2hhciAqZGVzdCwgc2l6ZV90 IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCisJCQkJCQkJCXNzaXplX3Qgc3JjbGVuLCBw Z19sb2NhbGVfdCBsb2NhbGUpOworc3RhdGljIHNpemVfdCBzdHJ0aXRsZV9pY3VfdXRmOChj aGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKKwkJCQkJCQkJ c3NpemVfdCBzcmNsZW4sIHBnX2xvY2FsZV90IGxvY2FsZSk7CitzdGF0aWMgc2l6ZV90IHN0 cnVwcGVyX2ljdV91dGY4KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hh ciAqc3JjLAorCQkJCQkJCQlzc2l6ZV90IHNyY2xlbiwgcGdfbG9jYWxlX3QgbG9jYWxlKTsK K3N0YXRpYyBzaXplX3Qgc3RyZm9sZF9pY3VfdXRmOChjaGFyICpkZXN0LCBzaXplX3QgZGVz dHNpemUsIGNvbnN0IGNoYXIgKnNyYywKKwkJCQkJCQkgICBzc2l6ZV90IHNyY2xlbiwgcGdf bG9jYWxlX3QgbG9jYWxlKTsKIHN0YXRpYyBzaXplX3QgZG93bmNhc2VfaWRlbnRfaWN1KGNo YXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKIAkJCQkJCQkJIHNz aXplX3Qgc3JjbGVuLCBwZ19sb2NhbGVfdCBsb2NhbGUpOwogc3RhdGljIGludAlzdHJuY29s bF9pY3UoY29uc3QgY2hhciAqYXJnMSwgc3NpemVfdCBsZW4xLApAQCAtMTExLDkgKzEyMCwx MiBAQCBzdGF0aWMgc2l6ZV90IGljdV9mcm9tX3VjaGFyKGNoYXIgKmRlc3QsIHNpemVfdCBk ZXN0c2l6ZSwKIAkJCQkJCQkgY29uc3QgVUNoYXIgKmJ1ZmZfdWNoYXIsIGludDMyX3QgbGVu X3VjaGFyKTsKIHN0YXRpYyB2b2lkIGljdV9zZXRfY29sbGF0aW9uX2F0dHJpYnV0ZXMoVUNv bGxhdG9yICpjb2xsYXRvciwgY29uc3QgY2hhciAqbG9jLAogCQkJCQkJCQkJCSBVRXJyb3JD b2RlICpzdGF0dXMpOwotc3RhdGljIGludDMyX3QgaWN1X2NvbnZlcnRfY2FzZShJQ1VfQ29u dmVydF9GdW5jIGZ1bmMsIHBnX2xvY2FsZV90IG15bG9jYWxlLAotCQkJCQkJCQlVQ2hhciAq KmJ1ZmZfZGVzdCwgVUNoYXIgKmJ1ZmZfc291cmNlLAotCQkJCQkJCQlpbnQzMl90IGxlbl9z b3VyY2UpOworc3RhdGljIGludDMyX3QgaWN1X2NvbnZlcnRfY2FzZShJQ1VfQ29udmVydF9G dW5jIGZ1bmMsIGNoYXIgKmRlc3QsCisJCQkJCQkJCXNpemVfdCBkZXN0c2l6ZSwgY29uc3Qg Y2hhciAqc3JjLAorCQkJCQkJCQlzc2l6ZV90IHNyY2xlbiwgcGdfbG9jYWxlX3QgbG9jYWxl KTsKK3N0YXRpYyBpbnQzMl90IGljdV9jb252ZXJ0X2Nhc2VfdWNoYXIoSUNVX0NvbnZlcnRf RnVuYyBmdW5jLCBwZ19sb2NhbGVfdCBteWxvY2FsZSwKKwkJCQkJCQkJCSAgVUNoYXIgKipi dWZmX2Rlc3QsIFVDaGFyICpidWZmX3NvdXJjZSwKKwkJCQkJCQkJCSAgaW50MzJfdCBsZW5f c291cmNlKTsKIHN0YXRpYyBpbnQzMl90IHVfc3RyVG9UaXRsZV9kZWZhdWx0X0JJKFVDaGFy ICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkJCQkJCQkJCSAgIGNvbnN0IFVDaGFy ICpzcmMsIGludDMyX3Qgc3JjTGVuZ3RoLAogCQkJCQkJCQkJICAgY29uc3QgY2hhciAqbG9j YWxlLApAQCAtMTQwLDYgKzE1Miw4IEBAIHRvbG93ZXJfaWN1KHBnX3djaGFyIHdjLCBwZ19s b2NhbGVfdCBsb2NhbGUpCiAJcmV0dXJuIHVfdG9sb3dlcih3Yyk7CiB9CiAKK3N0YXRpYyBp bnQzMl90IGljdV9mb2xkY2FzZV9vcHRpb25zKGNvbnN0IGNoYXIgKmxvY2FsZSk7CisKIHN0 YXRpYyBjb25zdCBzdHJ1Y3QgY29sbGF0ZV9tZXRob2RzIGNvbGxhdGVfbWV0aG9kc19pY3Ug PSB7CiAJLnN0cm5jb2xsID0gc3RybmNvbGxfaWN1LAogCS5zdHJueGZybSA9IHN0cm54ZnJt X2ljdSwKQEAgLTI0NSw2ICsyNTksMjcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBjdHlwZV9t ZXRob2RzIGN0eXBlX21ldGhvZHNfaWN1ID0gewogCS53Y190b2xvd2VyID0gdG9sb3dlcl9p Y3UsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0eXBlX21ldGhvZHMgY3R5cGVfbWV0 aG9kc19pY3VfdXRmOCA9IHsKKwkuc3RybG93ZXIgPSBzdHJsb3dlcl9pY3VfdXRmOCwKKwku c3RydGl0bGUgPSBzdHJ0aXRsZV9pY3VfdXRmOCwKKwkuc3RydXBwZXIgPSBzdHJ1cHBlcl9p Y3VfdXRmOCwKKwkuc3RyZm9sZCA9IHN0cmZvbGRfaWN1X3V0ZjgsCisJLmRvd25jYXNlX2lk ZW50ID0gZG93bmNhc2VfaWRlbnRfaWN1LAorCS53Y19pc2RpZ2l0ID0gd2NfaXNkaWdpdF9p Y3UsCisJLndjX2lzYWxwaGEgPSB3Y19pc2FscGhhX2ljdSwKKwkud2NfaXNhbG51bSA9IHdj X2lzYWxudW1faWN1LAorCS53Y19pc3VwcGVyID0gd2NfaXN1cHBlcl9pY3UsCisJLndjX2lz bG93ZXIgPSB3Y19pc2xvd2VyX2ljdSwKKwkud2NfaXNncmFwaCA9IHdjX2lzZ3JhcGhfaWN1 LAorCS53Y19pc3ByaW50ID0gd2NfaXNwcmludF9pY3UsCisJLndjX2lzcHVuY3QgPSB3Y19p c3B1bmN0X2ljdSwKKwkud2NfaXNzcGFjZSA9IHdjX2lzc3BhY2VfaWN1LAorCS53Y19pc3hk aWdpdCA9IHdjX2lzeGRpZ2l0X2ljdSwKKwkud2NfaXNjYXNlZCA9IHdjX2lzY2FzZWRfaWN1 LAorCS53Y190b3VwcGVyID0gdG91cHBlcl9pY3UsCisJLndjX3RvbG93ZXIgPSB0b2xvd2Vy X2ljdSwKK307CisKIC8qCiAgKiBJQ1Ugc3RpbGwgZGVwZW5kcyBvbiBsaWJjIGZvciBjb21w YXRpYmlsaXR5IHdpdGggY2VydGFpbiBoaXN0b3JpY2FsCiAgKiBiZWhhdmlvciBmb3Igc2lu Z2xlLWJ5dGUgZW5jb2RpbmdzLiAgU2VlIGRvd25jYXNlX2lkZW50X2ljdSgpLgpAQCAtMzQ3 LDEwICszODIsMTYgQEAgY3JlYXRlX3BnX2xvY2FsZV9pY3UoT2lkIGNvbGxpZCwgTWVtb3J5 Q29udGV4dCBjb250ZXh0KQogCXJlc3VsdC0+Y29sbGF0ZV9pc19jID0gZmFsc2U7CiAJcmVz dWx0LT5jdHlwZV9pc19jID0gZmFsc2U7CiAJaWYgKEdldERhdGFiYXNlRW5jb2RpbmcoKSA9 PSBQR19VVEY4KQorCXsKKwkJcmVzdWx0LT5pY3UudWNhc2VtYXAgPSBwZ191Y2FzZW1hcF9v cGVuKGljdWxvY3N0cik7CiAJCXJlc3VsdC0+Y29sbGF0ZSA9ICZjb2xsYXRlX21ldGhvZHNf aWN1X3V0Zjg7CisJCXJlc3VsdC0+Y3R5cGUgPSAmY3R5cGVfbWV0aG9kc19pY3VfdXRmODsK Kwl9CiAJZWxzZQorCXsKIAkJcmVzdWx0LT5jb2xsYXRlID0gJmNvbGxhdGVfbWV0aG9kc19p Y3U7Ci0JcmVzdWx0LT5jdHlwZSA9ICZjdHlwZV9tZXRob2RzX2ljdTsKKwkJcmVzdWx0LT5j dHlwZSA9ICZjdHlwZV9tZXRob2RzX2ljdTsKKwl9CiAKIAlyZXR1cm4gcmVzdWx0OwogI2Vs c2UKQEAgLTM2Niw0MSArNDA3LDE4IEBAIGNyZWF0ZV9wZ19sb2NhbGVfaWN1KE9pZCBjb2xs aWQsIE1lbW9yeUNvbnRleHQgY29udGV4dCkKICNpZmRlZiBVU0VfSUNVCiAKIC8qCi0gKiBX cmFwcGVyIGFyb3VuZCB1Y29sX29wZW4oKSB0byBoYW5kbGUgQVBJIGRpZmZlcmVuY2VzIGZv ciBvbGRlciBJQ1UKLSAqIHZlcnNpb25zLgotICoKLSAqIEVuc3VyZSB0aGF0IG5vIHBhdGgg bGVha3MgYSBVQ29sbGF0b3IuCisgKiBJbiBJQ1UgdmVyc2lvbnMgNTQgYW5kIGVhcmxpZXIs ICJ1bmQiIGlzIG5vdCBhIHJlY29nbml6ZWQgc3BlbGxpbmcgb2YgdGhlCisgKiByb290IGxv Y2FsZS4gSWYgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgbG9jYWxlIGlzICJ1bmQiLCBy ZXBsYWNlIHdpdGgKKyAqICJyb290IiBiZWZvcmUgb3BlbmluZy4KICAqLwotVUNvbGxhdG9y ICoKLXBnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nfc3RyKQorc3RhdGljIGNoYXIgKgor Zml4X2ljdV9sb2NhbGVfc3RyKGNvbnN0IGNoYXIgKmxvY19zdHIpCiB7Ci0JVUNvbGxhdG9y ICAqY29sbGF0b3I7Ci0JVUVycm9yQ29kZQlzdGF0dXM7Ci0JY29uc3QgY2hhciAqb3JpZ19z dHIgPSBsb2Nfc3RyOwotCWNoYXIJICAgKmZpeGVkX3N0ciA9IE5VTEw7Ci0KLQkvKgotCSAq IE11c3QgbmV2ZXIgb3BlbiBkZWZhdWx0IGNvbGxhdG9yLCBiZWNhdXNlIGl0IGRlcGVuZHMg b24gdGhlIGVudmlyb25tZW50Ci0JICogYW5kIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUuIFNo b3VsZCBub3QgaGFwcGVuLCBidXQgY2hlY2sgaGVyZSB0byBjYXRjaAotCSAqIGJ1Z3MgdGhh dCBtaWdodCBiZSBoYXJkIHRvIGNhdGNoIG90aGVyd2lzZS4KLQkgKgotCSAqIE5COiB0aGUg ZGVmYXVsdCBjb2xsYXRvciBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGNvbGxhdG9yIGZvciB0 aGUgcm9vdAotCSAqIGxvY2FsZS4gVGhlIHJvb3QgbG9jYWxlIG1heSBiZSBzcGVjaWZpZWQg YXMgdGhlIGVtcHR5IHN0cmluZywgInVuZCIsIG9yCi0JICogInJvb3QiLiBUaGUgZGVmYXVs dCBjb2xsYXRvciBpcyBvcGVuZWQgYnkgcGFzc2luZyBOVUxMIHRvIHVjb2xfb3BlbigpLgot CSAqLwotCWlmIChsb2Nfc3RyID09IE5VTEwpCi0JCWVsb2coRVJST1IsICJvcGVuaW5nIGRl ZmF1bHQgY29sbGF0b3IgaXMgbm90IHN1cHBvcnRlZCIpOwotCi0JLyoKLQkgKiBJbiBJQ1Ug dmVyc2lvbnMgNTQgYW5kIGVhcmxpZXIsICJ1bmQiIGlzIG5vdCBhIHJlY29nbml6ZWQgc3Bl bGxpbmcgb2YKLQkgKiB0aGUgcm9vdCBsb2NhbGUuIElmIHRoZSBmaXJzdCBjb21wb25lbnQg b2YgdGhlIGxvY2FsZSBpcyAidW5kIiwgcmVwbGFjZQotCSAqIHdpdGggInJvb3QiIGJlZm9y ZSBvcGVuaW5nLgotCSAqLwogCWlmIChVX0lDVV9WRVJTSU9OX01BSk9SX05VTSA8IDU1KQog CXsKIAkJY2hhcgkJbGFuZ1tVTE9DX0xBTkdfQ0FQQUNJVFldOworCQlVRXJyb3JDb2RlIHN0 YXR1cyA9IFVfWkVST19FUlJPUjsKIAotCQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAJCXVs b2NfZ2V0TGFuZ3VhZ2UobG9jX3N0ciwgbGFuZywgVUxPQ19MQU5HX0NBUEFDSVRZLCAmc3Rh dHVzKTsKIAkJaWYgKFVfRkFJTFVSRShzdGF0dXMpIHx8IHN0YXR1cyA9PSBVX1NUUklOR19O T1RfVEVSTUlOQVRFRF9XQVJOSU5HKQogCQl7CkBAIC00MTMsMTUgKzQzMSw0OSBAQCBwZ191 Y29sX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKIAkJaWYgKHN0cmNtcChsYW5nLCAidW5k IikgPT0gMCkKIAkJewogCQkJY29uc3QgY2hhciAqcmVtYWluZGVyID0gbG9jX3N0ciArIHN0 cmxlbigidW5kIik7CisJCQljaGFyCSAgICpmaXhlZF9zdHI7CiAKIAkJCWZpeGVkX3N0ciA9 IHBhbGxvYyhzdHJsZW4oInJvb3QiKSArIHN0cmxlbihyZW1haW5kZXIpICsgMSk7CiAJCQlz dHJjcHkoZml4ZWRfc3RyLCAicm9vdCIpOwogCQkJc3RyY2F0KGZpeGVkX3N0ciwgcmVtYWlu ZGVyKTsKIAotCQkJbG9jX3N0ciA9IGZpeGVkX3N0cjsKKwkJCXJldHVybiBmaXhlZF9zdHI7 CiAJCX0KIAl9CiAKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIFdyYXBwZXIgYXJvdW5k IHVjb2xfb3BlbigpIHRvIGhhbmRsZSBBUEkgZGlmZmVyZW5jZXMgZm9yIG9sZGVyIElDVQor ICogdmVyc2lvbnMuCisgKgorICogRW5zdXJlIHRoYXQgbm8gcGF0aCBsZWFrcyBhIFVDb2xs YXRvci4KKyAqLworVUNvbGxhdG9yICoKK3BnX3Vjb2xfb3Blbihjb25zdCBjaGFyICpsb2Nf c3RyKQoreworCVVDb2xsYXRvciAgKmNvbGxhdG9yOworCVVFcnJvckNvZGUJc3RhdHVzOwor CWNvbnN0IGNoYXIgKm9yaWdfc3RyID0gbG9jX3N0cjsKKwljaGFyCSAgICpmaXhlZF9zdHI7 CisKKwkvKgorCSAqIE11c3QgbmV2ZXIgb3BlbiBkZWZhdWx0IGNvbGxhdG9yLCBiZWNhdXNl IGl0IGRlcGVuZHMgb24gdGhlIGVudmlyb25tZW50CisJICogYW5kIG1heSBjaGFuZ2UgYXQg YW55IHRpbWUuIFNob3VsZCBub3QgaGFwcGVuLCBidXQgY2hlY2sgaGVyZSB0byBjYXRjaAor CSAqIGJ1Z3MgdGhhdCBtaWdodCBiZSBoYXJkIHRvIGNhdGNoIG90aGVyd2lzZS4KKwkgKgor CSAqIE5COiB0aGUgZGVmYXVsdCBjb2xsYXRvciBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGNv bGxhdG9yIGZvciB0aGUgcm9vdAorCSAqIGxvY2FsZS4gVGhlIHJvb3QgbG9jYWxlIG1heSBi ZSBzcGVjaWZpZWQgYXMgdGhlIGVtcHR5IHN0cmluZywgInVuZCIsIG9yCisJICogInJvb3Qi LiBUaGUgZGVmYXVsdCBjb2xsYXRvciBpcyBvcGVuZWQgYnkgcGFzc2luZyBOVUxMIHRvIHVj b2xfb3BlbigpLgorCSAqLworCWlmIChsb2Nfc3RyID09IE5VTEwpCisJCWVsb2coRVJST1Is ICJvcGVuaW5nIGRlZmF1bHQgY29sbGF0b3IgaXMgbm90IHN1cHBvcnRlZCIpOworCisJZml4 ZWRfc3RyID0gZml4X2ljdV9sb2NhbGVfc3RyKGxvY19zdHIpOworCWlmIChmaXhlZF9zdHIp CisJCWxvY19zdHIgPSBmaXhlZF9zdHI7CisKIAlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAJ Y29sbGF0b3IgPSB1Y29sX29wZW4obG9jX3N0ciwgJnN0YXR1cyk7CiAJaWYgKFVfRkFJTFVS RShzdGF0dXMpKQpAQCAtNDU2LDYgKzUwOCwzNyBAQCBwZ191Y29sX29wZW4oY29uc3QgY2hh ciAqbG9jX3N0cikKIAlyZXR1cm4gY29sbGF0b3I7CiB9CiAKKy8qCisgKiBXcmFwcGVyIGFy b3VuZCB1Y2FzZW1hcF9vcGVuKCkgdG8gaGFuZGxlIEFQSSBkaWZmZXJlbmNlcyBmb3Igb2xk ZXIgSUNVCisgKiB2ZXJzaW9ucy4KKyAqCisgKiBBZGRpdGlvbmFsbHkgbWFrZXMgc3VyZSB3 ZSBnZXQgdGhlIHJpZ2h0IG9wdGlvbnMgZm9yIGNhc2UgZm9sZGluZy4KKyAqLworc3RhdGlj IFVDYXNlTWFwICoKK3BnX3VjYXNlbWFwX29wZW4oY29uc3QgY2hhciAqbG9jX3N0cikKK3sK KwlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwlVQ2FzZU1hcCAgICpjYXNl bWFwOworCWNvbnN0IGNoYXIgKm9yaWdfc3RyID0gbG9jX3N0cjsKKwljaGFyCSAgICpmaXhl ZF9zdHI7CisKKwlmaXhlZF9zdHIgPSBmaXhfaWN1X2xvY2FsZV9zdHIobG9jX3N0cik7CisJ aWYgKGZpeGVkX3N0cikKKwkJbG9jX3N0ciA9IGZpeGVkX3N0cjsKKworCWNhc2VtYXAgPSB1 Y2FzZW1hcF9vcGVuKGxvY19zdHIsIGljdV9mb2xkY2FzZV9vcHRpb25zKGxvY19zdHIpLCAm c3RhdHVzKTsKKwlpZiAoVV9GQUlMVVJFKHN0YXR1cykpCisJCWVyZXBvcnQoRVJST1IsCisJ CQkJZXJyY29kZShFUlJDT0RFX0lOVkFMSURfUEFSQU1FVEVSX1ZBTFVFKSwKKwkJCQllcnJt c2coImNvdWxkIG5vdCBvcGVuIGNhc2VtYXAgZm9yIGxvY2FsZSBcIiVzXCI6ICVzIiwKKwkJ CQkJCW9yaWdfc3RyLCB1X2Vycm9yTmFtZShzdGF0dXMpKSk7CisKKwlpZiAoZml4ZWRfc3Ry ICE9IE5VTEwpCisJCXBmcmVlKGZpeGVkX3N0cik7CisKKwlyZXR1cm4gY2FzZW1hcDsKK30K KwogLyoKICAqIENyZWF0ZSBhIFVDb2xsYXRvciB3aXRoIHRoZSBnaXZlbiBsb2NhbGUgc3Ry aW5nIGFuZCBydWxlcy4KICAqCkBAIC01MjgsODAgKzYxMSw4NCBAQCBzdGF0aWMgc2l6ZV90 CiBzdHJsb3dlcl9pY3UoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFy ICpzcmMsIHNzaXplX3Qgc3JjbGVuLAogCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQlp bnQzMl90CQlsZW5fdWNoYXI7Ci0JaW50MzJfdAkJbGVuX2NvbnY7Ci0JVUNoYXIJICAgKmJ1 ZmZfdWNoYXI7Ci0JVUNoYXIJICAgKmJ1ZmZfY29udjsKLQlzaXplX3QJCXJlc3VsdF9sZW47 Ci0KLQlsZW5fdWNoYXIgPSBpY3VfdG9fdWNoYXIoJmJ1ZmZfdWNoYXIsIHNyYywgc3JjbGVu KTsKLQlsZW5fY29udiA9IGljdV9jb252ZXJ0X2Nhc2UodV9zdHJUb0xvd2VyLCBsb2NhbGUs Ci0JCQkJCQkJCSZidWZmX2NvbnYsIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7Ci0JcmVzdWx0 X2xlbiA9IGljdV9mcm9tX3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9j b252KTsKLQlwZnJlZShidWZmX3VjaGFyKTsKLQlwZnJlZShidWZmX2NvbnYpOwotCi0JcmV0 dXJuIHJlc3VsdF9sZW47CisJcmV0dXJuIGljdV9jb252ZXJ0X2Nhc2UodV9zdHJUb0xvd2Vy LCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBz aXplX3QKIHN0cnRpdGxlX2ljdShjaGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0 IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4sCiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQog ewotCWludDMyX3QJCWxlbl91Y2hhcjsKLQlpbnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkg ICAqYnVmZl91Y2hhcjsKLQlVQ2hhcgkgICAqYnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0 X2xlbjsKLQotCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBz cmNsZW4pOwotCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRvVGl0bGVfZGVm YXVsdF9CSSwgbG9jYWxlLAotCQkJCQkJCQkmYnVmZl9jb252LCBidWZmX3VjaGFyLCBsZW5f dWNoYXIpOwotCXJlc3VsdF9sZW4gPSBpY3VfZnJvbV91Y2hhcihkZXN0LCBkZXN0c2l6ZSwg YnVmZl9jb252LCBsZW5fY29udik7Ci0JcGZyZWUoYnVmZl91Y2hhcik7Ci0JcGZyZWUoYnVm Zl9jb252KTsKLQotCXJldHVybiByZXN1bHRfbGVuOworCXJldHVybiBpY3VfY29udmVydF9j YXNlKHVfc3RyVG9UaXRsZV9kZWZhdWx0X0JJLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNs ZW4sIGxvY2FsZSk7CiB9CiAKIHN0YXRpYyBzaXplX3QKIHN0cnVwcGVyX2ljdShjaGFyICpk ZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBzcmNsZW4s CiAJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCWludDMyX3QJCWxlbl91Y2hhcjsKLQlp bnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKLQlVQ2hhcgkgICAq YnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0X2xlbjsKLQotCWxlbl91Y2hhciA9IGljdV90 b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNsZW4pOwotCWxlbl9jb252ID0gaWN1X2Nv bnZlcnRfY2FzZSh1X3N0clRvVXBwZXIsIGxvY2FsZSwKLQkJCQkJCQkJJmJ1ZmZfY29udiwg YnVmZl91Y2hhciwgbGVuX3VjaGFyKTsKLQlyZXN1bHRfbGVuID0gaWN1X2Zyb21fdWNoYXIo ZGVzdCwgZGVzdHNpemUsIGJ1ZmZfY29udiwgbGVuX2NvbnYpOwotCXBmcmVlKGJ1ZmZfdWNo YXIpOwotCXBmcmVlKGJ1ZmZfY29udik7Ci0KLQlyZXR1cm4gcmVzdWx0X2xlbjsKKwlyZXR1 cm4gaWN1X2NvbnZlcnRfY2FzZSh1X3N0clRvVXBwZXIsIGRlc3QsIGRlc3RzaXplLCBzcmMs IHNyY2xlbiwgbG9jYWxlKTsKIH0KIAogc3RhdGljIHNpemVfdAogc3RyZm9sZF9pY3UoY2hh ciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3Jj bGVuLAogCQkJcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCWludDMyX3QJCWxlbl91Y2hhcjsK LQlpbnQzMl90CQlsZW5fY29udjsKLQlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKLQlVQ2hhcgkg ICAqYnVmZl9jb252OwotCXNpemVfdAkJcmVzdWx0X2xlbjsKKwlyZXR1cm4gaWN1X2NvbnZl cnRfY2FzZSh1X3N0ckZvbGRDYXNlX2RlZmF1bHQsIGRlc3QsIGRlc3RzaXplLCBzcmMsIHNy Y2xlbiwgbG9jYWxlKTsKK30KIAotCWxlbl91Y2hhciA9IGljdV90b191Y2hhcigmYnVmZl91 Y2hhciwgc3JjLCBzcmNsZW4pOwotCWxlbl9jb252ID0gaWN1X2NvbnZlcnRfY2FzZSh1X3N0 ckZvbGRDYXNlX2RlZmF1bHQsIGxvY2FsZSwKLQkJCQkJCQkJJmJ1ZmZfY29udiwgYnVmZl91 Y2hhciwgbGVuX3VjaGFyKTsKLQlyZXN1bHRfbGVuID0gaWN1X2Zyb21fdWNoYXIoZGVzdCwg ZGVzdHNpemUsIGJ1ZmZfY29udiwgbGVuX2NvbnYpOwotCXBmcmVlKGJ1ZmZfdWNoYXIpOwot CXBmcmVlKGJ1ZmZfY29udik7CitzdGF0aWMgc2l6ZV90CitzdHJsb3dlcl9pY3VfdXRmOChj aGFyICpkZXN0LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc3NpemVfdCBz cmNsZW4sCisJCQkJICBwZ19sb2NhbGVfdCBsb2NhbGUpCit7CisJVUVycm9yQ29kZQlzdGF0 dXMgPSBVX1pFUk9fRVJST1I7CisJaW50MzJfdAkJbmVlZGVkOwogCi0JcmV0dXJuIHJlc3Vs dF9sZW47CisJbmVlZGVkID0gdWNhc2VtYXBfdXRmOFRvTG93ZXIobG9jYWxlLT5pY3UudWNh c2VtYXAsIGRlc3QsIGRlc3RzaXplLCBzcmMsIHNyY2xlbiwgJnN0YXR1cyk7CisJaWYgKHN0 YXR1cyAhPSBVX0JVRkZFUl9PVkVSRkxPV19FUlJPUiAmJiBVX0ZBSUxVUkUoc3RhdHVzKSkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQllcnJtc2coImNhc2UgY29udmVyc2lvbiBmYWlsZWQ6 ICVzIiwgdV9lcnJvck5hbWUoc3RhdHVzKSkpOworCXJldHVybiBuZWVkZWQ7Cit9CisKK3N0 YXRpYyBzaXplX3QKK3N0cnRpdGxlX2ljdV91dGY4KGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0 c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNyY2xlbiwKKwkJCQkgIHBnX2xvY2Fs ZV90IGxvY2FsZSkKK3sKKwlVRXJyb3JDb2RlCXN0YXR1cyA9IFVfWkVST19FUlJPUjsKKwlp bnQzMl90CQluZWVkZWQ7CisKKwluZWVkZWQgPSB1Y2FzZW1hcF91dGY4VG9UaXRsZShsb2Nh bGUtPmljdS51Y2FzZW1hcCwgZGVzdCwgZGVzdHNpemUsIHNyYywgc3JjbGVuLCAmc3RhdHVz KTsKKwlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJGTE9XX0VSUk9SICYmIFVfRkFJTFVS RShzdGF0dXMpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCWVycm1zZygiY2FzZSBjb252ZXJz aW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0dXMpKSk7CisJcmV0dXJuIG5lZWRl ZDsKK30KKworc3RhdGljIHNpemVfdAorc3RydXBwZXJfaWN1X3V0ZjgoY2hhciAqZGVzdCwg c2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNzaXplX3Qgc3JjbGVuLAorCQkJ CSAgcGdfbG9jYWxlX3QgbG9jYWxlKQoreworCVVFcnJvckNvZGUJc3RhdHVzID0gVV9aRVJP X0VSUk9SOworCWludDMyX3QJCW5lZWRlZDsKKworCW5lZWRlZCA9IHVjYXNlbWFwX3V0ZjhU b1VwcGVyKGxvY2FsZS0+aWN1LnVjYXNlbWFwLCBkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNs ZW4sICZzdGF0dXMpOworCWlmIChzdGF0dXMgIT0gVV9CVUZGRVJfT1ZFUkZMT1dfRVJST1Ig JiYgVV9GQUlMVVJFKHN0YXR1cykpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJZXJybXNnKCJj YXNlIGNvbnZlcnNpb24gZmFpbGVkOiAlcyIsIHVfZXJyb3JOYW1lKHN0YXR1cykpKTsKKwly ZXR1cm4gbmVlZGVkOworfQorCitzdGF0aWMgc2l6ZV90CitzdHJmb2xkX2ljdV91dGY4KGNo YXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzc2l6ZV90IHNy Y2xlbiwKKwkJCQkgcGdfbG9jYWxlX3QgbG9jYWxlKQoreworCVVFcnJvckNvZGUJc3RhdHVz ID0gVV9aRVJPX0VSUk9SOworCWludDMyX3QJCW5lZWRlZDsKKworCW5lZWRlZCA9IHVjYXNl bWFwX3V0ZjhGb2xkQ2FzZShsb2NhbGUtPmljdS51Y2FzZW1hcCwgZGVzdCwgZGVzdHNpemUs IHNyYywgc3JjbGVuLCAmc3RhdHVzKTsKKwlpZiAoc3RhdHVzICE9IFVfQlVGRkVSX09WRVJG TE9XX0VSUk9SICYmIFVfRkFJTFVSRShzdGF0dXMpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJ CWVycm1zZygiY2FzZSBjb252ZXJzaW9uIGZhaWxlZDogJXMiLCB1X2Vycm9yTmFtZShzdGF0 dXMpKSk7CisJcmV0dXJuIG5lZWRlZDsKIH0KIAogLyoKQEAgLTgyOSw4ICs5MTYsMjggQEAg aWN1X2Zyb21fdWNoYXIoY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBVQ2hh ciAqYnVmZl91Y2hhciwgaW50MzJfdCBsZW4KIH0KIAogc3RhdGljIGludDMyX3QKLWljdV9j b252ZXJ0X2Nhc2UoSUNVX0NvbnZlcnRfRnVuYyBmdW5jLCBwZ19sb2NhbGVfdCBteWxvY2Fs ZSwKLQkJCQkgVUNoYXIgKipidWZmX2Rlc3QsIFVDaGFyICpidWZmX3NvdXJjZSwgaW50MzJf dCBsZW5fc291cmNlKQoraWN1X2NvbnZlcnRfY2FzZShJQ1VfQ29udmVydF9GdW5jIGZ1bmMs IGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwKKwkJCQkgY29uc3QgY2hhciAqc3JjLCBz c2l6ZV90IHNyY2xlbiwgcGdfbG9jYWxlX3QgbG9jYWxlKQoreworCWludDMyX3QJCWxlbl91 Y2hhcjsKKwlpbnQzMl90CQlsZW5fY29udjsKKwlVQ2hhcgkgICAqYnVmZl91Y2hhcjsKKwlV Q2hhcgkgICAqYnVmZl9jb252OworCXNpemVfdAkJcmVzdWx0X2xlbjsKKworCWxlbl91Y2hh ciA9IGljdV90b191Y2hhcigmYnVmZl91Y2hhciwgc3JjLCBzcmNsZW4pOworCWxlbl9jb252 ID0gaWN1X2NvbnZlcnRfY2FzZV91Y2hhcihmdW5jLCBsb2NhbGUsICZidWZmX2NvbnYsCisJ CQkJCQkJCQkgIGJ1ZmZfdWNoYXIsIGxlbl91Y2hhcik7CisJcmVzdWx0X2xlbiA9IGljdV9m cm9tX3VjaGFyKGRlc3QsIGRlc3RzaXplLCBidWZmX2NvbnYsIGxlbl9jb252KTsKKwlwZnJl ZShidWZmX3VjaGFyKTsKKwlwZnJlZShidWZmX2NvbnYpOworCisJcmV0dXJuIHJlc3VsdF9s ZW47Cit9CisKK3N0YXRpYyBpbnQzMl90CitpY3VfY29udmVydF9jYXNlX3VjaGFyKElDVV9D b252ZXJ0X0Z1bmMgZnVuYywgcGdfbG9jYWxlX3QgbXlsb2NhbGUsCisJCQkJCSAgIFVDaGFy ICoqYnVmZl9kZXN0LCBVQ2hhciAqYnVmZl9zb3VyY2UsIGludDMyX3QgbGVuX3NvdXJjZSkK IHsKIAlVRXJyb3JDb2RlCXN0YXR1czsKIAlpbnQzMl90CQlsZW5fZGVzdDsKQEAgLTg3MCwx MCArOTc3LDE3IEBAIHVfc3RyRm9sZENhc2VfZGVmYXVsdChVQ2hhciAqZGVzdCwgaW50MzJf dCBkZXN0Q2FwYWNpdHksCiAJCQkJCSAgY29uc3QgVUNoYXIgKnNyYywgaW50MzJfdCBzcmNM ZW5ndGgsCiAJCQkJCSAgY29uc3QgY2hhciAqbG9jYWxlLAogCQkJCQkgIFVFcnJvckNvZGUg KnBFcnJvckNvZGUpCit7CisJcmV0dXJuIHVfc3RyRm9sZENhc2UoZGVzdCwgZGVzdENhcGFj aXR5LCBzcmMsIHNyY0xlbmd0aCwKKwkJCQkJCSBpY3VfZm9sZGNhc2Vfb3B0aW9ucyhsb2Nh bGUpLCBwRXJyb3JDb2RlKTsKK30KKworc3RhdGljIGludDMyX3QKK2ljdV9mb2xkY2FzZV9v cHRpb25zKGNvbnN0IGNoYXIgKmxvY2FsZSkKIHsKIAl1aW50MzIJCW9wdGlvbnMgPSBVX0ZP TERfQ0FTRV9ERUZBVUxUOwogCWNoYXIJCWxhbmdbM107Ci0JVUVycm9yQ29kZQlzdGF0dXM7 CisJVUVycm9yQ29kZQlzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAKIAkvKgogCSAqIFVubGlr ZSB0aGUgSUNVIEFQSXMgZm9yIGxvd2VyY2FzaW5nLCB0aXRsZWNhc2luZywgYW5kIHVwcGVy Y2FzaW5nLCBjYXNlCkBAIC04ODEsNyArOTk1LDYgQEAgdV9zdHJGb2xkQ2FzZV9kZWZhdWx0 KFVDaGFyICpkZXN0LCBpbnQzMl90IGRlc3RDYXBhY2l0eSwKIAkgKiBvcHRpb24gcmVsZXZh bnQgdG8gVHVya2ljIGxhbmd1YWdlcyAnYXonIGFuZCAndHInOyBjaGVjayBmb3IgdGhvc2UK IAkgKiBsYW5ndWFnZXMgdG8gZW5hYmxlIHRoZSBvcHRpb24uCiAJICovCi0Jc3RhdHVzID0g VV9aRVJPX0VSUk9SOwogCXVsb2NfZ2V0TGFuZ3VhZ2UobG9jYWxlLCBsYW5nLCAzLCAmc3Rh dHVzKTsKIAlpZiAoVV9TVUNDRVNTKHN0YXR1cykpCiAJewpAQCAtODkzLDggKzEwMDYsNyBA QCB1X3N0ckZvbGRDYXNlX2RlZmF1bHQoVUNoYXIgKmRlc3QsIGludDMyX3QgZGVzdENhcGFj aXR5LAogCQkJb3B0aW9ucyA9IFVfRk9MRF9DQVNFX0VYQ0xVREVfU1BFQ0lBTF9JOwogCX0K IAotCXJldHVybiB1X3N0ckZvbGRDYXNlKGRlc3QsIGRlc3RDYXBhY2l0eSwgc3JjLCBzcmNM ZW5ndGgsCi0JCQkJCQkgb3B0aW9ucywgcEVycm9yQ29kZSk7CisJcmV0dXJuIG9wdGlvbnM7 CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGlscy9wZ19sb2NhbGUuaCBi L3NyYy9pbmNsdWRlL3V0aWxzL3BnX2xvY2FsZS5oCmluZGV4IGIxZWU1ZmIwZWY1Li40NjVm MTcwYmE3OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmgKKysr IGIvc3JjL2luY2x1ZGUvdXRpbHMvcGdfbG9jYWxlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICN1 bmRlZiBVX1NIT1dfQ1BMVVNQTFVTX0hFQURFUl9BUEkKICNkZWZpbmUgVV9TSE9XX0NQTFVT UExVU19IRUFERVJfQVBJIDAKICNpbmNsdWRlIDx1bmljb2RlL3Vjb2wuaD4KKyNpbmNsdWRl IDx1bmljb2RlL3VjYXNlbWFwLmg+CiAjZW5kaWYKIAogLyogdXNlIGZvciBsaWJjIGxvY2Fs ZSBuYW1lcyAqLwpAQCAtMTY4LDYgKzE2OSw3IEBAIHN0cnVjdCBwZ19sb2NhbGVfc3RydWN0 CiAJCQljb25zdCBjaGFyICpsb2NhbGU7CiAJCQlVQ29sbGF0b3IgICp1Y29sOwogCQkJbG9j YWxlX3QJbHQ7CisJCQlVQ2FzZU1hcCAgICp1Y2FzZW1hcDsKIAkJfQkJCWljdTsKICNlbmRp ZgogCX07Ci0tIAoyLjQ3LjMKCg== --------------GR8OY1aikm1zCaqeEo0S7p6M--