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 1w4pS2-002b5E-1U for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Mar 2026 00:16:54 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w4pS0-003By5-34 for pgsql-hackers@arkaria.postgresql.org; Tue, 24 Mar 2026 00:16:53 +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 1w4pS0-003Bxx-1r for pgsql-hackers@lists.postgresql.org; Tue, 24 Mar 2026 00:16:53 +0000 Received: from mail-ed1-x52a.google.com ([2a00:1450:4864:20::52a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w4pRy-00000000moL-1mAL for pgsql-hackers@postgresql.org; Tue, 24 Mar 2026 00:16:52 +0000 Received: by mail-ed1-x52a.google.com with SMTP id 4fb4d7f45d1cf-6618bc129acso1059524a12.2 for ; Mon, 23 Mar 2026 17:16:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1774311410; cv=none; d=google.com; s=arc-20240605; b=S/RhnJ3yBOBNOPM8mKr2AEikRKsdyawAhzRAwwUNuegSW8CIAa9evzS9vLPAx4ExKN XDC+m9rsGCyi1HDAePqPqJmv0Lv/rKTPiPn5F/fkvokNBsQEPYVuBG0Q+RYBVbZvhaxq 55ruIWKsqSMWvAjCF6uZtRG1kd5tFsaxlI5vXUXuJkaUE2HjiTUGx65Rw1tElziY+Lle kYeWLymHQ66ySD0Q9auWCK6bRCeKRWbexyWJ3IOs5AfUYi9AUJ0PSY6GfpKs2Wx9at+S HvBrfOYVy+dt3UJYMu/WC37LOkzK0NRZMGAbJz55sWZ8CKVIMg0FrrXd9ieB/qnFbyRr Ngdg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=NflzW+vmzrv2xDDrxCR0VgorAl1LU3JNFUhpexWVHr4=; fh=ICwIIX5g11Mr2s4BuJ7UJVoIzyCc83RnTdZGpCNZsd8=; b=KkmFNLNiV2HNNlPVaZbBNgZfANSeY6DXB3P2RPIkaAwt8deaPBXHMWlAHfyXqErgNZ ThH42RBDDluKw3eCfX6zojZu4oAbbEJ+vx175BL6lB/Eyhvs226QedmBG+XlFRMEBHPL 1YqdcZaN37/Oi+1KxUoC52F0LZi4AYJNJueQIV7Q5VYGPviUP46uU65GOr49cZeKOpwi W6PkGi+8AgMaD04sfNn8YFELzb38Ls26YfRFoocUM4HeKJACBAoJnnkg9hpW16qxxEHk QtTs1NFjyXV2JPmKfW7ddTSLRtRE/CX22nEW1ePK0ZgTyHTD5sz5P+5gAJJqHi6wEwm3 UHpw==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=esi.dz; s=google; t=1774311410; x=1774916210; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=NflzW+vmzrv2xDDrxCR0VgorAl1LU3JNFUhpexWVHr4=; b=Ulw9D3ExxK/TTvj3w+Lf9XLQApnd8PEJKBaz7BoviFshe3wG3mflGxGnej70lQtOFp 0xtkAc3q2F//gdLTcuYUnoj2xmC8udaHdRdAZX5N6SbFmsqQXsysqB+dFtKc+ET5LEV+ SkrRr4xYBxN9/ikVfeXM81QEHOOj9n42d6TVMjKCL0Y3/845JI2YVeaIw7n/rnJSHBxQ bm6WDGc4haLBxODQKLIY9gAtrYQkxwPv55/yPHzw/dBieVbpxE+7T1hCja4Mp4SNfpQU og2hO1ElcT/F2vn3PyiCU/y4mQ3DczgDtgwBuN36Rb2XxI7chjdvcHWA+dNmC2lkGcvs H10Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1774311410; x=1774916210; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=NflzW+vmzrv2xDDrxCR0VgorAl1LU3JNFUhpexWVHr4=; b=CpIDalomYEemL5eyuCmU8q0poT32uq2n5Gd543ft6oDJjG8VibUeCmOm0v7SwJ6TZk mkpcDTrE2D7rLJNRBjTDZSYRDmRFLYWDJszAIVIJTF4bd77gxalbGRbqMiTr94AWDWj9 XFMBC6tZr0ow5PegJ3Rjf7750lVT5fCsqVR0Gp0CnPbuOhEBE3I5q7tr5vV7OvP4ApG1 40a/s0yvYhvhvZHb9AXL6KGRemN9yBcLQVGxm+fguXSomdx4mr57CJtwWJbnjVcxxiFi 76ZEQYQxpSSjAiWhAlO895bquvU0XltptsVYSl0ThA14H3iAo+skhef2QKtv6hobKFSM V9WQ== X-Forwarded-Encrypted: i=1; AJvYcCWalIltmGGAaW4b17E92VK98Po1yong9Q5zanFe0iR1f7zB8D1HlQ2dUYmboAjTFH2V8ppKfZmaHJrTG2ck@postgresql.org X-Gm-Message-State: AOJu0YyXwRt0pziZJhDaZLMD/eWh23N6TtHdAYKPxKoILJyJfX94GeMC 4Dir2g6BDJsx9tsRJk5CHmvrUJidmbAAV+i78Lq0I2PjtAFKePQevn/uuhqmixO5hDH2se0Xv3t fwRFrVmffy2t3TNVI2TdsdVOWBz90tWM491bnR316 X-Gm-Gg: ATEYQzx0cdcWzVh/EtBlTdqc0onKcs+CeP8KLmSwqpoZOPVmJXvrIEQ3Q49asZmS6zL Lqa0r8uEklxj5jtiFdhCEVoXlk1+6Bs8sGDwIDioiDRBE0cyJ2F7GM5ctbTBRzmMdWfa+WU1mtX xx6VEYKaC8nFN4FF5/Khk3UjZuXyfDvMf1uQnMbY4xDV2NxZvRk1jtkvtHqUJEkAn9O8iSBWGXd D3xrRdDBszGtugtllC/4syXBK1voRrXiHfJU6B3ALxDZGAdUU3av584luXKbVL1QSwSeXYKDCjO EJOob9fTGk+q+Wr3Ffw/saY4dbSn0KegcZ90w1Mpf6hcdDwbWcuKALhOEJNbQUYkOFGvb0L2kmD 50i3BRz6tnSnBm7sG6xp2to6qmLlJJdF5oOeSDw== X-Received: by 2002:a17:906:8409:b0:b98:11cb:5fa9 with SMTP id a640c23a62f3a-b982f292ce3mr810778866b.22.1774311409443; Mon, 23 Mar 2026 17:16:49 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: KAZAR Ayoub Date: Tue, 24 Mar 2026 01:16:37 +0100 X-Gm-Features: AQROBzBJtCm4UqybgguxdP9Dl6fgbc3x3JwPBm_JVsemPbnfWI9_12KbzG0boXk Message-ID: Subject: Re: Speed up COPY TO text/CSV parsing using SIMD To: Nathan Bossart Cc: Andres Freund , Pg Hackers , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , Mark Wong , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="000000000000483c7a064dba1175" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000483c7a064dba1175 Content-Type: multipart/alternative; boundary="000000000000483c79064dba1173" --000000000000483c79064dba1173 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Mar 18, 2026 at 3:29=E2=80=AFAM KAZAR Ayoub wrote= : > On Wed, Mar 18, 2026 at 12:02=E2=80=AFAM KAZAR Ayoub wr= ote: > >> On Tue, Mar 17, 2026 at 7:49=E2=80=AFPM Nathan Bossart >> wrote: >> >>> On Sat, Mar 14, 2026 at 11:43:38PM +0100, KAZAR Ayoub wrote: >>> > Just a small concern about where some varlenas have a larger binary >>> size >>> > than its text representation ex: >>> > SELECT pg_column_size(to_tsvector('SIMD is GOOD')); >>> > pg_column_size >>> > ---------------- >>> > 32 >>> > >>> > its text representation is less than sizeof(Vector8) so currently v3 >>> would >>> > enter SIMD path and exit out just from the beginning (two extra >>> branches) >>> > because it does this: >>> > + if (TupleDescAttr(tup_desc, attnum - 1)->attlen =3D=3D -1 && >>> > + VARSIZE_ANY_EXHDR(DatumGetPointer(value)) > sizeof(Vector8)) >>> > >>> > I thought maybe we could do * 2 or * 4 its binary size, depends on th= e >>> type >>> > really but this is just a proposition if this case is something >>> concerning. >>> >>> Can we measure the impact of this? How likely is this case? >>> >> I'll respond to this separately in a different email. >> > My example was already incorrect (the text representation is lexems and > positions, not the text we read as it is, its lossy), anyways the point > still holds. > If we have some json(b) column like : {"key1":"val1","key2":"val2"}, for > CSV format this would immediately exit the SIMD path because of quote > character, for json(b) this is going to be always the case. > I measured the overhead of exiting the SIMD path a lot (8 million times > for one COPY TO command), i only found 3% regression for this case, > sometimes 2%. > > For cases where we do a false commitment on SIMD because we read a binary > size >=3D sizeof(Vector8), which i found very niche too, the short circui= t to > scalar each time is even more negligible (the above CSV JSON case is the > absolute worst case). > So I don't think any of this should be a concern. > > > Regards, > Ayoub > Rebased patch. Regards, Ayoub --000000000000483c79064dba1173 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Wed, Mar 18, 2026 at 3:29=E2=80=AFAM K= AZAR Ayoub <ma_kazar@esi.dz> w= rote:
On= Wed, Mar 18, 2026 at 12:02=E2=80=AFAM KAZAR Ayoub <ma_kazar@esi.dz> wrote:
=
On Tue, Mar 17, 2026 at = 7:49=E2=80=AFPM Nathan Bossart <nathandbossart@gmail.com> wrote:
On= Sat, Mar 14, 2026 at 11:43:38PM +0100, KAZAR Ayoub wrote:
> Just a small concern about where some varlenas have a larger binary si= ze
> than its text representation ex:
> SELECT pg_column_size(to_tsvector('SIMD is GOOD'));
>=C2=A0 pg_column_size
> ----------------
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 32
>
> its text representation is less than sizeof(Vector8) so currently v3 w= ould
> enter SIMD path and exit out just from the beginning (two extra branch= es)
> because it does this:
> + if (TupleDescAttr(tup_desc, attnum - 1)->attlen =3D=3D -1 &&a= mp;
> + VARSIZE_ANY_EXHDR(DatumGetPointer(value)) > sizeof(Vector8))
>
> I thought maybe we could do * 2 or * 4 its binary size, depends on the= type
> really but this is just a proposition if this case is something concer= ning.

Can we measure the impact of this?=C2=A0 How likely is this case?
I'll respond to this separately=C2=A0in a different email.<= /div>
My example was already incorrect (= the text representation is lexems=C2=A0and positions, not the text we read = as it is, its lossy), anyways the point still holds.
If we have s= ome json(b) column like :=C2=A0{"key1":"val1","key= 2":"val2"}, for CSV format this would immediately exit the S= IMD path because of quote character, for json(b) this is going to be always= the case.
I measured=C2=A0the overhead of exiting=C2=A0the SIMD = path a lot (8 million times for one COPY TO command), i only found 3% regre= ssion for this case, sometimes 2%.

For cases where= we do a false commitment on SIMD because we read a binary size >=3D siz= eof(Vector8), which i found very niche too, the=C2=A0short circuit to scala= r each time is even more negligible (the above CSV JSON case is the absolut= e worst case).
So I don't think any of this should be a conce= rn.


Regards,
Ayoub
<= /div>
Rebased patch.

Regard= s,
Ayoub
--000000000000483c79064dba1173-- --000000000000483c7a064dba1175 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Disposition: attachment; filename="v3-0001-Speed-up-COPY-TO-FORMAT-text-csv-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mn3v6xoy0 RnJvbSBkYWUxZTZjNDQ0YTczY2YwZGRjMjFiMTRlMWUwYjIyNWZkZjQ2MTA3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBTYXQsIDE0IE1hciAyMDI2IDIyOjUyOjIyICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyAoRk9STUFUIHt0ZXh0LGNzdn0pIHVzaW5nIFNJTUQuIFByZXNlbnRseSwK IHN1Y2ggY29tbWFuZHMgc2NhbiBlYWNoIGF0dHJpYnV0ZSdzIHN0cmluZyByZXByZXNlbnRhdGlv biBvbmUgYnl0ZSBhdCBhIHRpbWUKIGxvb2tpbmcgZm9yIHNwZWNpYWwgY2hhcmFjdGVycy4gIFRo aXMgY29tbWl0IGFkZHMgYSBuZXcgcGF0aCB0aGF0IHVzZXMgU0lNRAogaW5zdHJ1Y3Rpb25zIHRv IHNraXAgb3ZlciBjaHVua3Mgb2YgZGF0YSB3aXRob3V0IGFueSBzcGVjaWFsIGNoYXJhY3RlcnMu IAogVGhpcyBjYW4gYmUgbXVjaCBmYXN0ZXIuCgpTSU1EIHByb2Nlc3NpbmcgaXMgb25seSB1c2Vk IGZvciB2YXJsZW5hIGF0dHJpYnV0ZXMgd2hvc2UgdGV4dApyZXByZXNlbnRhdGlvbiBpcyBsb25n ZXIgdGhhbiBhIHNpbmdsZSBTSU1EIHZlY3RvciwgYW5kIG9ubHkgd2hlbgpubyBlbmNvZGluZyBj b252ZXJzaW9uIGlzIHJlcXVpcmVkLiAgRml4ZWQtc2l6ZSB0eXBlcyBzdWNoIGFzCmludGVnZXJz IGFuZCBib29sZWFucyBhbHdheXMgcHJvZHVjZSBzaG9ydCBBU0NJSSBvdXRwdXQgZm9yIHdoaWNo ClNJTUQgcHJvdmlkZXMgbm8gYmVuZWZpdCwgYW5kIHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVlZGVk IHRoZSBzdHJpbmcKbGVuZ3RoIG1heSBjaGFuZ2UgYWZ0ZXIgY29udmVyc2lvbi4gIEZvciBlbGln aWJsZSBhdHRyaWJ1dGVzLCB0aGUKc3RvcmVkIHZhcmxlbmEgc2l6ZSBpcyB1c2VkIGFzIGEgY2hl YXAgcHJlLWZpbHRlciB0byBhdm9pZCBhbgp1bm5lY2Vzc2FyeSBzdHJsZW4oKSBjYWxsIG9uIHNo b3J0IHZhbHVlcywgdGhpcyB2ZXJzaW9uIGFsc28gYXZvaWRzCmNhbGxpbmcgc3RybGVuIHR3aWNl IHdoZW4gdHJhbnNjb2RpbmcgaXMgbmVjZXNzYXJ5LgoKRm9yIFRFWFQgbW9kZSwgdGhlIFNJTUQg cGF0aCBzY2FucyBmb3IgQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJzLApiYWNrc2xhc2gsIGFuZCB0 aGUgZGVsaW1pdGVyLiAgRm9yIENTViBtb2RlLCB0d28gU0lNRCBoZWxwZXJzIGFyZQp1c2VkOiBv bmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBmaWVsZCByZXF1aXJlcyBxdW90aW5nIGJ5IHNjYW5u aW5nCmZvciB0aGUgZGVsaW1pdGVyLCBxdW90ZSBjaGFyYWN0ZXIsIGFuZCBlbmQtb2YtbGluZSBj aGFyYWN0ZXJzLCBhbmQKb25lIHRvIHNjYW4gZm9yIGNoYXJhY3RlcnMgcmVxdWlyaW5nIGVzY2Fw aW5nIGR1cmluZyB0aGUgb3V0cHV0IHBhc3MuCkluIGJvdGggbW9kZXMsIHRoZSBzY2FsYXIgcGF0 aCBoYW5kbGVzIGFueSByZW1haW5pbmcgY2hhcmFjdGVycyBhZnRlcgp0aGUgU0lNRCBwcmUtcGFz cy4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYyB8IDI1NCArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgMjM2IGluc2VydGlvbnMoKyks IDE4IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0 by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXggZmFmNjJkOTU5YjQuLjk1 ZDJiNTQ3NjFjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYworKysg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1 ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAicGdz dGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgorI2luY2x1ZGUgInBvcnQvc2lt ZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJ0Y29wL3Rjb3Bwcm90Lmgi CiAjaW5jbHVkZSAidXRpbHMvanNvbi5oIgpAQCAtMTI4LDExICsxMzAsMTQ3IEBAIHN0YXRpYyBj b25zdCBjaGFyIEJpbmFyeVNpZ25hdHVyZVsxMV0gPSAiUEdDT1BZXG5cMzc3XHJcblwwIjsKIHN0 YXRpYyB2b2lkIEVuZENvcHkoQ29weVRvU3RhdGUgY3N0YXRlKTsKIHN0YXRpYyB2b2lkIENsb3Nl UGlwZVRvUHJvZ3JhbShDb3B5VG9TdGF0ZSBjc3RhdGUpOwogc3RhdGljIHZvaWQgQ29weU9uZVJv d1RvKENvcHlUb1N0YXRlIGNzdGF0ZSwgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOwotc3RhdGljIHZv aWQgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcpOwotc3RhdGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3Rh dGUsIGNvbnN0IGNoYXIgKnN0cmluZywKLQkJCQkJCQkJYm9vbCB1c2VfcXVvdGUpOworc3RhdGlj IHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIHZvaWQgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29w eVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJCQkJCQkJCQkJCQlib29s IHVzZV9zaW1kLCBzaXplX3QgbGVuKTsKK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGlu ZSB2b2lkIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFy ICpzdHJpbmcsCisJCQkJCQkJCQkJCQkJCSAgIGJvb2wgdXNlX3F1b3RlLCBib29sIHVzZV9zaW1k LCBzaXplX3QgbGVuKTsKIHN0YXRpYyB2b2lkIENvcHlSZWxhdGlvblRvKENvcHlUb1N0YXRlIGNz dGF0ZSwgUmVsYXRpb24gcmVsLCBSZWxhdGlvbiByb290X3JlbCwKIAkJCQkJCSAgIHVpbnQ2NCAq cHJvY2Vzc2VkKTsKK3N0YXRpYyB2b2lkIENvcHlTa2lwVGV4dFNJTUQoY29uc3QgY2hhciAqKnB0 ciwKKwkJCQkJCQkgc2l6ZV90IGxlbiwgY2hhciBkZWxpbWMpOworc3RhdGljIHZvaWQgQ29weUNo ZWNrQ1NWUXVvdGVOZWVkU0lNRChjb25zdCBjaGFyICoqcHRyLAorCQkJCQkJCQkJICBzaXplX3Qg bGVuLCBjaGFyIGRlbGltYywgY2hhciBxdW90ZWMpOworc3RhdGljIHZvaWQgQ29weVNraXBDU1ZF c2NhcGVTSU1EKGNvbnN0IGNoYXIgKipwdHIsCisJCQkJCQkJCSAgc2l6ZV90IGxlbiwgY2hhciBl c2NhcGVjLCBjaGFyIHF1b3RlYyk7CisKKy8qCisgKiBDb3B5U2tpcFRleHRTSU1EIC0gU2NhbiBm b3J3YXJkIGluIFRFWFQgbW9kZSB1c2luZyBTSU1ELAorICogc3RvcHBpbmcgYXQgdGhlIGZpcnN0 IHNwZWNpYWwgY2hhcmFjdGVyIHRoZW4gY2FsbGVyIGNvbnRpbnVlcyBwcm9jZXNzaW5nIGFueSBy ZW1haW5pbmcKKyAqIGNoYXJhY3RlcnMgaW4gdGhlIHNjYWxhciBwYXRoLgorICoKKyAqIFNwZWNp YWwgY2hhcmFjdGVycyBmb3IgVEVYVCBtb2RlIGFyZTogQVNDSUkgY29udHJvbCBjaGFyYWN0ZXJz ICg8IDB4MjApLAorICogYmFja3NsYXNoLCBhbmQgdGhlIGRlbGltaXRlci4KKyAqLworc3RhdGlj IHZvaWQKK0NvcHlTa2lwVGV4dFNJTUQoY29uc3QgY2hhciAqKnB0ciwgc2l6ZV90IGxlbiwgY2hh ciBkZWxpbWMpCit7CisjaWZuZGVmIFVTRV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7 CisJY29uc3QgY2hhciAqZW5kID0gcCArIGxlbjsKKworCWNvbnN0IFZlY3RvcjggYmFja3NsYXNo X21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXFwnKTsKKwljb25zdCBWZWN0b3I4IGRlbGltX21h c2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChkZWxpbWMpOworCWNvbnN0IFZlY3RvcjggY29udHJvbF9t YXNrID0gdmVjdG9yOF9icm9hZGNhc3QoMHgyMCk7CisKKwl3aGlsZSAocCArIHNpemVvZihWZWN0 b3I4KSA8PSBlbmQpCisJeworCQlWZWN0b3I4CQljaHVuazsKKwkJVmVjdG9yOAkJbWF0Y2g7CisK KwkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIHApOworCisJCW1hdGNoID0g dmVjdG9yOF9vcih2ZWN0b3I4X2d0KGNvbnRyb2xfbWFzaywgY2h1bmspLAorCQkJCQkJICAgdmVj dG9yOF9lcShjaHVuaywgYmFja3NsYXNoX21hc2spKTsKKwkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1h dGNoLCB2ZWN0b3I4X2VxKGNodW5rLCBkZWxpbV9tYXNrKSk7CisKKwkJaWYgKHZlY3RvcjhfaXNf aGlnaGJpdF9zZXQobWF0Y2gpKQorCQl7CisJCQl1aW50MzIJCW1hc2s7CisKKwkJCW1hc2sgPSB2 ZWN0b3I4X2hpZ2hiaXRfbWFzayhtYXRjaCk7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0bW9zdF9v bmVfcG9zMzIobWFzayk7CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihWZWN0b3I4 KTsKKwl9CisKKwkqcHRyID0gcDsKKyNlbmRpZgorfQorCisvKgorICogQ29weUNoZWNrQ1NWUXVv dGVOZWVkU0lNRCAtIFNjYW4gYSBDU1YgZmllbGQgdXNpbmcgU0lNRCB0byBkZXRlcm1pbmUKKyAq IHdoZXRoZXIgaXQgbmVlZHMgcXVvdGluZyBzdG9wcGluZyBhdCB0aGUgZmlyc3QgY2hhcmFjdGVy IHRoYXQgd291bGQgcmVxdWlyZSB0aGUgZmllbGQgdG8gYmUgcXVvdGVkOgorICogdGhlIGRlbGlt aXRlciwgdGhlIHF1b3RlIGNoYXJhY3RlciwgbmV3bGluZSwgb3IgY2FycmlhZ2UgcmV0dXJuLgor ICovCitzdGF0aWMgdm9pZAorQ29weUNoZWNrQ1NWUXVvdGVOZWVkU0lNRChjb25zdCBjaGFyICoq cHRyLCBzaXplX3QgbGVuLCBjaGFyIGRlbGltYywgY2hhciBxdW90ZWMpCit7CisjaWZuZGVmIFVT RV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7CisJY29uc3QgY2hhciAqZW5kID0gcCAr IGxlbjsKKworCWNvbnN0IFZlY3RvcjggZGVsaW1fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KGRl bGltYyk7CisJY29uc3QgVmVjdG9yOCBxdW90ZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QocXVv dGVjKTsKKwljb25zdCBWZWN0b3I4IG5sX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXG4nKTsK Kwljb25zdCBWZWN0b3I4IGNyX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKworCXdo aWxlIChwICsgc2l6ZW9mKFZlY3RvcjgpIDw9IGVuZCkKKwl7CisJCVZlY3RvcjgJCWNodW5rOwor CQlWZWN0b3I4CQltYXRjaDsKKworCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDgg KikgcCk7CisKKwkJbWF0Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIG5sX21hc2sp LCB2ZWN0b3I4X2VxKGNodW5rLCBjcl9tYXNrKSk7CisJCW1hdGNoID0gdmVjdG9yOF9vcihtYXRj aCwgdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBkZWxpbV9tYXNrKSwKKwkJCQkJCQkJCQkJ IHZlY3RvcjhfZXEoY2h1bmssIHF1b3RlX21hc2spKSk7CisKKwkJaWYgKHZlY3RvcjhfaXNfaGln aGJpdF9zZXQobWF0Y2gpKQorCQl7CisJCQl1aW50MzIJCW1hc2s7CisKKwkJCW1hc2sgPSB2ZWN0 b3I4X2hpZ2hiaXRfbWFzayhtYXRjaCk7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0bW9zdF9vbmVf cG9zMzIobWFzayk7CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihWZWN0b3I4KTsK Kwl9CisKKwkqcHRyID0gcDsKKyNlbmRpZgorfQorCisvKgorICogQ29weVNraXBDU1ZFc2NhcGVT SU1EIC0gU2FtZSBhcyBDb3B5Q2hlY2tDU1ZRdW90ZU5lZWRTSU1ELCBzY2FuIGZvcndhcmQgaW4g Q1NWIG1vZGUgdXNpbmcgU0lNRCwKKyAqIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIg dGhhdCByZXF1aXJlcyBlc2NhcGluZy4KKyAqLworc3RhdGljIHZvaWQKK0NvcHlTa2lwQ1NWRXNj YXBlU0lNRChjb25zdCBjaGFyICoqcHRyLCBzaXplX3QgbGVuLCBjaGFyIGVzY2FwZWMsIGNoYXIg cXVvdGVjKQoreworI2lmbmRlZiBVU0VfTk9fU0lNRAorCWNvbnN0IGNoYXIgKnAgPSAqcHRyOwor CWNvbnN0IGNoYXIgKmVuZCA9IHAgKyBsZW47CisKKwljb25zdCBWZWN0b3I4IGVzY2FwZV9tYXNr ID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisJY29uc3QgVmVjdG9yOCBxdW90ZV9tYXNr ID0gdmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsKKworCXdoaWxlIChwICsgc2l6ZW9mKFZlY3Rv cjgpIDw9IGVuZCkKKwl7CisJCVZlY3RvcjgJCWNodW5rOworCQlWZWN0b3I4CQltYXRjaDsKKwor CQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcCk7CisKKwkJbWF0Y2ggPSB2 ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIHF1b3RlX21hc2spLCB2ZWN0b3I4X2VxKGNodW5r LCBlc2NhcGVfbWFzaykpOworCisJCWlmICh2ZWN0b3I4X2lzX2hpZ2hiaXRfc2V0KG1hdGNoKSkK KwkJeworCQkJdWludDMyCQltYXNrOworCisJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2so bWF0Y2gpOworCQkJKnB0ciA9IHAgKyBwZ19yaWdodG1vc3Rfb25lX3BvczMyKG1hc2spOworCQkJ cmV0dXJuOworCQl9CisKKwkJcCArPSBzaXplb2YoVmVjdG9yOCk7CisJfQorCisJKnB0ciA9IHA7 CisjZW5kaWYKK30KIAogLyogYnVpbHQtaW4gZm9ybWF0LXNwZWNpZmljIHJvdXRpbmVzICovCiBz dGF0aWMgdm9pZCBDb3B5VG9UZXh0TGlrZVN0YXJ0KENvcHlUb1N0YXRlIGNzdGF0ZSwgVHVwbGVE ZXNjIHR1cERlc2MpOwpAQCAtMjQ0LDkgKzM4Miw5IEBAIENvcHlUb1RleHRMaWtlU3RhcnQoQ29w eVRvU3RhdGUgY3N0YXRlLCBUdXBsZURlc2MgdHVwRGVzYykKIAkJCWNvbG5hbWUgPSBOYW1lU3Ry KFR1cGxlRGVzY0F0dHIodHVwRGVzYywgYXR0bnVtIC0gMSktPmF0dG5hbWUpOwogCiAJCQlpZiAo Y3N0YXRlLT5vcHRzLmZvcm1hdCA9PSBDT1BZX0ZPUk1BVF9DU1YpCi0JCQkJQ29weUF0dHJpYnV0 ZU91dENTVihjc3RhdGUsIGNvbG5hbWUsIGZhbHNlKTsKKwkJCQlDb3B5QXR0cmlidXRlT3V0Q1NW KGNzdGF0ZSwgY29sbmFtZSwgZmFsc2UsIGZhbHNlLCAwKTsKIAkJCWVsc2UKLQkJCQlDb3B5QXR0 cmlidXRlT3V0VGV4dChjc3RhdGUsIGNvbG5hbWUpOworCQkJCUNvcHlBdHRyaWJ1dGVPdXRUZXh0 KGNzdGF0ZSwgY29sbmFtZSwgZmFsc2UsIDApOwogCQl9CiAKIAkJQ29weVNlbmRUZXh0TGlrZUVu ZE9mUm93KGNzdGF0ZSk7CkBAIC0zMDQsNiArNDQyLDcgQEAgQ29weVRvVGV4dExpa2VPbmVSb3co Q29weVRvU3RhdGUgY3N0YXRlLAogewogCWJvb2wJCW5lZWRfZGVsaW0gPSBmYWxzZTsKIAlGbWdy SW5mbyAgICpvdXRfZnVuY3Rpb25zID0gY3N0YXRlLT5vdXRfZnVuY3Rpb25zOworCVR1cGxlRGVz Ywl0dXBfZGVzYyA9IHNsb3QtPnR0c190dXBsZURlc2NyaXB0b3I7CiAKIAlmb3JlYWNoX2ludChh dHRudW0sIGNzdGF0ZS0+YXR0bnVtbGlzdCkKIAl7CkBAIC0zMjEsMTUgKzQ2MCw0OCBAQCBDb3B5 VG9UZXh0TGlrZU9uZVJvdyhDb3B5VG9TdGF0ZSBjc3RhdGUsCiAJCWVsc2UKIAkJewogCQkJY2hh cgkgICAqc3RyaW5nOworCQkJYm9vbAkJdXNlX3NpbWQgPSBmYWxzZTsKKwkJCXNpemVfdAkJbGVu ID0gMDsKKworCQkJc3RyaW5nID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rpb25zW2F0 dG51bSAtIDFdLCB2YWx1ZSk7CiAKLQkJCXN0cmluZyA9IE91dHB1dEZ1bmN0aW9uQ2FsbCgmb3V0 X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwKLQkJCQkJCQkJCQl2YWx1ZSk7CisJCQkvKgorCQkJKiBP bmx5IHVzZSBTSU1EIGZvciB2YXJsZW5hIHR5cGVzIHdpdGhvdXQgdHJhbnNjb2RpbmcuICBGaXhl ZC1zaXplCisJCQkqIHR5cGVzIChpbnQ0LCBib29sLCBkYXRlLCBldGMuKSBhbHdheXMgcHJvZHVj ZSBzaG9ydCBBU0NJSSBvdXRwdXQKKwkJCSogZm9yIHdoaWNoIFNJTUQgcHJvdmlkZXMgbm8gYmVu ZWZpdC4gIFdoZW4gdHJhbnNjb2RpbmcgaXMgbmVlZGVkLAorCQkJKiB0aGUgc3RyaW5nIGxlbmd0 aCBtYXkgY2hhbmdlIGFmdGVyIGNvbnZlcnNpb24sIHNvIHdlIHNraXAgU0lNRAorCQkJKiBlbnRp cmVseSBpbiB0aGF0IGNhc2UgdG9vLgorCQkJKgorCQkJKiBXZSB1c2UgVkFSU0laRV9BTllfRVhI RFIgYXMgYSBjaGVhcCBwcmUtZmlsdGVyIHRvIGF2b2lkIGNhbGxpbmcKKwkJCSogc3RybGVuKCkg b24gc2hvcnQgdmFybGVuYXMuICBUaGUgYWN0dWFsIGxlbmd0aCBwYXNzZWQgdG8gdGhlIFNJTUQK KwkJCSogaGVscGVycyBpcyBhbHdheXMgc3RybGVuKHN0cmluZykgc28gdGhlIHRleHQgb3V0cHV0 IGxlbmd0aCBub3QKKwkJCSogdGhlIGJpbmFyeSBzdG9yYWdlIHNpemUuCisJCQkqLworCQkJaWYg KFR1cGxlRGVzY0F0dHIodHVwX2Rlc2MsIGF0dG51bSAtIDEpLT5hdHRsZW4gPT0gLTEgJiYKKwkJ CQlWQVJTSVpFX0FOWV9FWEhEUihEYXR1bUdldFBvaW50ZXIodmFsdWUpKSA+IHNpemVvZihWZWN0 b3I4KSkKKwkJCXsKKwkJCQlsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwkJCQl1c2Vfc2ltZCA9ICFj c3RhdGUtPm5lZWRfdHJhbnNjb2RpbmcgJiYgKGxlbiA+IHNpemVvZihWZWN0b3I4KSk7CisJCQl9 CiAKIAkJCWlmIChpc19jc3YpCi0JCQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIHN0cmlu ZywKLQkJCQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRudW0gLSAxXSk7 CisJCQl7CisJCQkJaWYgKHVzZV9zaW1kKQorCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKGNzdGF0 ZSwgc3RyaW5nLAorCQkJCQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRu dW0gLSAxXSwKKwkJCQkJCQkJCQl0cnVlLCBsZW4pOworCQkJCWVsc2UKKwkJCQkJQ29weUF0dHJp YnV0ZU91dENTVihjc3RhdGUsIHN0cmluZywKKwkJCQkJCQkJCQljc3RhdGUtPm9wdHMuZm9yY2Vf cXVvdGVfZmxhZ3NbYXR0bnVtIC0gMV0sCisJCQkJCQkJCQkJZmFsc2UsIGxlbik7CisJCQl9CiAJ CQllbHNlCi0JCQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJpbmcpOworCQkJewor CQkJCWlmICh1c2Vfc2ltZCkKKwkJCQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJp bmcsIHRydWUsIGxlbik7CisJCQkJZWxzZQorCQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4dChjc3Rh dGUsIHN0cmluZywgZmFsc2UsIGxlbik7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTE0MTYsOCArMTU4 OCwyNCBAQCBDb3B5T25lUm93VG8oQ29weVRvU3RhdGUgY3N0YXRlLCBUdXBsZVRhYmxlU2xvdCAq c2xvdCkKIAkJCUNvcHlTZW5kRGF0YShjc3RhdGUsIHN0YXJ0LCBwdHIgLSBzdGFydCk7IFwKIAl9 IHdoaWxlICgwKQogCi1zdGF0aWMgdm9pZAotQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3Rh dGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCisvKgorICogQ29weUF0dHJpYnV0ZU91dFRl eHQgLSBTZW5kIHRleHQgcmVwcmVzZW50YXRpb24gb2Ygb25lIGF0dHJpYnV0ZSwKKyAqIHdpdGgg Y29udmVyc2lvbiBhbmQgZXNjYXBpbmcuCisgKgorICogRm9yIGEgbGl0dGxlIGV4dHJhIHNwZWVk LCBpZiB1c2Vfc2ltZCBpcyB0cnVlIHdlIGZpcnN0IHVzZSBTSU1ECisgKiBpbnN0cnVjdGlvbnMg dG8gc2tpcCBvdmVyIGNodW5rcyBvZiBkYXRhIHRoYXQgY29udGFpbiBubyBzcGVjaWFsCisgKiBj aGFyYWN0ZXJzLiAgVGhpcyBwcmUtcGFzcyBhZHZhbmNlcyBwdHIgYXMgZmFyIGFzIHBvc3NpYmxl IGJlZm9yZQorICogaGFuZGluZyBvZmYgdG8gdGhlIHNjYWxhciBsb29wIGJlbG93LCB3aGljaCB0 aGVuIHByb2Nlc3NlcyBhbnkKKyAqIHJlbWFpbmluZyBjaGFyYWN0ZXJzLiAgdXNlX3NpbWQgaXMg b25seSBzZXQgYnkgdGhlIGNhbGxlciB3aGVuIHRoZQorICogYXR0cmlidXRlIGlzIGEgdmFybGVu YSB0eXBlIHdob3NlIHRleHQgcmVwcmVzZW50YXRpb24gaXMgbG9uZ2VyIHRoYW4KKyAqIGEgc2lu Z2xlIFNJTUQgdmVjdG9yIGFuZCBubyBlbmNvZGluZyBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLiAg SW4gYWxsCisgKiBvdGhlciBjYXNlcyB3ZSBmYWxsIHN0cmFpZ2h0IHRocm91Z2ggdG8gdGhlIHNj YWxhciBwYXRoLgorICoKKyAqIFdoZW4gdXNlX3NpbWQgaXMgdHJ1ZSwgbGVuIG11c3QgYmUgdGhl IHN0cmxlbigpIG9mIHN0cmluZywgb3RoZXJ3aXNlIGl0IGlzIHVudXNlZAorICovCitzdGF0aWMg cGdfYXR0cmlidXRlX2Fsd2F5c19pbmxpbmUgdm9pZAorQ29weUF0dHJpYnV0ZU91dFRleHQoQ29w eVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCisJCQkJCSBib29sIHVzZV9zaW1k LCBzaXplX3QgbGVuKQogewogCWNvbnN0IGNoYXIgKnB0cjsKIAljb25zdCBjaGFyICpzdGFydDsK QEAgLTE0MjUsNyArMTYxMywxNSBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBj c3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAljaGFyCQlkZWxpbWMgPSBjc3RhdGUtPm9wdHMu ZGVsaW1bMF07CiAKIAlpZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29kaW5nKQotCQlwdHIgPSBwZ19z ZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVuKHN0cmluZyksIGNzdGF0ZS0+ZmlsZV9lbmNvZGlu Zyk7CisJeworCQkvKgorCQkgKiBsZW4gbWF5IGFscmVhZHkgYmUgc2V0IGJ5IHRoZSBjYWxsZXIg Zm9yIGxvbmcgdmFybGVuYXMsIGF2b2lkaW5nIGFuIGV4dHJhCisJCSAqIHN0cmxlbigpIGNhbGwu ICBGb3IgYWxsIG90aGVyIGNhc2VzIGl0IGlzIDAgYW5kIHdlIGNvbXB1dGUgaXQgaGVyZS4KKwkJ ICovCisJCWlmIChsZW4gPT0gMCkKKwkJCWxlbiA9IHN0cmxlbihzdHJpbmcpOworCQlwdHIgPSBw Z19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZpbGVfZW5jb2RpbmcpOworCX0K IAllbHNlCiAJCXB0ciA9IHN0cmluZzsKIApAQCAtMTQ0Niw2ICsxNjQyLDkgQEAgQ29weUF0dHJp YnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJaWYg KGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQogCXsKIAkJc3RhcnQgPSBwdHI7CisJCWlm ICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwVGV4dFNJTUQoJnB0ciwgbGVuLCBkZWxpbWMpOworCiAJ CXdoaWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikg YyA8ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAtMTUwNiw2ICsxNzA1LDkgQEAgQ29weUF0dHJp YnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcpCiAJZWxz ZQogCXsKIAkJc3RhcnQgPSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwVGV4dFNJ TUQoJnB0ciwgbGVuLCBkZWxpbWMpOworCiAJCXdoaWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJ CXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAt MTU2NiwxMiArMTc2OCwxNCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3Rh dGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIH0KIAogLyoKLSAqIFNlbmQgdGV4dCByZXByZXNlbnRh dGlvbiBvZiBvbmUgYXR0cmlidXRlLCB3aXRoIGNvbnZlcnNpb24gYW5kCi0gKiBDU1Ytc3R5bGUg ZXNjYXBpbmcKKyAqIENvcHlBdHRyaWJ1dGVPdXRDU1YgLSBTZW5kIHRleHQgcmVwcmVzZW50YXRp b24gb2Ygb25lIGF0dHJpYnV0ZSwKKyAqIHdpdGggY29udmVyc2lvbiBhbmQgQ1NWLXN0eWxlIGVz Y2FwaW5nLgorICoKKyAqIFdlIHVzZSB0aGUgc2FtZSBzaW1kIG9wdGltaXphdGlvbiBpZGVhLCBz ZWUgQ29weUF0dHJpYnV0ZU91dFRleHQgY29tbWVudC4KICAqLwotc3RhdGljIHZvaWQKK3N0YXRp YyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSB2b2lkCiBDb3B5QXR0cmlidXRlT3V0Q1NWKENv cHlUb1N0YXRlIGNzdGF0ZSwgY29uc3QgY2hhciAqc3RyaW5nLAotCQkJCQlib29sIHVzZV9xdW90 ZSkKKwkJCQkJYm9vbCB1c2VfcXVvdGUsIGJvb2wgdXNlX3NpbWQsIHNpemVfdCBsZW4pCiB7CiAJ Y29uc3QgY2hhciAqcHRyOwogCWNvbnN0IGNoYXIgKnN0YXJ0OwpAQCAtMTU4Niw3ICsxNzkwLDE1 IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcsCiAJCXVzZV9xdW90ZSA9IHRydWU7CiAKIAlpZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29k aW5nKQotCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgc3RybGVuKHN0cmluZyksIGNz dGF0ZS0+ZmlsZV9lbmNvZGluZyk7CisJeworCQkvKgorCQkgKiBsZW4gbWF5IGFscmVhZHkgYmUg c2V0IGJ5IHRoZSBjYWxsZXIgZm9yIGxvbmcgdmFybGVuYXMsIGF2b2lkaW5nIGFuIGV4dHJhCisJ CSAqIHN0cmxlbigpIGNhbGwuICBGb3IgYWxsIG90aGVyIGNhc2VzIGl0IGlzIDAgYW5kIHdlIGNv bXB1dGUgaXQgaGVyZS4KKwkJICovCisJCWlmIChsZW4gPT0gMCkKKwkJCWxlbiA9IHN0cmxlbihz dHJpbmcpOworCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZp bGVfZW5jb2RpbmcpOworCX0KIAllbHNlCiAJCXB0ciA9IHN0cmluZzsKIApAQCAtMTYwOCw2ICsx ODIwLDkgQEAgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNo YXIgKnN0cmluZywKIAkJewogCQkJY29uc3QgY2hhciAqdHB0ciA9IHB0cjsKIAorCQkJaWYgKHVz ZV9zaW1kKQorCQkJCUNvcHlDaGVja0NTVlF1b3RlTmVlZFNJTUQoJnRwdHIsIGxlbiwgZGVsaW1j LCBxdW90ZWMpOworCiAJCQl3aGlsZSAoKGMgPSAqdHB0cikgIT0gJ1wwJykKIAkJCXsKIAkJCQlp ZiAoYyA9PSBkZWxpbWMgfHwgYyA9PSBxdW90ZWMgfHwgYyA9PSAnXG4nIHx8IGMgPT0gJ1xyJykK QEAgLTE2MzEsNiArMTg0Niw5IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0 YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCSAqIFdlIGFkb3B0IHRoZSBzYW1lIG9wdGltaXph dGlvbiBzdHJhdGVneSBhcyBpbiBDb3B5QXR0cmlidXRlT3V0VGV4dAogCQkgKi8KIAkJc3RhcnQg PSBwdHI7CisJCWlmICh1c2Vfc2ltZCkKKwkJCUNvcHlTa2lwQ1NWRXNjYXBlU0lNRCgmcHRyLCBs ZW4sIGVzY2FwZWMsIHF1b3RlYyk7CisKIAkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJ ewogCQkJaWYgKGMgPT0gcXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0gCjIuMzQuMQoK --000000000000483c7a064dba1175--