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 1waiXU-0020Oc-2P for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jun 2026 23:22:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1waiXS-000Oyw-0M for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jun 2026 23:22:18 +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.96) (envelope-from ) id 1waiXR-000Oyn-1s for pgsql-hackers@lists.postgresql.org; Fri, 19 Jun 2026 23:22:17 +0000 Received: from mail-dy1-x132f.google.com ([2607:f8b0:4864:20::132f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1waiXO-00000001LP0-15Qj for pgsql-hackers@postgresql.org; Fri, 19 Jun 2026 23:22:16 +0000 Received: by mail-dy1-x132f.google.com with SMTP id 5a478bee46e88-30bf132969bso3107203eec.0 for ; Fri, 19 Jun 2026 16:22:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20251104.gappssmtp.com; s=20251104; t=1781911330; x=1782516130; darn=postgresql.org; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:from:to:cc:subject:date:message-id:reply-to; bh=fXarh2OYlMN4Q3GD4sTaqaT8iZI6kH/ylqPc8zHRSgk=; b=CF/7NrfNQ+P0PWKUvSDtzWfie9sEIMI9OotkctlVDF7xS2zO1yMsnD7DM1eGXta5/4 ohwVRnc2lBwDWmrzCj6FitwBqVs2FDGzJZMmW/hyXfKaXbE40HnXBy98M1Z4Ycl1NuVT JJ6PvbTGgrDzNK9qJl6aeYgTLCoEjjJ3JdvziGrxEmwl9glgvo1kM3XH1HUig5X1EHaC UjTCyU/gSecRR3jp6tDaZW7jNPRLre/FOukG7V4hohNADu+17SwJ2+NnsECO8oh8B5qK QjBIF55Oz+brv2vAy1ASocQCqkLbb4CIUlvHO8YfbLocTKVquRVYCS1LKa5gMzTYwEnp RFKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781911330; x=1782516130; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=fXarh2OYlMN4Q3GD4sTaqaT8iZI6kH/ylqPc8zHRSgk=; b=baPr8jU8c+aSNWgIpoEECI0vtE3SfXzGNierYo2Euh97eof9fnGU1bDCj5V0fUbOg4 acfJQx159ci/5llBEW6nt//I9TUCDtDqr9TnwHtBYAInIFkBESOsf10R+fkXndbLa6/I qG7P2LCh5uI7e4HKcuJdykWp1Ha9H044vSizNVpxMULx+Wrn02dxyFeiIIOBPsBM3yVL +D3D92JPGW2Y9lAyYShZq9xOLpEIRpeGkbSvivl8LDjyE/zJavacgtcYoh1FOsOimtOU C1Mtus7xMhP+aoQPnu/HAuZiIwfQl+vnDdP++IVR/Y04VzIFx/vGIkM4HV6UBwuuSY7q mw7Q== X-Gm-Message-State: AOJu0Yw+W11+5ZlsfYNYUTi+ph6YLS2y96an5zLCwIalNWFWe9a44yxU nOc/iNLttGC313uQgMIunxJ8yYte0jVTbwN0B3+MY0fBOFF5hxFCSM5Mj669W+O7pA== X-Gm-Gg: AfdE7ck6yJo6VpN6dYcPg0Hs4AOKBMzDjWGiXZGZFESzAQppIihSz7fNvzwApJNI/H0 Z9BoETYY78X7gG5sCcalgzVdq997ezxkNa0ZPHOqDmkcOuk9DFRiCUvKdVYx32B5/5EToUyzv9H iTaOoDBVdDmnaPpkdYIFahwxVjkTsBE1LbGnsqPPPZfqMxwhRNHpBPlxIcu9ozJgTThNIhb/xC+ kYXC1+XSOnqZzpupRRALey7s22UU/2xy5l1GyUe9d6Y5BMW4XfJ7VmQWu2uje5YHG64L4PbknEu d5GAtdwimSQBieDPEJCuC2p2LoHNiC83WPFAGp+cl/PnZxLum4KUlqZ+Zy5wJbeU0KNSwpNPet2 sU77+bYA1ZUux197lxkvHDle+krQoMEwRR9i8kFGurOsU3MylGnzLtJYc5DLTNjAzomgbiQVylT DSQjYxvZw7i0MyitM12XhIvcRDaVsFRx8vsOEziHDJqp3upg== X-Received: by 2002:a05:7300:fb90:b0:30b:c4e3:8235 with SMTP id 5a478bee46e88-30c0716a886mr3732967eec.27.1781911330398; Fri, 19 Jun 2026 16:22:10 -0700 (PDT) Received: from jeff-ws-bridge.lan (c-24-7-19-3.hsd1.ca.comcast.net. [24.7.19.3]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-30c1be95ebfsm1310536eec.31.2026.06.19.16.22.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Jun 2026 16:22:09 -0700 (PDT) Message-ID: Subject: Re: Small patch to improve safety of utf8_to_unicode(). From: Jeff Davis To: Chao Li Cc: pgsql-hackers@postgresql.org Date: Fri, 19 Jun 2026 16:22:08 -0700 In-Reply-To: References: <541F240E-94AD-4D65-9794-7D6C316BC3FF@gmail.com> Content-Type: multipart/mixed; boundary="=-5z+XxYkpXZAwW1gIG2bP" User-Agent: Evolution 3.52.3-0ubuntu1.1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-5z+XxYkpXZAwW1gIG2bP Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, 2025-12-17 at 11:37 -0800, Jeff Davis wrote: > On Tue, 2025-12-16 at 07:34 +0800, Chao Li wrote: > > > > >=20 > > V2 LGTM. >=20 > On second thought, if we're going to change something here, we should > probably have a more flexible API for both utf8_to_unicode() and > unicode_to_utf8(). New series: 0001: validates UTF8 before calling into unicode_case.c. Extra defense, and simple to backport, but regresses performance of those functions. It also might risk errors if somehow there is invalid UTF8. 0002: refactors to create an error path from unicode_case.c into pg_locale_builtin.c, where a proper error can be thrown. This wins back the performance lost in the previous commit. This is perhaps backportable, but technically it changes an exported function signature, so carries some very low risk. 0003: Adds utf8encode() and utf8decode(), which are iteration-friendly and inlinable, and fully-validate UTF8 (e.g. rejects surrogate halves). This is an enhancement so should not be backported. 0004: Make use of new API from unicode_case.c. Regards, Jeff Davis --=-5z+XxYkpXZAwW1gIG2bP Content-Disposition: attachment; filename="v3-0001-unicode_case.c-ensure-valid-UTF8.patch" Content-Type: text/x-patch; name="v3-0001-unicode_case.c-ensure-valid-UTF8.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA0ZDU5YTMxNmExNDdkNjhmZjAxMTNjZWM2Yjk2OTAzN2QyZWUxNjllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBG cmksIDE5IEp1biAyMDI2IDE0OjA5OjMxIC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2MyAxLzRdIHVu aWNvZGVfY2FzZS5jOiBlbnN1cmUgdmFsaWQgVVRGOC4KClNob3VsZCBiZSB2YWxpZCwgYnV0IGNo ZWNrIGJlZm9yZSBjYWxsaW5nIHVuaWNvZGVfc3RybG93ZXIoKSwgZXRjLgoKRGlzY3Vzc2lvbjog aHR0cHM6Ly9wb3N0Z3IuZXMvbS9jMzU1MzU0ZTZjM2Y0YTdhYWZiMDQ3MzYxYjczZGIyNDcyNjBm Y2EwLmNhbWVsQGotZGF2aXMuY29tClJldmlld2VkLWJ5OiBDaGFvIExpIDxsaS5ldmFuLmNoYW9A Z21haWwuY29tPgpCYWNrcGF0Y2gtdGhyb3VnaDogMTcKLS0tCiBzcmMvYmFja2VuZC91dGlscy9h ZHQvcGdfbG9jYWxlX2J1aWx0aW4uYyB8IDQgKysrKwogMSBmaWxlIGNoYW5nZWQsIDQgaW5zZXJ0 aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfYnVp bHRpbi5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9idWlsdGluLmMKaW5kZXgg MDFkNGY1NWIwN2UuLjdmMTY3ZTc1MWVhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9h ZHQvcGdfbG9jYWxlX2J1aWx0aW4uYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdfbG9j YWxlX2J1aWx0aW4uYwpAQCAtODYsNiArODYsNyBAQCBzdGF0aWMgc2l6ZV90CiBzdHJsb3dlcl9i dWlsdGluKGNoYXIgKmRlc3QsIHNpemVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzaXpl X3Qgc3JjbGVuLAogCQkJCSBwZ19sb2NhbGVfdCBsb2NhbGUpCiB7CisJcGdfdmVyaWZ5bWJzdHIo c3JjLCBzcmNsZW4sIGZhbHNlKTsKIAlyZXR1cm4gdW5pY29kZV9zdHJsb3dlcihkZXN0LCBkZXN0 c2l6ZSwgc3JjLCBzcmNsZW4sCiAJCQkJCQkJbG9jYWxlLT5idWlsdGluLmNhc2VtYXBfZnVsbCk7 CiB9CkBAIC0xMDMsNiArMTA0LDcgQEAgc3RydGl0bGVfYnVpbHRpbihjaGFyICpkZXN0LCBzaXpl X3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbiwKIAkJLnByZXZfYWxu dW0gPSBmYWxzZSwKIAl9OwogCisJcGdfdmVyaWZ5bWJzdHIoc3JjLCBzcmNsZW4sIGZhbHNlKTsK IAlyZXR1cm4gdW5pY29kZV9zdHJ0aXRsZShkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sCiAJ CQkJCQkJbG9jYWxlLT5idWlsdGluLmNhc2VtYXBfZnVsbCwKIAkJCQkJCQlpbml0Y2FwX3dibmV4 dCwgJndic3RhdGUpOwpAQCAtMTEyLDYgKzExNCw3IEBAIHN0YXRpYyBzaXplX3QKIHN0cnVwcGVy X2J1aWx0aW4oY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNp emVfdCBzcmNsZW4sCiAJCQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKKwlwZ192ZXJpZnltYnN0 cihzcmMsIHNyY2xlbiwgZmFsc2UpOwogCXJldHVybiB1bmljb2RlX3N0cnVwcGVyKGRlc3QsIGRl c3RzaXplLCBzcmMsIHNyY2xlbiwKIAkJCQkJCQlsb2NhbGUtPmJ1aWx0aW4uY2FzZW1hcF9mdWxs KTsKIH0KQEAgLTEyMCw2ICsxMjMsNyBAQCBzdGF0aWMgc2l6ZV90CiBzdHJmb2xkX2J1aWx0aW4o Y2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNs ZW4sCiAJCQkJcGdfbG9jYWxlX3QgbG9jYWxlKQogeworCXBnX3ZlcmlmeW1ic3RyKHNyYywgc3Jj bGVuLCBmYWxzZSk7CiAJcmV0dXJuIHVuaWNvZGVfc3RyZm9sZChkZXN0LCBkZXN0c2l6ZSwgc3Jj LCBzcmNsZW4sCiAJCQkJCQkgICBsb2NhbGUtPmJ1aWx0aW4uY2FzZW1hcF9mdWxsKTsKIH0KLS0g CjIuNDMuMAoK --=-5z+XxYkpXZAwW1gIG2bP Content-Disposition: attachment; filename="v3-0002-Move-UTF8-checks-into-unicode_case.c.patch" Content-Type: text/x-patch; name="v3-0002-Move-UTF8-checks-into-unicode_case.c.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBmZmZhNzE1M2Y1NjNhMTk2NjNhMDJlNDQxOTZmMzc3YjgzYmYyMTdmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBU aHUsIDE2IEFwciAyMDI2IDE0OjU2OjExIC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2MyAyLzRdIE1v dmUgVVRGOCBjaGVja3MgaW50byB1bmljb2RlX2Nhc2UuYy4KClByZS1jaGVja2luZyBVVEYtOCBp cyBpbmVmZmljaWVudC4gUmVmYWN0b3IgdGhlIGVycm9yIHBhdGhzIHNvIHdlIGNhbgpjYXRjaCBV VEYtOCBlcnJvcnMgd2hpbGUgaXRlcmF0aW5nLCBhbmQgcmV0dXJuIGJhY2sgdG8KcGdfbG9jYWxl X2J1aWx0aW4uYyB3aGVyZSB3ZSBjYW4gdGhyb3cgdGhlIGVycm9yLgoKUmV2aWV3ZWQtYnk6IENo YW8gTGkgPGxpLmV2YW4uY2hhb0BnbWFpbC5jb20+CkRpc2N1c3Npb246IGh0dHBzOi8vcG9zdGdy LmVzL20vYzM1NTM1NGU2YzNmNGE3YWFmYjA0NzM2MWI3M2RiMjQ3MjYwZmNhMC5jYW1lbEBqLWRh dmlzLmNvbQotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfYnVpbHRpbi5jIHwg ODUgKysrKysrKysrKysrKysrLS0tLS0tCiBzcmMvY29tbW9uL3VuaWNvZGUvY2FzZV90ZXN0LmMg ICAgICAgICAgICB8IDMzICsrKysrLS0tCiBzcmMvY29tbW9uL3VuaWNvZGVfY2FzZS5jICAgICAg ICAgICAgICAgICB8IDkyICsrKysrKysrKysrKysrKystLS0tLS0tCiBzcmMvaW5jbHVkZS9jb21t b24vdW5pY29kZV9jYXNlLmggICAgICAgICB8ICA4ICstCiA0IGZpbGVzIGNoYW5nZWQsIDE1NiBp bnNlcnRpb25zKCspLCA2MiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvcGdfbG9jYWxlX2J1aWx0aW4uYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19s b2NhbGVfYnVpbHRpbi5jCmluZGV4IDdmMTY3ZTc1MWVhLi45NmRhOWM2ZmNmMyAxMDA2NDQKLS0t IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9idWlsdGluLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9idWlsdGluLmMKQEAgLTYyLDIxICs2MiwzMiBAQCBp bml0Y2FwX3dibmV4dCh2b2lkICpzdGF0ZSkKIAogCXdoaWxlICh3YnN0YXRlLT5vZmZzZXQgPCB3 YnN0YXRlLT5sZW4pCiAJewotCQljaGFyMzJfdAl1ID0gdXRmOF90b191bmljb2RlKChjb25zdCB1 bnNpZ25lZCBjaGFyICopIHdic3RhdGUtPnN0ciArCisJCWludAkJCXVsZW4gPSBwZ191dGZfbWJs ZW4oKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgd2JzdGF0ZS0+c3RyICsKIAkJCQkJCQkJCQl3YnN0 YXRlLT5vZmZzZXQpOwotCQlib29sCQljdXJyX2FsbnVtID0gcGdfdV9pc2FsbnVtKHUsIHdic3Rh dGUtPnBvc2l4KTsKKwkJY2hhcjMyX3QJdTsKKwkJYm9vbAkJY3Vycl9hbG51bTsKKworCQlpZiAo d2JzdGF0ZS0+b2Zmc2V0ICsgdWxlbiA+IHdic3RhdGUtPmxlbikKKwkJeworCQkJd2JzdGF0ZS0+ b2Zmc2V0ID0gd2JzdGF0ZS0+bGVuOworCQkJcmV0dXJuIHdic3RhdGUtPmxlbjsKKwkJfQorCisJ CXUgPSB1dGY4X3RvX3VuaWNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgd2JzdGF0ZS0+c3Ry ICsKKwkJCQkJCQl3YnN0YXRlLT5vZmZzZXQpOworCQljdXJyX2FsbnVtID0gcGdfdV9pc2FsbnVt KHUsIHdic3RhdGUtPnBvc2l4KTsKIAogCQlpZiAoIXdic3RhdGUtPmluaXQgfHwgY3Vycl9hbG51 bSAhPSB3YnN0YXRlLT5wcmV2X2FsbnVtKQogCQl7CiAJCQlzaXplX3QJCXByZXZfb2Zmc2V0ID0g d2JzdGF0ZS0+b2Zmc2V0OwogCiAJCQl3YnN0YXRlLT5pbml0ID0gdHJ1ZTsKLQkJCXdic3RhdGUt Pm9mZnNldCArPSB1bmljb2RlX3V0ZjhsZW4odSk7CisJCQl3YnN0YXRlLT5vZmZzZXQgKz0gdWxl bjsKIAkJCXdic3RhdGUtPnByZXZfYWxudW0gPSBjdXJyX2FsbnVtOwogCQkJcmV0dXJuIHByZXZf b2Zmc2V0OwogCQl9CiAKLQkJd2JzdGF0ZS0+b2Zmc2V0ICs9IHVuaWNvZGVfdXRmOGxlbih1KTsK KwkJd2JzdGF0ZS0+b2Zmc2V0ICs9IHVsZW47CiAJfQogCiAJcmV0dXJuIHdic3RhdGUtPmxlbjsK QEAgLTg2LDkgKzk3LDE2IEBAIHN0YXRpYyBzaXplX3QKIHN0cmxvd2VyX2J1aWx0aW4oY2hhciAq ZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sCiAJ CQkJIHBnX2xvY2FsZV90IGxvY2FsZSkKIHsKLQlwZ192ZXJpZnltYnN0cihzcmMsIHNyY2xlbiwg ZmFsc2UpOwotCXJldHVybiB1bmljb2RlX3N0cmxvd2VyKGRlc3QsIGRlc3RzaXplLCBzcmMsIHNy Y2xlbiwKLQkJCQkJCQlsb2NhbGUtPmJ1aWx0aW4uY2FzZW1hcF9mdWxsKTsKKwlzaXplX3QJY29u c3VtZWQ7CisJc2l6ZV90CXJlc3VsdDsKKworCXJlc3VsdCA9IHVuaWNvZGVfc3RybG93ZXIoZGVz dCwgZGVzdHNpemUsIHNyYywgc3JjbGVuLCAmY29uc3VtZWQsCisJCQkJCQkJICBsb2NhbGUtPmJ1 aWx0aW4uY2FzZW1hcF9mdWxsKTsKKwlpZiAoY29uc3VtZWQgPCBzcmNsZW4pCisJCXJlcG9ydF9p bnZhbGlkX2VuY29kaW5nKEdldERhdGFiYXNlRW5jb2RpbmcoKSwgc3JjICsgY29uc3VtZWQsCisJ CQkJCQkJCXNyY2xlbiAtIGNvbnN1bWVkKTsKKworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRp YyBzaXplX3QKQEAgLTk2LDM2ICsxMTQsNTcgQEAgc3RydGl0bGVfYnVpbHRpbihjaGFyICpkZXN0 LCBzaXplX3QgZGVzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbiwKIAkJCQkg cGdfbG9jYWxlX3QgbG9jYWxlKQogewogCXN0cnVjdCBXb3JkQm91bmRhcnlTdGF0ZSB3YnN0YXRl ID0gewotCQkuc3RyID0gc3JjLAotCQkubGVuID0gc3JjbGVuLAotCQkub2Zmc2V0ID0gMCwKLQkJ LnBvc2l4ID0gIWxvY2FsZS0+YnVpbHRpbi5jYXNlbWFwX2Z1bGwsCi0JCS5pbml0ID0gZmFsc2Us Ci0JCS5wcmV2X2FsbnVtID0gZmFsc2UsCisJCS5zdHIJCQkJCQkgPSBzcmMsCisJCS5sZW4JCQkJ CQkgPSBzcmNsZW4sCisJCS5vZmZzZXQJCQkJCQkgPSAwLAorCQkucG9zaXgJCQkJCQkgPSAhbG9j YWxlLT5idWlsdGluLmNhc2VtYXBfZnVsbCwKKwkJLmluaXQJCQkJCQkgPSBmYWxzZSwKKwkJLnBy ZXZfYWxudW0JCQkJCSA9IGZhbHNlLAogCX07CisJc2l6ZV90CWNvbnN1bWVkOworCXNpemVfdAly ZXN1bHQ7CisKKwlyZXN1bHQgPSB1bmljb2RlX3N0cnRpdGxlKGRlc3QsIGRlc3RzaXplLCBzcmMs IHNyY2xlbiwgJmNvbnN1bWVkLAorCQkJCQkJCSAgbG9jYWxlLT5idWlsdGluLmNhc2VtYXBfZnVs bCwKKwkJCQkJCQkgIGluaXRjYXBfd2JuZXh0LCAmd2JzdGF0ZSk7CiAKLQlwZ192ZXJpZnltYnN0 cihzcmMsIHNyY2xlbiwgZmFsc2UpOwotCXJldHVybiB1bmljb2RlX3N0cnRpdGxlKGRlc3QsIGRl c3RzaXplLCBzcmMsIHNyY2xlbiwKLQkJCQkJCQlsb2NhbGUtPmJ1aWx0aW4uY2FzZW1hcF9mdWxs LAotCQkJCQkJCWluaXRjYXBfd2JuZXh0LCAmd2JzdGF0ZSk7CisJaWYgKGNvbnN1bWVkIDwgc3Jj bGVuKQorCQlyZXBvcnRfaW52YWxpZF9lbmNvZGluZyhHZXREYXRhYmFzZUVuY29kaW5nKCksIHNy YyArIGNvbnN1bWVkLAorCQkJCQkJCQlzcmNsZW4gLSBjb25zdW1lZCk7CisKKwlyZXR1cm4gcmVz dWx0OwogfQogCiBzdGF0aWMgc2l6ZV90CiBzdHJ1cHBlcl9idWlsdGluKGNoYXIgKmRlc3QsIHNp emVfdCBkZXN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLAogCQkJCSBwZ19s b2NhbGVfdCBsb2NhbGUpCiB7Ci0JcGdfdmVyaWZ5bWJzdHIoc3JjLCBzcmNsZW4sIGZhbHNlKTsK LQlyZXR1cm4gdW5pY29kZV9zdHJ1cHBlcihkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sCi0J CQkJCQkJbG9jYWxlLT5idWlsdGluLmNhc2VtYXBfZnVsbCk7CisJc2l6ZV90CWNvbnN1bWVkOwor CXNpemVfdAlyZXN1bHQ7CisKKwlyZXN1bHQgPSB1bmljb2RlX3N0cnVwcGVyKGRlc3QsIGRlc3Rz aXplLCBzcmMsIHNyY2xlbiwgJmNvbnN1bWVkLAorCQkJCQkJCSAgbG9jYWxlLT5idWlsdGluLmNh c2VtYXBfZnVsbCk7CisJaWYgKGNvbnN1bWVkIDwgc3JjbGVuKQorCQlyZXBvcnRfaW52YWxpZF9l bmNvZGluZyhHZXREYXRhYmFzZUVuY29kaW5nKCksIHNyYyArIGNvbnN1bWVkLAorCQkJCQkJCQlz cmNsZW4gLSBjb25zdW1lZCk7CisKKwlyZXR1cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgc2l6ZV90 CiBzdHJmb2xkX2J1aWx0aW4oY2hhciAqZGVzdCwgc2l6ZV90IGRlc3RzaXplLCBjb25zdCBjaGFy ICpzcmMsIHNpemVfdCBzcmNsZW4sCiAJCQkJcGdfbG9jYWxlX3QgbG9jYWxlKQogewotCXBnX3Zl cmlmeW1ic3RyKHNyYywgc3JjbGVuLCBmYWxzZSk7Ci0JcmV0dXJuIHVuaWNvZGVfc3RyZm9sZChk ZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sCi0JCQkJCQkgICBsb2NhbGUtPmJ1aWx0aW4uY2Fz ZW1hcF9mdWxsKTsKKwlzaXplX3QJY29uc3VtZWQ7CisJc2l6ZV90CXJlc3VsdDsKKworCXJlc3Vs dCA9IHVuaWNvZGVfc3RyZm9sZChkZXN0LCBkZXN0c2l6ZSwgc3JjLCBzcmNsZW4sICZjb25zdW1l ZCwKKwkJCQkJCQkgbG9jYWxlLT5idWlsdGluLmNhc2VtYXBfZnVsbCk7CisJaWYgKGNvbnN1bWVk IDwgc3JjbGVuKQorCQlyZXBvcnRfaW52YWxpZF9lbmNvZGluZyhHZXREYXRhYmFzZUVuY29kaW5n KCksIHNyYyArIGNvbnN1bWVkLAorCQkJCQkJCQlzcmNsZW4gLSBjb25zdW1lZCk7CisKKwlyZXR1 cm4gcmVzdWx0OwogfQogCiBzdGF0aWMgYm9vbApkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi91bmlj b2RlL2Nhc2VfdGVzdC5jIGIvc3JjL2NvbW1vbi91bmljb2RlL2Nhc2VfdGVzdC5jCmluZGV4IGEw ZGJmMDBiNjcxLi5hZTBmODZmZmEwYyAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi91bmljb2RlL2Nh c2VfdGVzdC5jCisrKyBiL3NyYy9jb21tb24vdW5pY29kZS9jYXNlX3Rlc3QuYwpAQCAtMTE1LDYg KzExNSw3IEBAIGljdV90ZXN0X2Z1bGwoY2hhciAqc3RyKQogCWNoYXIJCWljdV9mb2xkW0JVRlNa XTsKIAlVRXJyb3JDb2RlCXN0YXR1czsKIAlzaXplX3QJCWxlbiA9IHN0cmxlbihzdHIpOworCXNp emVfdAkJY29uc3VtZWQ7CiAKIAkvKiBmdWxsIGNhc2UgbWFwcGluZyBkb2Vzbid0IHVzZSBwb3Np eCBzZW1hbnRpY3MgKi8KIAlzdHJ1Y3QgV29yZEJvdW5kYXJ5U3RhdGUgd2JzdGF0ZSA9IHsKQEAg LTEyNiwxMCArMTI3LDEwIEBAIGljdV90ZXN0X2Z1bGwoY2hhciAqc3RyKQogCQkucHJldl9hbG51 bSA9IGZhbHNlLAogCX07CiAKLQl1bmljb2RlX3N0cmxvd2VyKGxvd2VyLCBCVUZTWiwgc3RyLCBs ZW4sIHRydWUpOwotCXVuaWNvZGVfc3RydGl0bGUodGl0bGUsIEJVRlNaLCBzdHIsIGxlbiwgdHJ1 ZSwgaW5pdGNhcF93Ym5leHQsICZ3YnN0YXRlKTsKLQl1bmljb2RlX3N0cnVwcGVyKHVwcGVyLCBC VUZTWiwgc3RyLCBsZW4sIHRydWUpOwotCXVuaWNvZGVfc3RyZm9sZChmb2xkLCBCVUZTWiwgc3Ry LCBsZW4sIHRydWUpOworCXVuaWNvZGVfc3RybG93ZXIobG93ZXIsIEJVRlNaLCBzdHIsIGxlbiwg JmNvbnN1bWVkLCB0cnVlKTsKKwl1bmljb2RlX3N0cnRpdGxlKHRpdGxlLCBCVUZTWiwgc3RyLCBs ZW4sICZjb25zdW1lZCwgdHJ1ZSwgaW5pdGNhcF93Ym5leHQsICZ3YnN0YXRlKTsKKwl1bmljb2Rl X3N0cnVwcGVyKHVwcGVyLCBCVUZTWiwgc3RyLCBsZW4sICZjb25zdW1lZCwgdHJ1ZSk7CisJdW5p Y29kZV9zdHJmb2xkKGZvbGQsIEJVRlNaLCBzdHIsIGxlbiwgJmNvbnN1bWVkLCB0cnVlKTsKIAlz dGF0dXMgPSBVX1pFUk9fRVJST1I7CiAJdWNhc2VtYXBfdXRmOFRvTG93ZXIoY2FzZW1hcCwgaWN1 X2xvd2VyLCBCVUZTWiwgc3RyLCBsZW4sICZzdGF0dXMpOwogCXN0YXR1cyA9IFVfWkVST19FUlJP UjsKQEAgLTI2MCwxMyArMjYxLDE2IEBAIHN0YXRpYyBzaXplX3QKIHRmdW5jX2xvd2VyKGNoYXIg KmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKIAkJCXNpemVfdCBzcmNsZW4p CiB7Ci0JcmV0dXJuIHVuaWNvZGVfc3RybG93ZXIoZHN0LCBkc3RzaXplLCBzcmMsIHNyY2xlbiwg dHJ1ZSk7CisJc2l6ZV90CQljb25zdW1lZDsKKworCXJldHVybiB1bmljb2RlX3N0cmxvd2VyKGRz dCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sICZjb25zdW1lZCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyBz aXplX3QKIHRmdW5jX3RpdGxlKGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIg KnNyYywKIAkJCXNpemVfdCBzcmNsZW4pCiB7CisJc2l6ZV90CQljb25zdW1lZDsKIAlzdHJ1Y3Qg V29yZEJvdW5kYXJ5U3RhdGUgd2JzdGF0ZSA9IHsKIAkJLnN0ciA9IHNyYywKIAkJLmxlbiA9IHNy Y2xlbiwKQEAgLTI3NSwyNyArMjc5LDM0IEBAIHRmdW5jX3RpdGxlKGNoYXIgKmRzdCwgc2l6ZV90 IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKIAkJLnByZXZfYWxudW0gPSBmYWxzZSwKIAl9Owog Ci0JcmV0dXJuIHVuaWNvZGVfc3RydGl0bGUoZHN0LCBkc3RzaXplLCBzcmMsIHNyY2xlbiwgdHJ1 ZSwgaW5pdGNhcF93Ym5leHQsCi0JCQkJCQkJJndic3RhdGUpOworCXJldHVybiB1bmljb2RlX3N0 cnRpdGxlKGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sICZjb25zdW1lZCwgdHJ1ZSwKKwkJCQkJ CQlpbml0Y2FwX3dibmV4dCwgJndic3RhdGUpOwogfQogCiBzdGF0aWMgc2l6ZV90CiB0ZnVuY191 cHBlcihjaGFyICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCiAJCQlzaXpl X3Qgc3JjbGVuKQogewotCXJldHVybiB1bmljb2RlX3N0cnVwcGVyKGRzdCwgZHN0c2l6ZSwgc3Jj LCBzcmNsZW4sIHRydWUpOworCXNpemVfdAkJY29uc3VtZWQ7CisKKwlyZXR1cm4gdW5pY29kZV9z dHJ1cHBlcihkc3QsIGRzdHNpemUsIHNyYywgc3JjbGVuLCAmY29uc3VtZWQsIHRydWUpOwogfQog CiBzdGF0aWMgc2l6ZV90CiB0ZnVuY19mb2xkKGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNv bnN0IGNoYXIgKnNyYywKIAkJICAgc2l6ZV90IHNyY2xlbikKIHsKLQlyZXR1cm4gdW5pY29kZV9z dHJmb2xkKGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sIHRydWUpOworCXNpemVfdAkJY29uc3Vt ZWQ7CisKKwlyZXR1cm4gdW5pY29kZV9zdHJmb2xkKGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4s ICZjb25zdW1lZCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkCiB0ZXN0X2NvbnZlcnRfY2FzZSh2 b2lkKQogeworCXNpemVfdAkJbmVlZGVkOworCXNpemVfdAkJY29uc3VtZWQ7CisKIAkvKiB0ZXN0 IHN0cmluZyB3aXRoIG5vIGNhc2UgY2hhbmdlcyAqLwogCXRlc3RfY29udmVydCh0ZnVuY19sb3dl ciwgIuKImuKIniIsICLiiJriiJ4iKTsKIAkvKiB0ZXN0IGFkanVzdC10by1jYXNlZCBiZWhhdmlv ciAqLwpAQCAtMzIwLDYgKzMzMSwxMCBAQCB0ZXN0X2NvbnZlcnRfY2FzZSh2b2lkKQogCS8qIFUr RkYxMSBGVUxMV0lEVEggT05FIGlzIGFscGhhbnVtZXJpYyBmb3IgZnVsbCBjYXNlIG1hcHBpbmcg Ki8KIAl0ZXN0X2NvbnZlcnQodGZ1bmNfdGl0bGUsICJcdUZGMTFhIiwgIlx1RkYxMWEiKTsKIAor CS8qIGludmFsaWQgVVRGOCAqLworCW5lZWRlZCA9IHVuaWNvZGVfc3RyZm9sZChOVUxMLCAwLCAi YWJjXHhDRSIsIDQsICZjb25zdW1lZCwgZmFsc2UpOworCUFzc2VydChjb25zdW1lZCA9PSAzKTsK KwlBc3NlcnQobmVlZGVkID09IDMpOwogCiAjaWZkZWYgVVNFX0lDVQogCWljdV90ZXN0X2Z1bGwo IiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi91bmljb2RlX2Nhc2UuYyBiL3NyYy9jb21tb24v dW5pY29kZV9jYXNlLmMKaW5kZXggZDZlZTAwYjdkOWMuLjRhNjkyY2ZhMjQ5IDEwMDY0NAotLS0g YS9zcmMvY29tbW9uL3VuaWNvZGVfY2FzZS5jCisrKyBiL3NyYy9jb21tb24vdW5pY29kZV9jYXNl LmMKQEAgLTQwLDggKzQwLDggQEAgc3RhdGljIGNvbnN0IGNoYXIzMl90ICpjb25zdCBjYXNla2lu ZF9tYXBbTkNhc2VLaW5kXSA9CiAKIHN0YXRpYyBjaGFyMzJfdCBmaW5kX2Nhc2VfbWFwKGNoYXIz Ml90IHVjcywgY29uc3QgY2hhcjMyX3QgKm1hcCk7CiBzdGF0aWMgc2l6ZV90IGNvbnZlcnRfY2Fz ZShjaGFyICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNs ZW4sCi0JCQkJCQkgICBDYXNlS2luZCBzdHJfY2FzZWtpbmQsIGJvb2wgZnVsbCwgV29yZEJvdW5k YXJ5TmV4dCB3Ym5leHQsCi0JCQkJCQkgICB2b2lkICp3YnN0YXRlKTsKKwkJCQkJCSAgIHNpemVf dCAqcGNvbnN1bWVkLCBDYXNlS2luZCBzdHJfY2FzZWtpbmQsIGJvb2wgZnVsbCwKKwkJCQkJCSAg IFdvcmRCb3VuZGFyeU5leHQgd2JuZXh0LCB2b2lkICp3YnN0YXRlKTsKIHN0YXRpYyBlbnVtIENh c2VNYXBSZXN1bHQgY2FzZW1hcChjaGFyMzJfdCB1MSwgQ2FzZUtpbmQgY2FzZWtpbmQsIGJvb2wg ZnVsbCwKIAkJCQkJCQkJICBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sIHNpemVfdCBz cmNvZmYsCiAJCQkJCQkJCSAgY2hhcjMyX3QgKnNpbXBsZSwgY29uc3QgY2hhcjMyX3QgKipzcGVj aWFsKTsKQEAgLTgyLDcgKzgyLDggQEAgdW5pY29kZV9jYXNlZm9sZF9zaW1wbGUoY2hhcjMyX3Qg Y29kZSkKICAqIHVuaWNvZGVfc3RybG93ZXIoKQogICoKICAqIENvbnZlcnQgc3JjIHRvIGxvd2Vy Y2FzZSwgYW5kIHJldHVybiB0aGUgcmVzdWx0IGxlbmd0aCAobm90IGluY2x1ZGluZwotICogdGVy bWluYXRpbmcgTlVMKS4KKyAqIHRlcm1pbmF0aW5nIE5VTCkuIFNldHMgKnBjb25zdW1lZCB0byB0 aGUgYW1vdW50IG9mIHNyYyBzdWNjZXNzZnVsbHkKKyAqIGNvbnN1bWVkOyBpZiBsZXNzIHRoYW4g c3JjbGVuLCBpbmRpY2F0ZXMgYSBkZWNvZGluZyBlcnJvci4KICAqCiAgKiBTdHJpbmcgc3JjIG11 c3QgYmUgZW5jb2RlZCBpbiBVVEYtOC4KICAqCkBAIC05OCwxNyArOTksMTggQEAgdW5pY29kZV9j YXNlZm9sZF9zaW1wbGUoY2hhcjMyX3QgY29kZSkKICAqLwogc2l6ZV90CiB1bmljb2RlX3N0cmxv d2VyKGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNy Y2xlbiwKLQkJCQkgYm9vbCBmdWxsKQorCQkJCSBzaXplX3QgKnBjb25zdW1lZCwgYm9vbCBmdWxs KQogewotCXJldHVybiBjb252ZXJ0X2Nhc2UoZHN0LCBkc3RzaXplLCBzcmMsIHNyY2xlbiwgQ2Fz ZUxvd2VyLCBmdWxsLCBOVUxMLAotCQkJCQkJTlVMTCk7CisJcmV0dXJuIGNvbnZlcnRfY2FzZShk c3QsIGRzdHNpemUsIHNyYywgc3JjbGVuLCBwY29uc3VtZWQsIENhc2VMb3dlciwgZnVsbCwKKwkJ CQkJCU5VTEwsIE5VTEwpOwogfQogCiAvKgogICogdW5pY29kZV9zdHJ0aXRsZSgpCiAgKgogICog Q29udmVydCBzcmMgdG8gdGl0bGVjYXNlLCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgbGVuZ3RoIChu b3QgaW5jbHVkaW5nCi0gKiB0ZXJtaW5hdGluZyBOVUwpLgorICogdGVybWluYXRpbmcgTlVMKS4g U2V0cyAqcGNvbnN1bWVkIHRvIHRoZSBhbW91bnQgb2Ygc3JjIHN1Y2Nlc3NmdWxseQorICogY29u c3VtZWQ7IGlmIGxlc3MgdGhhbiBzcmNsZW4sIGluZGljYXRlcyBhIGRlY29kaW5nIGVycm9yLgog ICoKICAqIFN0cmluZyBzcmMgbXVzdCBiZSBlbmNvZGVkIGluIFVURi04LgogICoKQEAgLTEzNCwx NyArMTM2LDE5IEBAIHVuaWNvZGVfc3RybG93ZXIoY2hhciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwg Y29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLAogICovCiBzaXplX3QKIHVuaWNvZGVfc3Ry dGl0bGUoY2hhciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qg c3JjbGVuLAotCQkJCSBib29sIGZ1bGwsIFdvcmRCb3VuZGFyeU5leHQgd2JuZXh0LCB2b2lkICp3 YnN0YXRlKQorCQkJCSBzaXplX3QgKnBjb25zdW1lZCwgYm9vbCBmdWxsLCBXb3JkQm91bmRhcnlO ZXh0IHdibmV4dCwKKwkJCQkgdm9pZCAqd2JzdGF0ZSkKIHsKLQlyZXR1cm4gY29udmVydF9jYXNl KGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sIENhc2VUaXRsZSwgZnVsbCwgd2JuZXh0LAotCQkJ CQkJd2JzdGF0ZSk7CisJcmV0dXJuIGNvbnZlcnRfY2FzZShkc3QsIGRzdHNpemUsIHNyYywgc3Jj bGVuLCBwY29uc3VtZWQsIENhc2VUaXRsZSwgZnVsbCwKKwkJCQkJCXdibmV4dCwgd2JzdGF0ZSk7 CiB9CiAKIC8qCiAgKiB1bmljb2RlX3N0cnVwcGVyKCkKICAqCiAgKiBDb252ZXJ0IHNyYyB0byB1 cHBlcmNhc2UsIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBsZW5ndGggKG5vdCBpbmNsdWRpbmcKLSAq IHRlcm1pbmF0aW5nIE5VTCkuCisgKiB0ZXJtaW5hdGluZyBOVUwpLiBTZXRzICpwY29uc3VtZWQg dG8gdGhlIGFtb3VudCBvZiBzcmMgc3VjY2Vzc2Z1bGx5CisgKiBjb25zdW1lZDsgaWYgbGVzcyB0 aGFuIHNyY2xlbiwgaW5kaWNhdGVzIGEgZGVjb2RpbmcgZXJyb3IuCiAgKgogICogU3RyaW5nIHNy YyBtdXN0IGJlIGVuY29kZWQgaW4gVVRGLTguCiAgKgpAQCAtMTYwLDE3ICsxNjQsMTggQEAgdW5p Y29kZV9zdHJ0aXRsZShjaGFyICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMs IHNpemVfdCBzcmNsZW4sCiAgKi8KIHNpemVfdAogdW5pY29kZV9zdHJ1cHBlcihjaGFyICpkc3Qs IHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sCi0JCQkJIGJv b2wgZnVsbCkKKwkJCQkgc2l6ZV90ICpwY29uc3VtZWQsIGJvb2wgZnVsbCkKIHsKLQlyZXR1cm4g Y29udmVydF9jYXNlKGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sIENhc2VVcHBlciwgZnVsbCwg TlVMTCwKLQkJCQkJCU5VTEwpOworCXJldHVybiBjb252ZXJ0X2Nhc2UoZHN0LCBkc3RzaXplLCBz cmMsIHNyY2xlbiwgcGNvbnN1bWVkLCBDYXNlVXBwZXIsIGZ1bGwsCisJCQkJCQlOVUxMLCBOVUxM KTsKIH0KIAogLyoKICAqIHVuaWNvZGVfc3RyZm9sZCgpCiAgKgogICogQ2FzZSBmb2xkIHNyYywg YW5kIHJldHVybiB0aGUgcmVzdWx0IGxlbmd0aCAobm90IGluY2x1ZGluZyB0ZXJtaW5hdGluZwot ICogTlVMKS4KKyAqIE5VTCkuIFNldHMgKnBjb25zdW1lZCB0byB0aGUgYW1vdW50IG9mIHNyYyBz dWNjZXNzZnVsbHkgY29uc3VtZWQ7IGlmIGxlc3MKKyAqIHRoYW4gc3JjbGVuLCBpbmRpY2F0ZXMg YSBkZWNvZGluZyBlcnJvci4KICAqCiAgKiBTdHJpbmcgc3JjIG11c3QgYmUgZW5jb2RlZCBpbiBV VEYtOC4KICAqCkBAIC0xODMsMTAgKzE4OCwyNiBAQCB1bmljb2RlX3N0cnVwcGVyKGNoYXIgKmRz dCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbiwKICAqLwog c2l6ZV90CiB1bmljb2RlX3N0cmZvbGQoY2hhciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwgY29uc3Qg Y2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLAotCQkJCWJvb2wgZnVsbCkKKwkJCQlzaXplX3QgKnBj b25zdW1lZCwgYm9vbCBmdWxsKQogewotCXJldHVybiBjb252ZXJ0X2Nhc2UoZHN0LCBkc3RzaXpl LCBzcmMsIHNyY2xlbiwgQ2FzZUZvbGQsIGZ1bGwsIE5VTEwsCi0JCQkJCQlOVUxMKTsKKwlyZXR1 cm4gY29udmVydF9jYXNlKGRzdCwgZHN0c2l6ZSwgc3JjLCBzcmNsZW4sIHBjb25zdW1lZCwgQ2Fz ZUZvbGQsIGZ1bGwsCisJCQkJCQlOVUxMLCBOVUxMKTsKK30KKworLyogbG9jYWwgdmVyc2lvbiBv ZiBwZ191dGZfbWJsZW4oKSB0byBiZSBpbmxpbmFibGUgKi8KK3N0YXRpYyBpbnQKK3V0ZjhfbWJs ZW4oY29uc3QgdW5zaWduZWQgY2hhciAqcykKK3sKKwlpZiAoKCpzICYgMHg4MCkgPT0gMCkKKwkJ cmV0dXJuIDE7CisJZWxzZSBpZiAoKCpzICYgMHhlMCkgPT0gMHhjMCkKKwkJcmV0dXJuIDI7CisJ ZWxzZSBpZiAoKCpzICYgMHhmMCkgPT0gMHhlMCkKKwkJcmV0dXJuIDM7CisJZWxzZSBpZiAoKCpz ICYgMHhmOCkgPT0gMHhmMCkKKwkJcmV0dXJuIDQ7CisJZWxzZQorCQlyZXR1cm4gLTE7CiB9CiAK IC8qCkBAIC0yMDcsOCArMjI4LDggQEAgdW5pY29kZV9zdHJmb2xkKGNoYXIgKmRzdCwgc2l6ZV90 IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNyY2xlbiwKICAqLwogc3RhdGljIHNp emVfdAogY29udmVydF9jYXNlKGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIg KnNyYywgc2l6ZV90IHNyY2xlbiwKLQkJCSBDYXNlS2luZCBzdHJfY2FzZWtpbmQsIGJvb2wgZnVs bCwgV29yZEJvdW5kYXJ5TmV4dCB3Ym5leHQsCi0JCQkgdm9pZCAqd2JzdGF0ZSkKKwkJCSBzaXpl X3QgKnBjb25zdW1lZCwgQ2FzZUtpbmQgc3RyX2Nhc2VraW5kLCBib29sIGZ1bGwsCisJCQkgV29y ZEJvdW5kYXJ5TmV4dCB3Ym5leHQsIHZvaWQgKndic3RhdGUpCiB7CiAJLyogY2hhcmFjdGVyIENh c2VLaW5kIHZhcmllcyB3aGlsZSB0aXRsZWNhc2luZyAqLwogCUNhc2VLaW5kCWNocl9jYXNla2lu ZCA9IHN0cl9jYXNla2luZDsKQEAgLTIyNywxMiArMjQ4LDE4IEBAIGNvbnZlcnRfY2FzZShjaGFy ICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sCiAK IAl3aGlsZSAoc3Jjb2ZmIDwgc3JjbGVuKQogCXsKLQkJY2hhcjMyX3QJdTEgPSB1dGY4X3RvX3Vu aWNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3JjICsgc3Jjb2ZmKTsKLQkJaW50CQkJdTFs ZW4gPSB1bmljb2RlX3V0ZjhsZW4odTEpOworCQlpbnQJCQl1MWxlbiA9IHV0ZjhfbWJsZW4oKGNv bnN0IHVuc2lnbmVkIGNoYXIgKikgc3JjICsgc3Jjb2ZmKTsKKwkJY2hhcjMyX3QJdTE7CiAJCWNo YXIzMl90CXNpbXBsZSA9IDA7CiAJCWNvbnN0IGNoYXIzMl90ICpzcGVjaWFsID0gTlVMTDsKIAkJ ZW51bSBDYXNlTWFwUmVzdWx0IGNhc2VtYXBfcmVzdWx0OwogCisJCS8qIGludmFsaWQgVVRGOCAq LworCQlpZiAodTFsZW4gPCAwIHx8IHNyY29mZiArIHUxbGVuID4gc3JjbGVuKQorCQkJYnJlYWs7 CisKKwkJdTEgPSB1dGY4X3RvX3VuaWNvZGUoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3JjICsg c3Jjb2ZmKTsKKwogCQlpZiAoc3RyX2Nhc2VraW5kID09IENhc2VUaXRsZSkKIAkJewogCQkJaWYg KHNyY29mZiA9PSBib3VuZGFyeSkKQEAgLTI5Myw2ICszMjAsNyBAQCBjb252ZXJ0X2Nhc2UoY2hh ciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLAog CWlmIChyZXN1bHRfbGVuIDwgZHN0c2l6ZSkKIAkJZHN0W3Jlc3VsdF9sZW5dID0gJ1wwJzsKIAor CSpwY29uc3VtZWQgPSBzcmNvZmY7CiAJcmV0dXJuIHJlc3VsdF9sZW47CiB9CiAKQEAgLTMxNiw3 ICszNDQsMTQgQEAgY2hlY2tfZmluYWxfc2lnbWEoY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBz aXplX3QgbGVuLCBzaXplX3Qgb2Zmc2V0KQogCXsKIAkJaWYgKChzdHJbaV0gJiAweDgwKSA9PSAw IHx8IChzdHJbaV0gJiAweEMwKSA9PSAweEMwKQogCQl7Ci0JCQljaGFyMzJfdAljdXJyID0gdXRm OF90b191bmljb2RlKHN0ciArIGkpOworCQkJaW50CQkJdTFsZW4gPSB1dGY4X21ibGVuKChjb25z dCB1bnNpZ25lZCBjaGFyICopIHN0ciArIGkpOworCQkJY2hhcjMyX3QJY3VycjsKKworCQkJLyog aW52YWxpZCBVVEY4ICovCisJCQlpZiAodTFsZW4gPCAwIHx8IGkgKyB1MWxlbiA+IGxlbikKKwkJ CQlyZXR1cm4gZmFsc2U7CisKKwkJCWN1cnIgPSB1dGY4X3RvX3VuaWNvZGUoc3RyICsgaSk7CiAK IAkJCWlmIChwZ191X3Byb3BfY2FzZV9pZ25vcmFibGUoY3VycikpCiAJCQkJY29udGludWU7CkBA IC0zMjcsOCArMzYyLDYgQEAgY2hlY2tfZmluYWxfc2lnbWEoY29uc3QgdW5zaWduZWQgY2hhciAq c3RyLCBzaXplX3QgbGVuLCBzaXplX3Qgb2Zmc2V0KQogCQl9CiAJCWVsc2UgaWYgKChzdHJbaV0g JiAweEMwKSA9PSAweDgwKQogCQkJY29udGludWU7Ci0KLQkJQXNzZXJ0KGZhbHNlKTsJCQkvKiBp bnZhbGlkIFVURi04ICovCiAJfQogCiAJLyogZW5kIG9mIHN0cmluZyBpcyBub3QgZm9sbG93ZWQg YnkgYSBDYXNlZCBjaGFyYWN0ZXIgKi8KQEAgLTM0MCw3ICszNzMsMTQgQEAgY2hlY2tfZmluYWxf c2lnbWEoY29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBzaXplX3Qgb2Zmc2V0 KQogCXsKIAkJaWYgKChzdHJbaV0gJiAweDgwKSA9PSAwIHx8IChzdHJbaV0gJiAweEMwKSA9PSAw eEMwKQogCQl7Ci0JCQljaGFyMzJfdAljdXJyID0gdXRmOF90b191bmljb2RlKHN0ciArIGkpOwor CQkJaW50CQkJdTFsZW4gPSB1dGY4X21ibGVuKChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0ciAr IGkpOworCQkJY2hhcjMyX3QJY3VycjsKKworCQkJLyogaW52YWxpZCBVVEY4ICovCisJCQlpZiAo dTFsZW4gPCAwIHx8IGkgKyB1MWxlbiA+IGxlbikKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCWN1 cnIgPSB1dGY4X3RvX3VuaWNvZGUoc3RyICsgaSk7CiAKIAkJCWlmIChwZ191X3Byb3BfY2FzZV9p Z25vcmFibGUoY3VycikpCiAJCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9j b21tb24vdW5pY29kZV9jYXNlLmggYi9zcmMvaW5jbHVkZS9jb21tb24vdW5pY29kZV9jYXNlLmgK aW5kZXggMDNhZGQ3OGNhYmUuLjFjYmMwYzE0YmMyIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9j b21tb24vdW5pY29kZV9jYXNlLmgKKysrIGIvc3JjL2luY2x1ZGUvY29tbW9uL3VuaWNvZGVfY2Fz ZS5oCkBAIC0yMSwxMyArMjEsMTMgQEAgY2hhcjMyX3QJdW5pY29kZV90aXRsZWNhc2Vfc2ltcGxl KGNoYXIzMl90IGNvZGUpOwogY2hhcjMyX3QJdW5pY29kZV91cHBlcmNhc2Vfc2ltcGxlKGNoYXIz Ml90IGNvZGUpOwogY2hhcjMyX3QJdW5pY29kZV9jYXNlZm9sZF9zaW1wbGUoY2hhcjMyX3QgY29k ZSk7CiBzaXplX3QJCXVuaWNvZGVfc3RybG93ZXIoY2hhciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwg Y29uc3QgY2hhciAqc3JjLAotCQkJCQkJCSBzaXplX3Qgc3JjbGVuLCBib29sIGZ1bGwpOworCQkJ CQkJCSBzaXplX3Qgc3JjbGVuLCBzaXplX3QgKnBjb25zdW1lZCwgYm9vbCBmdWxsKTsKIHNpemVf dAkJdW5pY29kZV9zdHJ0aXRsZShjaGFyICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFy ICpzcmMsCi0JCQkJCQkJIHNpemVfdCBzcmNsZW4sIGJvb2wgZnVsbCwKKwkJCQkJCQkgc2l6ZV90 IHNyY2xlbiwgc2l6ZV90ICpwY29uc3VtZWQsIGJvb2wgZnVsbCwKIAkJCQkJCQkgV29yZEJvdW5k YXJ5TmV4dCB3Ym5leHQsIHZvaWQgKndic3RhdGUpOwogc2l6ZV90CQl1bmljb2RlX3N0cnVwcGVy KGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNyYywKLQkJCQkJCQkgc2l6 ZV90IHNyY2xlbiwgYm9vbCBmdWxsKTsKKwkJCQkJCQkgc2l6ZV90IHNyY2xlbiwgc2l6ZV90ICpw Y29uc3VtZWQsIGJvb2wgZnVsbCk7CiBzaXplX3QJCXVuaWNvZGVfc3RyZm9sZChjaGFyICpkc3Qs IHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsCi0JCQkJCQkJc2l6ZV90IHNyY2xlbiwg Ym9vbCBmdWxsKTsKKwkJCQkJCQlzaXplX3Qgc3JjbGVuLCBzaXplX3QgKnBjb25zdW1lZCwgYm9v bCBmdWxsKTsKIAogI2VuZGlmCQkJCQkJCS8qIFVOSUNPREVfQ0FTRV9IICovCi0tIAoyLjQzLjAK Cg== --=-5z+XxYkpXZAwW1gIG2bP Content-Disposition: attachment; filename*0=v3-0003-Validating-iterator-friendly-UTF8-encoder-decoder.pat; filename*1=ch Content-Type: text/x-patch; name="v3-0003-Validating-iterator-friendly-UTF8-encoder-decoder.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSBiYTU4MmZjYjY1M2QyNzExMDY3NTgzMWYyOWIzYjA4ODYwOWMwMmZmIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBU aHUsIDQgSnVuIDIwMjYgMTI6MDg6NTEgLTA3MDAKU3ViamVjdDogW1BBVENIIHYzIDMvNF0gVmFs aWRhdGluZywgaXRlcmF0b3ItZnJpZW5kbHkgVVRGOCBlbmNvZGVyL2RlY29kZXIKIEFQSS4KClJl dmlld2VkLWJ5OiBDaGFvIExpIDxsaS5ldmFuLmNoYW9AZ21haWwuY29tPgpEaXNjdXNzaW9uOiBo dHRwczovL3Bvc3Rnci5lcy9tL2MzNTUzNTRlNmMzZjRhN2FhZmIwNDczNjFiNzNkYjI0NzI2MGZj YTAuY2FtZWxAai1kYXZpcy5jb20KLS0tCiBzcmMvaW5jbHVkZS9tYi9wZ193Y2hhci5oIHwgMTYw ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystCiAxIGZpbGUgY2hhbmdlZCwg MTU4IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvbWIvcGdfd2NoYXIuaCBiL3NyYy9pbmNsdWRlL21iL3BnX3djaGFyLmgKaW5kZXggZGVlZTJh ODMyYzMuLmQ4ZWE3N2MzZmUwIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9tYi9wZ193Y2hhci5o CisrKyBiL3NyYy9pbmNsdWRlL21iL3BnX3djaGFyLmgKQEAgLTI3LDYgKzI3LDExIEBACiAgKi8K IHR5cGVkZWYgdW5zaWduZWQgaW50IHBnX3djaGFyOwogCisvKgorICogUmV0dXJuZWQgZm9yIGRl Y29kaW5nIGZhaWx1cmVzIGluIHV0ZjhkZWNvZGUoKSBhbmQgdXRmOF90b191bmljb2RlKCkuCisg Ki8KKyNkZWZpbmUgUEdfSU5WQUxJRF9DT0RFUE9JTlQJMHhGRkZGRkZGRgorCiAvKgogICogTWF4 aW11bSBieXRlIGxlbmd0aCBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiBhbnkgYmFja2VuZCBl bmNvZGluZwogICovCkBAIC0zOTIsMTEgKzM5NywxNjEgQEAgc3Vycm9nYXRlX3BhaXJfdG9fY29k ZXBvaW50KGNoYXIxNl90IGZpcnN0LCBjaGFyMTZfdCBzZWNvbmQpCiAJcmV0dXJuICgoZmlyc3Qg JiAweDNGRikgPDwgMTApICsgMHgxMDAwMCArIChzZWNvbmQgJiAweDNGRik7CiB9CiAKKy8qCisg KiBFbmNvZGUgdGhlIGNvZGVwb2ludCBhcyBVVEY4IGFuZCByZXR1cm4gdGhlIG51bWJlciBvZiBi eXRlcyByZXF1aXJlZC4gSWYKKyAqIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgZXhjZWVk cyBkc3RzaXplLCBqdXN0IHJldHVybiB0aGUgbnVtYmVyIG9mCisgKiBieXRlcyByZXF1aXJlZCB3 aXRob3V0IG1vZGlmeWluZyBkc3QuIElmIGRzdHNpemUgaXMgemVybywgZHN0IG1heSBiZQorICog TlVMTC4gSWYgY29kZXBvaW50IGlzIG5vdCBhIHZhbGlkIFVuaWNvZGUgU2NhbGFyLCByZXR1cm4g LTEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit1dGY4ZW5jb2RlKHVuc2lnbmVkIGNoYXIgKmRz dCwgc2l6ZV90IGRzdHNpemUsIGNoYXIzMl90IGNvZGVwb2ludCkKK3sKKwlpbnQJCQluYnl0ZXM7 CisKKwlpZiAoY29kZXBvaW50IDw9IDB4N0YpCisJCW5ieXRlcyA9IDE7CisJZWxzZSBpZiAoY29k ZXBvaW50IDw9IDB4N0ZGKQorCQluYnl0ZXMgPSAyOworCWVsc2UgaWYgKGNvZGVwb2ludCA8PSAw eEZGRkYpCisJeworCQkvKiBzdXJyb2dhdGUgaGFsdmVzIG5vdCB2YWxpZCBmb3IgVVRGOCAqLwor CQlpZiAoY29kZXBvaW50ID49IDB4RDgwMCAmJiBjb2RlcG9pbnQgPD0gMHhERkZGKQorCQkJcmV0 dXJuIC0xOworCQluYnl0ZXMgPSAzOworCX0KKwllbHNlIGlmIChjb2RlcG9pbnQgPD0gMHgxMEZG RkYpCisJCW5ieXRlcyA9IDQ7CisJZWxzZQorCQlyZXR1cm4gLTE7CisKKwlpZiAobmJ5dGVzID4g ZHN0c2l6ZSkKKwkJcmV0dXJuIG5ieXRlczsKKworCWlmIChjb2RlcG9pbnQgPD0gMHg3RikKKwl7 CisJCWRzdFswXSA9IGNvZGVwb2ludDsKKwl9CisJZWxzZSBpZiAoY29kZXBvaW50IDw9IDB4N0ZG KQorCXsKKwkJZHN0WzBdID0gMHhDMCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgxRik7CisJCWRz dFsxXSA9IDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRik7CisJfQorCWVsc2UgaWYgKGNvZGVwb2lu dCA8PSAweEZGRkYpCisJeworCQlkc3RbMF0gPSAweEUwIHwgKChjb2RlcG9pbnQgPj4gMTIpICYg MHgwRik7CisJCWRzdFsxXSA9IDB4ODAgfCAoKGNvZGVwb2ludCA+PiA2KSAmIDB4M0YpOworCQlk c3RbMl0gPSAweDgwIHwgKGNvZGVwb2ludCAmIDB4M0YpOworCX0KKwllbHNlIGlmIChjb2RlcG9p bnQgPD0gMHgxMEZGRkYpCisJeworCQlkc3RbMF0gPSAweEYwIHwgKChjb2RlcG9pbnQgPj4gMTgp ICYgMHgwNyk7CisJCWRzdFsxXSA9IDB4ODAgfCAoKGNvZGVwb2ludCA+PiAxMikgJiAweDNGKTsK KwkJZHN0WzJdID0gMHg4MCB8ICgoY29kZXBvaW50ID4+IDYpICYgMHgzRik7CisJCWRzdFszXSA9 IDB4ODAgfCAoY29kZXBvaW50ICYgMHgzRik7CisJfQorCisJcmV0dXJuIG5ieXRlczsKK30KKwor LyoKKyAqIERlY29kZSB0aGUgbmV4dCBVbmljb2RlIGNvZGVwb2ludCBmcm9tIFVURjggYXQgc3Jj LCByZWFkaW5nIG5vIG1vcmUgdGhhbgorICogc3JjbGVuIGJ5dGVzICh3aGljaCBtdXN0IGJlIGF0 IGxlYXN0IDEpLiBPbiBzdWNjZXNzLCAqcGNvZGVwb2ludCB3aWxsIGJlIGEKKyAqIHZhbGlkIFVu aWNvZGUgU2NhbGFyOyBvdGhlcndpc2UgaXQgd2lsbCBiZSBzZXQgdG8gUEdfSU5WQUxJRF9DT0RF UE9JTlQuCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkLiBJZiBz cmNsZW4gaXMgbm90IGxhcmdlIGVub3VnaAorICogKGkuZS4gc3JjIGlzIHRydW5jYXRlZCBpbiB0 aGUgbWlkZGxlIG9mIGEgc2VxdWVuY2UpLCByZXR1cm5zIDAuIElmIGludmFsaWQsCisgKiByZXR1 cm5zIC0xLgorICovCitzdGF0aWMgaW5saW5lIGludAordXRmOGRlY29kZShjaGFyMzJfdCAqcGNv ZGVwb2ludCwgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuKQoreworCWlu dAkJCW5ieXRlczsKKwljaGFyMzJfdAljb2RlcG9pbnQ7CisKKwlBc3NlcnQoc3JjbGVuID49IDEp OworCisJaWYgKCgqc3JjICYgMHg4MCkgPT0gMCkKKwl7CisJCSpwY29kZXBvaW50ID0gKGNoYXIz Ml90KSBzcmNbMF07CisJCXJldHVybiAxOworCX0KKworCWlmICgoKnNyYyAmIDB4ZTApID09IDB4 YzApCisJCW5ieXRlcyA9IDI7CisJZWxzZSBpZiAoKCpzcmMgJiAweGYwKSA9PSAweGUwKQorCQlu Ynl0ZXMgPSAzOworCWVsc2UgaWYgKCgqc3JjICYgMHhmOCkgPT0gMHhmMCkKKwkJbmJ5dGVzID0g NDsKKwllbHNlCisJCWdvdG8gaW52YWxpZDsKKworCS8qIHRydW5jYXRlZCAqLworCWlmIChzcmNs ZW4gPCBuYnl0ZXMpCisJeworCQkqcGNvZGVwb2ludCA9IFBHX0lOVkFMSURfQ09ERVBPSU5UOwor CQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobmJ5dGVzID09IDIpCisJeworCQkvKiBjaGVjayBjb250 aW51YXRpb24gYnl0ZSAqLworCQlpZiAoKHNyY1sxXSAmIDB4YzApICE9IDB4ODApCisJCQlnb3Rv IGludmFsaWQ7CisKKwkJY29kZXBvaW50ID0gKGNoYXIzMl90KSAoKChzcmNbMF0gJiAweDFmKSA8 PCA2KSB8CisJCQkJCQkJCShzcmNbMV0gJiAweDNmKSk7CisKKwkJLyogb3ZlcmxvbmcgKi8KKwkJ aWYgKGNvZGVwb2ludCA8IDB4MDA4MCkKKwkJCWdvdG8gaW52YWxpZDsKKwl9CisJZWxzZSBpZiAo bmJ5dGVzID09IDMpCisJeworCQkvKiBjaGVjayBjb250aW51YXRpb24gYnl0ZXMgKi8KKwkJaWYg KChzcmNbMV0gJiAweGMwKSAhPSAweDgwIHx8IChzcmNbMl0gJiAweGMwKSAhPSAweDgwKQorCQkJ Z290byBpbnZhbGlkOworCisJCWNvZGVwb2ludCA9IChjaGFyMzJfdCkgKCgoc3JjWzBdICYgMHgw ZikgPDwgMTIpIHwKKwkJCQkJCQkJKChzcmNbMV0gJiAweDNmKSA8PCA2KSB8CisJCQkJCQkJCShz cmNbMl0gJiAweDNmKSk7CisKKwkJLyogb3Zlcmxvbmcgb3Igc3Vycm9nYXRlIGhhbGYgKi8KKwkJ aWYgKGNvZGVwb2ludCA8IDB4MDgwMCB8fAorCQkJKGNvZGVwb2ludCA+PSAweEQ4MDAgJiYgY29k ZXBvaW50IDw9IDB4REZGRikpCisJCQlnb3RvIGludmFsaWQ7CisJfQorCWVsc2UgaWYgKG5ieXRl cyA9PSA0KQorCXsKKwkJLyogY2hlY2sgY29udGludWF0aW9uIGJ5dGVzICovCisJCWlmICgoc3Jj WzFdICYgMHhjMCkgIT0gMHg4MCB8fCAoc3JjWzJdICYgMHhjMCkgIT0gMHg4MCB8fAorCQkJKHNy Y1szXSAmIDB4YzApICE9IDB4ODApCisJCQlnb3RvIGludmFsaWQ7CisKKwkJY29kZXBvaW50ID0g KGNoYXIzMl90KSAoKChzcmNbMF0gJiAweDA3KSA8PCAxOCkgfAorCQkJCQkJCQkoKHNyY1sxXSAm IDB4M2YpIDw8IDEyKSB8CisJCQkJCQkJCSgoc3JjWzJdICYgMHgzZikgPDwgNikgfAorCQkJCQkJ CQkoc3JjWzNdICYgMHgzZikpOworCisJCS8qIG92ZXJsb25nIG9yIG91dC1vZi1yYW5nZSAqLwor CQlpZiAoY29kZXBvaW50IDwgMHgxMDAwMCB8fCBjb2RlcG9pbnQgPiAweDEwRkZGRikKKwkJCWdv dG8gaW52YWxpZDsKKwl9CisKKwkqcGNvZGVwb2ludCA9IGNvZGVwb2ludDsKKwlyZXR1cm4gbmJ5 dGVzOworCitpbnZhbGlkOgorCSpwY29kZXBvaW50ID0gUEdfSU5WQUxJRF9DT0RFUE9JTlQ7CisJ cmV0dXJuIC0xOworfQorCiAvKgogICogQ29udmVydCBhIFVURi04IGNoYXJhY3RlciB0byBhIFVu aWNvZGUgY29kZSBwb2ludC4KICAqIFRoaXMgaXMgYSBvbmUtY2hhcmFjdGVyIHZlcnNpb24gb2Yg cGdfdXRmMndjaGFyX3dpdGhfbGVuLgogICoKICAqIE5vIGVycm9yIGNoZWNrcyBoZXJlLCBjIG11 c3QgcG9pbnQgdG8gYSBsb25nLWVub3VnaCBzdHJpbmcuCisgKgorICogWFhYOiBDYWxsZXJzIHNo b3VsZCBjb25zaWRlciB1dGY4ZGVjb2RlKCkgaW5zdGVhZC4KICAqLwogc3RhdGljIGlubGluZSBj aGFyMzJfdAogdXRmOF90b191bmljb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmMpCkBAIC00MTYs MTMgKzU3MSwxNCBAQCB1dGY4X3RvX3VuaWNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqYykKIAkJ CQkJCSAgICgoY1syXSAmIDB4M2YpIDw8IDYpIHwKIAkJCQkJCSAgIChjWzNdICYgMHgzZikpOwog CWVsc2UKLQkJLyogdGhhdCBpcyBhbiBpbnZhbGlkIGNvZGUgb24gcHVycG9zZSAqLwotCQlyZXR1 cm4gMHhmZmZmZmZmZjsKKwkJcmV0dXJuIFBHX0lOVkFMSURfQ09ERVBPSU5UOwogfQogCiAvKgog ICogTWFwIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIFVURi04LiAgdXRmOHN0cmluZyBtdXN0IGhh dmUgYXQgbGVhc3QKICAqIHVuaWNvZGVfdXRmOGxlbihjKSBieXRlcyBhdmFpbGFibGUuCisgKgor ICogWFhYOiBDYWxsZXJzIHNob3VsZCBjb25zaWRlciB1dGY4ZW5jb2RlKCkgaW5zdGVhZC4KICAq Lwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICoKIHVuaWNvZGVfdG9fdXRmOChjaGFyMzJf dCBjLCB1bnNpZ25lZCBjaGFyICp1dGY4c3RyaW5nKQotLSAKMi40My4wCgo= --=-5z+XxYkpXZAwW1gIG2bP Content-Disposition: attachment; filename*0=v3-0004-unicode_case.c-use-new-utf8encode-utf8decode-APIs.pat; filename*1=ch Content-Type: text/x-patch; name="v3-0004-unicode_case.c-use-new-utf8encode-utf8decode-APIs.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSA5NDJmMzc0YTQzODM1MDJjYmI2NmQwZDgzZjBiYTMxNzk2MmE5YTI0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBG cmksIDE5IEp1biAyMDI2IDE0OjU4OjQ3IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2MyA0LzRdIHVu aWNvZGVfY2FzZS5jOiB1c2UgbmV3IHV0ZjhlbmNvZGUvdXRmOGRlY29kZSBBUElzLgoKUmV2aWV3 ZWQtYnk6IENoYW8gTGkgPGxpLmV2YW4uY2hhb0BnbWFpbC5jb20+CkRpc2N1c3Npb246IGh0dHBz Oi8vcG9zdGdyLmVzL20vYzM1NTM1NGU2YzNmNGE3YWFmYjA0NzM2MWI3M2RiMjQ3MjYwZmNhMC5j YW1lbEBqLWRhdmlzLmNvbQotLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9wZ19sb2NhbGVfYnVp bHRpbi5jIHwgMTcgKysrLS0tCiBzcmMvY29tbW9uL3VuaWNvZGUvY2FzZV90ZXN0LmMgICAgICAg ICAgICB8ICAyICstCiBzcmMvY29tbW9uL3VuaWNvZGVfY2FzZS5jICAgICAgICAgICAgICAgICB8 IDcwICsrKysrKysrKysrLS0tLS0tLS0tLS0tCiAzIGZpbGVzIGNoYW5nZWQsIDQ0IGluc2VydGlv bnMoKyksIDQ1IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9wZ19sb2NhbGVfYnVpbHRpbi5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3BnX2xvY2FsZV9i dWlsdGluLmMKaW5kZXggOTZkYTljNmZjZjMuLmE4MjZlYzFjZmE4IDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC91dGlscy9hZHQvcGdfbG9jYWxlX2J1aWx0aW4uYworKysgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvcGdfbG9jYWxlX2J1aWx0aW4uYwpAQCAtNjIsMjUgKzYyLDI2IEBAIGluaXRjYXBf d2JuZXh0KHZvaWQgKnN0YXRlKQogCiAJd2hpbGUgKHdic3RhdGUtPm9mZnNldCA8IHdic3RhdGUt PmxlbikKIAl7Ci0JCWludAkJCXVsZW4gPSBwZ191dGZfbWJsZW4oKGNvbnN0IHVuc2lnbmVkIGNo YXIgKikgd2JzdGF0ZS0+c3RyICsKLQkJCQkJCQkJCQl3YnN0YXRlLT5vZmZzZXQpOworCQlpbnQJ CQl1bGVuOwogCQljaGFyMzJfdAl1OwogCQlib29sCQljdXJyX2FsbnVtOworCQlzaXplX3QJCXBy ZXZfb2Zmc2V0ID0gd2JzdGF0ZS0+b2Zmc2V0OwogCi0JCWlmICh3YnN0YXRlLT5vZmZzZXQgKyB1 bGVuID4gd2JzdGF0ZS0+bGVuKQorCQl1bGVuID0gdXRmOGRlY29kZSgmdSwgKGNvbnN0IHVuc2ln bmVkIGNoYXIgKikgd2JzdGF0ZS0+c3RyICsgd2JzdGF0ZS0+b2Zmc2V0LAorCQkJCQkJICB3YnN0 YXRlLT5sZW4gLSB3YnN0YXRlLT5vZmZzZXQpOworCisJCS8qIGludmFsaWQgVVRGOCAqLworCQlp ZiAodWxlbiA8PSAwKQogCQl7CisJCQl3YnN0YXRlLT5pbml0ID0gdHJ1ZTsKIAkJCXdic3RhdGUt Pm9mZnNldCA9IHdic3RhdGUtPmxlbjsKLQkJCXJldHVybiB3YnN0YXRlLT5sZW47CisJCQlyZXR1 cm4gcHJldl9vZmZzZXQ7CiAJCX0KIAotCQl1ID0gdXRmOF90b191bmljb2RlKChjb25zdCB1bnNp Z25lZCBjaGFyICopIHdic3RhdGUtPnN0ciArCi0JCQkJCQkJd2JzdGF0ZS0+b2Zmc2V0KTsKIAkJ Y3Vycl9hbG51bSA9IHBnX3VfaXNhbG51bSh1LCB3YnN0YXRlLT5wb3NpeCk7CiAKIAkJaWYgKCF3 YnN0YXRlLT5pbml0IHx8IGN1cnJfYWxudW0gIT0gd2JzdGF0ZS0+cHJldl9hbG51bSkKIAkJewot CQkJc2l6ZV90CQlwcmV2X29mZnNldCA9IHdic3RhdGUtPm9mZnNldDsKLQogCQkJd2JzdGF0ZS0+ aW5pdCA9IHRydWU7CiAJCQl3YnN0YXRlLT5vZmZzZXQgKz0gdWxlbjsKIAkJCXdic3RhdGUtPnBy ZXZfYWxudW0gPSBjdXJyX2FsbnVtOwpkaWZmIC0tZ2l0IGEvc3JjL2NvbW1vbi91bmljb2RlL2Nh c2VfdGVzdC5jIGIvc3JjL2NvbW1vbi91bmljb2RlL2Nhc2VfdGVzdC5jCmluZGV4IGFlMGY4NmZm YTBjLi43MWE2ZjJiYmU3MCAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi91bmljb2RlL2Nhc2VfdGVz dC5jCisrKyBiL3NyYy9jb21tb24vdW5pY29kZS9jYXNlX3Rlc3QuYwpAQCAtMTc5LDcgKzE3OSw3 IEBAIHRlc3RfaWN1KHZvaWQpCiAJewogCQlwZ191bmljb2RlX2NhdGVnb3J5IGNhdGVnb3J5ID0g dW5pY29kZV9jYXRlZ29yeShjb2RlKTsKIAotCQlpZiAoY2F0ZWdvcnkgIT0gUEdfVV9VTkFTU0lH TkVEKQorCQlpZiAoY2F0ZWdvcnkgIT0gUEdfVV9VTkFTU0lHTkVEICYmIGNhdGVnb3J5ICE9IFBH X1VfU1VSUk9HQVRFKQogCQl7CiAJCQl1aW50OF90CQlpY3VfY2F0ZWdvcnkgPSB1X2NoYXJUeXBl KGNvZGUpOwogCQkJY2hhcgkJY29kZV9zdHJbNV0gPSB7MH07CmRpZmYgLS1naXQgYS9zcmMvY29t bW9uL3VuaWNvZGVfY2FzZS5jIGIvc3JjL2NvbW1vbi91bmljb2RlX2Nhc2UuYwppbmRleCA0YTY5 MmNmYTI0OS4uZDg5ZjVjYTQ3NDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb21tb24vdW5pY29kZV9jYXNl LmMKKysrIGIvc3JjL2NvbW1vbi91bmljb2RlX2Nhc2UuYwpAQCAtMTk0LDIyICsxOTQsNiBAQCB1 bmljb2RlX3N0cmZvbGQoY2hhciAqZHN0LCBzaXplX3QgZHN0c2l6ZSwgY29uc3QgY2hhciAqc3Jj LCBzaXplX3Qgc3JjbGVuLAogCQkJCQkJTlVMTCwgTlVMTCk7CiB9CiAKLS8qIGxvY2FsIHZlcnNp b24gb2YgcGdfdXRmX21ibGVuKCkgdG8gYmUgaW5saW5hYmxlICovCi1zdGF0aWMgaW50Ci11dGY4 X21ibGVuKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnMpCi17Ci0JaWYgKCgqcyAmIDB4ODApID09IDAp Ci0JCXJldHVybiAxOwotCWVsc2UgaWYgKCgqcyAmIDB4ZTApID09IDB4YzApCi0JCXJldHVybiAy OwotCWVsc2UgaWYgKCgqcyAmIDB4ZjApID09IDB4ZTApCi0JCXJldHVybiAzOwotCWVsc2UgaWYg KCgqcyAmIDB4ZjgpID09IDB4ZjApCi0JCXJldHVybiA0OwotCWVsc2UKLQkJcmV0dXJuIC0xOwot fQotCiAvKgogICogSW1wbGVtZW50IFVuaWNvZGUgRGVmYXVsdCBDYXNlIENvbnZlcnNpb24gYWxn b3JpdGhtLgogICoKQEAgLTI0OCwxOCArMjMyLDE5IEBAIGNvbnZlcnRfY2FzZShjaGFyICpkc3Qs IHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzcmNsZW4sCiAKIAl3aGls ZSAoc3Jjb2ZmIDwgc3JjbGVuKQogCXsKLQkJaW50CQkJdTFsZW4gPSB1dGY4X21ibGVuKChjb25z dCB1bnNpZ25lZCBjaGFyICopIHNyYyArIHNyY29mZik7CiAJCWNoYXIzMl90CXUxOworCQlpbnQJ CQl1MWxlbjsKIAkJY2hhcjMyX3QJc2ltcGxlID0gMDsKIAkJY29uc3QgY2hhcjMyX3QgKnNwZWNp YWwgPSBOVUxMOwogCQllbnVtIENhc2VNYXBSZXN1bHQgY2FzZW1hcF9yZXN1bHQ7CiAKKwkJdTFs ZW4gPSB1dGY4ZGVjb2RlKCZ1MSwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3JjICsgc3Jjb2Zm LAorCQkJCQkJICAgc3JjbGVuIC0gc3Jjb2ZmKTsKKwogCQkvKiBpbnZhbGlkIFVURjggKi8KLQkJ aWYgKHUxbGVuIDwgMCB8fCBzcmNvZmYgKyB1MWxlbiA+IHNyY2xlbikKKwkJaWYgKHUxbGVuIDw9 IDApCiAJCQlicmVhazsKIAotCQl1MSA9IHV0ZjhfdG9fdW5pY29kZSgoY29uc3QgdW5zaWduZWQg Y2hhciAqKSBzcmMgKyBzcmNvZmYpOwotCiAJCWlmIChzdHJfY2FzZWtpbmQgPT0gQ2FzZVRpdGxl KQogCQl7CiAJCQlpZiAoc3Jjb2ZmID09IGJvdW5kYXJ5KQpAQCAtMjgwLDYgKzI2NSw3IEBAIGNv bnZlcnRfY2FzZShjaGFyICpkc3QsIHNpemVfdCBkc3RzaXplLCBjb25zdCBjaGFyICpzcmMsIHNp emVfdCBzcmNsZW4sCiAJCQkJLyogbm8gbWFwcGluZzsgY29weSBieXRlcyBmcm9tIHNyYyAqLwog CQkJCUFzc2VydChzaW1wbGUgPT0gMCk7CiAJCQkJQXNzZXJ0KHNwZWNpYWwgPT0gTlVMTCk7CisK IAkJCQlpZiAocmVzdWx0X2xlbiArIHUxbGVuIDw9IGRzdHNpemUpCiAJCQkJCW1lbWNweShkc3Qg KyByZXN1bHRfbGVuLCBzcmMgKyBzcmNvZmYsIHUxbGVuKTsKIApAQCAtMjg5LDExICsyNzUsMTgg QEAgY29udmVydF9jYXNlKGNoYXIgKmRzdCwgc2l6ZV90IGRzdHNpemUsIGNvbnN0IGNoYXIgKnNy Yywgc2l6ZV90IHNyY2xlbiwKIAkJCQl7CiAJCQkJCS8qIHJlcGxhY2Ugd2l0aCBzaW5nbGUgY2hh cmFjdGVyICovCiAJCQkJCWNoYXIzMl90CXUyID0gc2ltcGxlOwotCQkJCQljaGFyMzJfdAl1Mmxl biA9IHVuaWNvZGVfdXRmOGxlbih1Mik7CisJCQkJCWludAkJCXUybGVuOworCQkJCQlzaXplX3QJ CXJlbWFpbmluZyA9IDA7CisJCQkJCXVuc2lnbmVkIGNoYXIgKnAgPSBOVUxMOworCisJCQkJCWlm IChkc3RzaXplID4gcmVzdWx0X2xlbikKKwkJCQkJeworCQkJCQkJcmVtYWluaW5nID0gZHN0c2l6 ZSAtIHJlc3VsdF9sZW47CisJCQkJCQlwID0gKHVuc2lnbmVkIGNoYXIgKikgZHN0ICsgcmVzdWx0 X2xlbjsKKwkJCQkJfQogCiAJCQkJCUFzc2VydChzcGVjaWFsID09IE5VTEwpOwotCQkJCQlpZiAo cmVzdWx0X2xlbiArIHUybGVuIDw9IGRzdHNpemUpCi0JCQkJCQl1bmljb2RlX3RvX3V0ZjgodTIs ICh1bnNpZ25lZCBjaGFyICopIGRzdCArIHJlc3VsdF9sZW4pOworCQkJCQl1MmxlbiA9IHV0Zjhl bmNvZGUocCwgcmVtYWluaW5nLCB1Mik7CiAKIAkJCQkJcmVzdWx0X2xlbiArPSB1MmxlbjsKIAkJ CQl9CkBAIC0zMDQsMTAgKzI5NywxNyBAQCBjb252ZXJ0X2Nhc2UoY2hhciAqZHN0LCBzaXplX3Qg ZHN0c2l6ZSwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc3JjbGVuLAogCQkJCWZvciAoaW50IGkg PSAwOyBpIDwgTUFYX0NBU0VfRVhQQU5TSU9OICYmIHNwZWNpYWxbaV07IGkrKykKIAkJCQl7CiAJ CQkJCWNoYXIzMl90CXUyID0gc3BlY2lhbFtpXTsKLQkJCQkJc2l6ZV90CQl1MmxlbiA9IHVuaWNv ZGVfdXRmOGxlbih1Mik7CisJCQkJCWludAkJCXUybGVuOworCQkJCQlzaXplX3QJCXJlbWFpbmlu ZyA9IDA7CisJCQkJCXVuc2lnbmVkIGNoYXIgKnAgPSBOVUxMOwogCi0JCQkJCWlmIChyZXN1bHRf bGVuICsgdTJsZW4gPD0gZHN0c2l6ZSkKLQkJCQkJCXVuaWNvZGVfdG9fdXRmOCh1MiwgKHVuc2ln bmVkIGNoYXIgKikgZHN0ICsgcmVzdWx0X2xlbik7CisJCQkJCWlmIChkc3RzaXplID4gcmVzdWx0 X2xlbikKKwkJCQkJeworCQkJCQkJcmVtYWluaW5nID0gZHN0c2l6ZSAtIHJlc3VsdF9sZW47CisJ CQkJCQlwID0gKHVuc2lnbmVkIGNoYXIgKikgZHN0ICsgcmVzdWx0X2xlbjsKKwkJCQkJfQorCisJ CQkJCXUybGVuID0gdXRmOGVuY29kZShwLCByZW1haW5pbmcsIHUyKTsKIAogCQkJCQlyZXN1bHRf bGVuICs9IHUybGVuOwogCQkJCX0KQEAgLTM0NCwxNSArMzQ0LDE1IEBAIGNoZWNrX2ZpbmFsX3Np Z21hKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgc2l6ZV90IG9mZnNldCkK IAl7CiAJCWlmICgoc3RyW2ldICYgMHg4MCkgPT0gMCB8fCAoc3RyW2ldICYgMHhDMCkgPT0gMHhD MCkKIAkJewotCQkJaW50CQkJdTFsZW4gPSB1dGY4X21ibGVuKChjb25zdCB1bnNpZ25lZCBjaGFy ICopIHN0ciArIGkpOworCQkJaW50CQkJdTFsZW47CiAJCQljaGFyMzJfdAljdXJyOwogCisJCQl1 MWxlbiA9IHV0ZjhkZWNvZGUoJmN1cnIsIChjb25zdCB1bnNpZ25lZCBjaGFyICopIHN0ciArIGks IGxlbiAtIGkpOworCiAJCQkvKiBpbnZhbGlkIFVURjggKi8KLQkJCWlmICh1MWxlbiA8IDAgfHwg aSArIHUxbGVuID4gbGVuKQorCQkJaWYgKHUxbGVuIDw9IDApCiAJCQkJcmV0dXJuIGZhbHNlOwog Ci0JCQljdXJyID0gdXRmOF90b191bmljb2RlKHN0ciArIGkpOwotCiAJCQlpZiAocGdfdV9wcm9w X2Nhc2VfaWdub3JhYmxlKGN1cnIpKQogCQkJCWNvbnRpbnVlOwogCQkJZWxzZSBpZiAocGdfdV9w cm9wX2Nhc2VkKGN1cnIpKQpAQCAtMzczLDE1ICszNzMsMTUgQEAgY2hlY2tfZmluYWxfc2lnbWEo Y29uc3QgdW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBzaXplX3Qgb2Zmc2V0KQogCXsK IAkJaWYgKChzdHJbaV0gJiAweDgwKSA9PSAwIHx8IChzdHJbaV0gJiAweEMwKSA9PSAweEMwKQog CQl7Ci0JCQlpbnQJCQl1MWxlbiA9IHV0ZjhfbWJsZW4oKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikg c3RyICsgaSk7CisJCQlpbnQJCQl1MWxlbjsKIAkJCWNoYXIzMl90CWN1cnI7CiAKKwkJCXUxbGVu ID0gdXRmOGRlY29kZSgmY3VyciwgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgc3RyICsgaSwgbGVu IC0gaSk7CisKIAkJCS8qIGludmFsaWQgVVRGOCAqLwotCQkJaWYgKHUxbGVuIDwgMCB8fCBpICsg dTFsZW4gPiBsZW4pCisJCQlpZiAodTFsZW4gPD0gMCkKIAkJCQlyZXR1cm4gZmFsc2U7CiAKLQkJ CWN1cnIgPSB1dGY4X3RvX3VuaWNvZGUoc3RyICsgaSk7Ci0KIAkJCWlmIChwZ191X3Byb3BfY2Fz ZV9pZ25vcmFibGUoY3VycikpCiAJCQkJY29udGludWU7CiAJCQllbHNlIGlmIChwZ191X3Byb3Bf Y2FzZWQoY3VycikpCkBAIC0zOTEsOCArMzkxLDYgQEAgY2hlY2tfZmluYWxfc2lnbWEoY29uc3Qg dW5zaWduZWQgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBzaXplX3Qgb2Zmc2V0KQogCQl9CiAJCWVs c2UgaWYgKChzdHJbaV0gJiAweEMwKSA9PSAweDgwKQogCQkJY29udGludWU7Ci0KLQkJQXNzZXJ0 KGZhbHNlKTsJCQkvKiBpbnZhbGlkIFVURi04ICovCiAJfQogCiAJcmV0dXJuIHRydWU7Ci0tIAoy LjQzLjAKCg== --=-5z+XxYkpXZAwW1gIG2bP--