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 1vqdv2-00F0Mo-1i for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Feb 2026 21:08:14 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vqdv0-00BIQW-2Z for pgsql-hackers@arkaria.postgresql.org; Thu, 12 Feb 2026 21:08:11 +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 1vqdv0-00BIQN-1C for pgsql-hackers@lists.postgresql.org; Thu, 12 Feb 2026 21:08:11 +0000 Received: from mail-ed1-x534.google.com ([2a00:1450:4864:20::534]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vqdux-00000000Nbj-457B for pgsql-hackers@postgresql.org; Thu, 12 Feb 2026 21:08:09 +0000 Received: by mail-ed1-x534.google.com with SMTP id 4fb4d7f45d1cf-65a3c6f587cso277216a12.1 for ; Thu, 12 Feb 2026 13:08:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1770930484; cv=none; d=google.com; s=arc-20240605; b=jXB0ejnz2RZMfkSg/5lgUUdC44lCRS1i+q3mBOeI3UObDwDaCziGAO13oEOw8lxjEM RbtKKT+pjVFTRtjCLYqlqBSRGqN0RMDXNGM3b7vXSsMNfmrDe81K9VXzxeh0ikV00lAV IncAMG4sAmb1/CWjrlQjs9r67tAS9irMBgfmsNpHsVMJqvdnPDJnWucD2y/ewnIM24jZ uN36tM962Tf+Hi/tpmOx+o6wnwFyQO9Dv3xo2r/DvCniMz1nCT3t1sTtz3/2Nm2oe4rq 9LcNFYXyEYRLPNlWANXtjKK9Gtt2d1MFH7JnHukEZJcsrpKQGjpA140AJCYGiEDcJskO kuGQ== 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:mime-version:dkim-signature; bh=+DvqYkvUmEa1Cbvu4+bg0Vx5n9NniMTCS9upo59mQVg=; fh=kXguOiw9TCjSURVEcFO2gu2YZ4iV9ciqmcBQ9T4cnfU=; b=jbQedsFJEjTzvmX6JvC2hLTNUMbr4yscna+esoZn+byDCmYIpB4rfuiR1UTAcr203Z IzEcPtEtqDHlXSMMY8axmlSIycOFOHp9h4gP1X89F+5uYEZTpz4l3HI3LWMrVXJI8OFm +Bx570d5zhsfRWQScIy3V0HOMzqwy9/ppiWRvy4s0rVWGFAEqn/vp41oZ29QYOEQi7ng GMyjG5NAF6hDyc3ni4UbVqCu0gvdYFuBZj4eHxxs7i1YALRHTU91KYV88Fa+eiZnkONr eDacaysLsybjdq2HzQ280RQvQKyX4+Y9Y0rqDmWvGTQ9LuEFGysTlSCs/RcXDSvS3XiH 09Yw==; 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=1770930484; x=1771535284; darn=postgresql.org; h=cc:to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=+DvqYkvUmEa1Cbvu4+bg0Vx5n9NniMTCS9upo59mQVg=; b=OpVyGSMOpSwsrhXpCG8QihpKeUuzrEQC8f49HmVNm61yANAA9SWv80+qwXWhlnBW5O 6rHA7GxzCYuMN3aVNFhbQDpsyZEFUI1Gycp9GOaOHL3FGybdXVmmMMHKxH9ZW42R+c5w JkX7/H5MdeU49ynXI1PjBQH0ZxSlodRqZeNPOU1kJnRL0pdYBU55BKGCXOjpRB9nkkJL Lkt7muKNpvrBju5ovRDThs1uvV3xCsCLYJVTbnHTlOU54h7RvBPluYNBlokECMgvZgtB olUjeFyaB7sK+MHL8DgiLjcJWNX0rinOh43LMBH95wnxmzqRvM0tI8UZTSrqHlUhavUQ rWKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770930484; x=1771535284; h=cc:to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+DvqYkvUmEa1Cbvu4+bg0Vx5n9NniMTCS9upo59mQVg=; b=A2Gl3iNRIfvS53/OoBJRNbEFPuxcnlIID3pvNchSCrvOCFZr1v65MmAhTuCrkjKhpB OaIjI8H/GNBMAAR3e00MbiahCqVteyenFGYHudLICZITEahd9nboQko0JA/AiI9XmL25 bjGPAxCZftd4wg7FmA+SV56SpQFs9hYdtllpin234jodPRkZOGaD1mpGC8TT1mp1Bd3g oL5C4eYlmISx7FB4cZqE4qDR/D0usvN+n6vQ4k/dU8Rbb+nGJmiEWtNSCJSjuX5+83Q/ fLDvPYPGSNTJbZmbeMFrcAYqFmsbfSw5Mfrjhtn5LVViW2VuTzqrmf60tsTXBOllYuTf LHVg== X-Gm-Message-State: AOJu0Yxok2PifxCYf+NtFBJ/3I0y2OrCy+N/PsTzY9291EwInDWkPyhU QYxV8DJYjCVyjnb+ZB1Vvc/7opcZQE01lDWa7ht2RO2lCAR5aH6xgWgyrr8+I1i2lSqnRXcnlcN gfD9+Ro97S1zuZ6XYb1Lj5Sqei7tLcuIIK9pg1/oipurZ3u7fBgX9Ug== X-Gm-Gg: AZuq6aKVdHkH1AkEtfk4TV1n2DGGjexGEFfnWFhhdOREXlK+ZXonghs/N6uzlrjF3Jj XGSBoRZvQ4uYncfOVgjrfaESq5JcQXART33VGg8mEzI6ukermXIu8Vp00cdEcZv972Dhfy+hLQe X2j0+LU6cUI7/SMQQuXtnkTisEptg45px14w3NqHxe2daZof/UgUT8hFgwPpIl7t0EP3k3FgzIi 2SNaisDz1SxNTa2UTdeS6eoI7KZ44LdhbEGVo+n6Yfobw83VHvTiRBT9+zaNJ2KJu+wJ6xqoimE L31uX5IEvPPKkxTK0Fk0LEeHx2uOrLKBSHoNEnDNr2NgzxNApKQCMdRlMO7YbMSP5nHFBqP+3TZ K5SmLyUBle2+qmdVeXJFDNNt2xWvkKUkkKKAn X-Received: by 2002:a05:6402:42cd:b0:658:e811:b983 with SMTP id 4fb4d7f45d1cf-65bace1f020mr174989a12.12.1770930484099; Thu, 12 Feb 2026 13:08:04 -0800 (PST) MIME-Version: 1.0 From: KAZAR Ayoub Date: Thu, 12 Feb 2026 22:07:52 +0100 X-Gm-Features: AZwV_QggjahwhvR6cUKE60Mrrkbx59MwXKVXkqX15emnGGXy4LZP3g8wDmJ8Sts Message-ID: Subject: Speed up COPY TO text/CSV parsing using SIMD To: Pg Hackers Cc: Nathan Bossart , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , Mark Wong , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="0000000000006d82d1064aa6e22b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000006d82d1064aa6e22b Content-Type: multipart/alternative; boundary="0000000000006d82cf064aa6e229" --0000000000006d82cf064aa6e229 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello, Following Nazir's recommendation to move this to a different thread so it can be looked at separately. On Thu, Jan 8, 2026 at 2:49=E2=80=AFPM Manni Wood wrote: > On Wed, 24 Dec 2025 at 18:08, KAZAR Ayoub wrote: >>>> > >>>> > Hello, >>>> > Following the same path of optimizing COPY FROM using SIMD, i found >>>> that COPY TO can also benefit from this. >>>> > >>>> > I attached a small patch that uses SIMD to skip data and advance as >>>> far as the first special character is found, then fallback to scalar >>>> processing for that character and re-enter the SIMD path again... >>>> > There's two ways to do this: >>>> > 1) Essentially we do SIMD until we find a special character, then >>>> continue scalar path without re-entering SIMD again. >>>> > - This gives from 10% to 30% speedups depending on the weight of >>>> special characters in the attribute, we don't lose anything here since= it >>>> advances with SIMD until it can't (using the previous scripts: 1/3, 2/= 3 >>>> specials chars). >>>> > >>>> > 2) Do SIMD path, then use scalar path when we hit a special >>>> character, keep re-entering the SIMD path each time. >>>> > - This is equivalent to the COPY FROM story, we'll need to find the >>>> same heuristic to use for both COPY FROM/TO to reduce the regressions = (same >>>> regressions: around from 20% to 30% with 1/3, 2/3 specials chars). >>>> > >>>> > Something else to note is that the scalar path for COPY TO isn't as >>>> heavy as the state machine in COPY FROM. >>>> > >>>> > So if we find the sweet spot for the heuristic, doing the same for >>>> COPY TO will be trivial and always beneficial. >>>> > Attached is 0004 which is option 1 (SIMD without re-entering), 0005 >>>> is the second one. >>> >>> > Ayoub Kazar, I tested your v4 "copy to" patch, doing everything in RAM, > and using the cpupower tips from above. (I wanted to test your v5, but `g= it > apply --check` gave me an error, so I can look at that another day.) > > The results look great: > > master: (forgot to get commit hash) > > text, no special: 8165 > text, 1/3 special: 22662 > csv, no special: 9619 > csv, 1/3 special: 23213 > > v4 (copy to) > > text, no special: 4577 (43.9% speedup) > text, 1/3 special: 22847 (0.8% regression) > csv, no special: 4720 (50.9% speedup) > csv, 1/3 special: 23195 (0.07% regression) > > Seems like a very clear win to me! > -- Manni Wood EDB: https://www.enterprisedb.com > Currently optimizing COPY FROM using SIMD is still under review, but for the case of COPY TO using the same ideas, we found that the problem is trivial, the attached patch gives very nice speedups as confirmed by Manni's benchmarks. Regards, Ayoub --0000000000006d82cf064aa6e229 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,
Following Nazir's recommendation to move this to a different thr= ead so it can be looked at separately.

On Thu, Jan 8, 2026 at 2:49= =E2=80=AFPM Manni Wood <manni.wood@enterprisedb.com> wrote:
On Wed, 24 Dec 2025 at 18:08, KAZAR Ayoub <ma_kazar@esi.dz> wrote:
>
> Hello,
> Following the same path of optimizing COPY FROM using SIMD, i found th= at COPY TO can also benefit from this.
>
> I attached a small patch that uses SIMD to skip data and advance as far as the first special character is found, then fallback to scalar=20 processing for that character and re-enter the SIMD path again...
> There's two ways to do this:
> 1) Essentially we do SIMD until we find a special character, then cont= inue scalar path without re-entering SIMD again.
> - This gives from 10% to 30% speedups depending on the weight of=20 special characters in the attribute, we don't lose anything here since= =20 it advances with SIMD until it can't (using the previous scripts: 1/3,= =20 2/3 specials chars).
>
> 2) Do SIMD path, then use scalar path when we hit a special character,= keep re-entering the SIMD path each time.
> - This is equivalent to the COPY FROM story, we'll need to find th= e same heuristic to use for both COPY FROM/TO to reduce the regressions=20 (same regressions: around from 20% to 30% with 1/3, 2/3 specials chars). >
> Something else to note is that the scalar path for COPY TO isn't a= s heavy as the state machine in COPY FROM.
>
> So if we find the sweet spot for the heuristic, doing the same for COP= Y TO will be trivial and always beneficial.
> Attached is 0004 which is option 1 (SIMD without re-entering), 0005 is= the second one.

Ayoub=20 Kazar, I tested your v4 "copy to" patch, doing everything in RAM,= and=20 using the cpupower tips from above. (I wanted to test your v5, but `git=20 apply --check` gave me an error, so I can look at that another day.)
<= div>
The results look great:

master:= (forgot to get commit hash)

text, no special: 8165
text, 1/3 spe= cial: 22662
csv, no special: 9619
csv, 1/3 special: 23213

v4 (= copy to)

text, no special: 4577 (43.9% speedup)
text, 1/3 special= : 22847 (0.8% regression)
csv, no special: 4720 (50.9% speedup)
csv, = 1/3 special: 23195 (0.07% regression)

Seems like a= very clear win to me!
-- Manni Wood EDB: https://www.enterprisedb.com
Currently optimizing COPY FROM using SIMD is still under revie= w, but for the case of COPY TO using the same ideas, we found that the prob= lem is trivial, the attached patch gives very nice speedups as confirmed by= Manni's benchmarks.


Regards,
Ayoub
--0000000000006d82cf064aa6e229-- --0000000000006d82d1064aa6e22b Content-Type: text/x-patch; charset="US-ASCII"; name="0004-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Disposition: attachment; filename="0004-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mljxz7pz0 RnJvbSBiZmM1ODBiMTdhZDVlNmQ5ODFhZGMxNDZjMjQ2OTBhZmU0NjM0Y2UxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBXZWQsIDI0IERlYyAyMDI1IDEyOjU1OjE1ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyB0ZXh0IENTViB1c2luZyBTSU1ECgotLS0KIHNyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHl0by5jIHwgMTI2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDEg ZmlsZSBjaGFuZ2VkLCAxMjYgaW5zZXJ0aW9ucygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHl0by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKaW5kZXgg ZGFlOTE2MzBhYzMuLmUxMzA2NzI4NTA5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5k cy9jb3B5dG8uYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYwpAQCAtMzEsNiAr MzEsOCBAQAogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgi CiAjaW5jbHVkZSAicGdzdGF0LmgiCisjaW5jbHVkZSAicG9ydC9wZ19iaXR1dGlscy5oIgorI2lu Y2x1ZGUgInBvcnQvc2ltZC5oIgogI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICNpbmNsdWRlICJ0 Y29wL3Rjb3Bwcm90LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCkBAIC0xMjY2LDYg KzEyNjgsMzYgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25z dCBjaGFyICpzdHJpbmcpCiAJaWYgKGNzdGF0ZS0+ZW5jb2RpbmdfZW1iZWRzX2FzY2lpKQogCXsK IAkJc3RhcnQgPSBwdHI7CisJCSNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCXsKKwkJCQljb25zdCBj aGFyKiBlbmQgPSBwdHIgKyBzdHJsZW4ocHRyKTsKKwkJCQl3aGlsZSAocHRyICsgc2l6ZW9mKFZl Y3RvcjgpIDw9IGVuZCkgeworCQkJCQlWZWN0b3I4IGNodW5rOworCQkJCQlWZWN0b3I4IGNvbnRy b2xfbWFzazsKKwkJCQkJVmVjdG9yOCBiYWNrc2xhc2hfbWFzazsKKwkJCQkJVmVjdG9yOCBkZWxp bV9tYXNrOworCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsKKwkJCQkJdWludDMyIG1hc2s7CisK KwkJCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIHB0cik7CisJCQkJCWNv bnRyb2xfbWFzayA9IHZlY3RvcjhfZ3QodmVjdG9yOF9icm9hZGNhc3QoMHgyMCksIGNodW5rKTsK KwkJCQkJYmFja3NsYXNoX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcp LCBjaHVuayk7CisJCQkJCWRlbGltX21hc2sgPSB2ZWN0b3I4X2VxKHZlY3RvcjhfYnJvYWRjYXN0 KGRlbGltYyksIGNodW5rKTsKKworCQkJCQlzcGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKGNvbnRy b2xfbWFzaywgdmVjdG9yOF9vcihiYWNrc2xhc2hfbWFzaywgZGVsaW1fbWFzaykpOworCisJCQkJ CW1hc2sgPSB2ZWN0b3I4X2hpZ2hiaXRfbWFzayhzcGVjaWFsX21hc2spOworCQkJCQlpZiAobWFz ayAhPSAwKSB7CisJCQkJCQlpbnQgYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9vbmVfcG9zMzIobWFz ayk7CisJCQkJCQlwdHIgKz0gYWR2YW5jZTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisKKwkJCQkJ cHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQl9CisJCQl9IAorCQkjZW5kaWYKKwogCQl3aGls ZSAoKGMgPSAqcHRyKSAhPSAnXDAnKQogCQl7CiAJCQlpZiAoKHVuc2lnbmVkIGNoYXIpIGMgPCAo dW5zaWduZWQgY2hhcikgMHgyMCkKQEAgLTEzMjYsNiArMTM1OCwzNiBAQCBDb3B5QXR0cmlidXRl T3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAllbHNlCiAJ ewogCQlzdGFydCA9IHB0cjsKKwkJI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJeworCQkJCWNvbnN0 IGNoYXIqIGVuZCA9IHB0ciArIHN0cmxlbihwdHIpOworCQkJCXdoaWxlIChwdHIgKyBzaXplb2Yo VmVjdG9yOCkgPD0gZW5kKSB7CisJCQkJCVZlY3RvcjggY2h1bms7CisJCQkJCVZlY3RvcjggY29u dHJvbF9tYXNrOworCQkJCQlWZWN0b3I4IGJhY2tzbGFzaF9tYXNrOworCQkJCQlWZWN0b3I4IGRl bGltX21hc2s7CisJCQkJCVZlY3Rvcjggc3BlY2lhbF9tYXNrOworCQkJCQl1aW50MzIgbWFzazsK KworCQkJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgcHRyKTsKKwkJCQkJ Y29udHJvbF9tYXNrID0gdmVjdG9yOF9ndCh2ZWN0b3I4X2Jyb2FkY2FzdCgweDIwKSwgY2h1bmsp OworCQkJCQliYWNrc2xhc2hfbWFzayA9IHZlY3RvcjhfZXEodmVjdG9yOF9icm9hZGNhc3QoJ1xc JyksIGNodW5rKTsKKwkJCQkJZGVsaW1fbWFzayA9IHZlY3RvcjhfZXEodmVjdG9yOF9icm9hZGNh c3QoZGVsaW1jKSwgY2h1bmspOworCisJCQkJCXNwZWNpYWxfbWFzayA9IHZlY3Rvcjhfb3IoY29u dHJvbF9tYXNrLCB2ZWN0b3I4X29yKGJhY2tzbGFzaF9tYXNrLCBkZWxpbV9tYXNrKSk7CisKKwkJ CQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7CisJCQkJCWlmICht YXNrICE9IDApIHsKKwkJCQkJCWludCBhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29uZV9wb3MzMiht YXNrKTsKKwkJCQkJCXB0ciArPSBhZHZhbmNlOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKworCQkJ CQlwdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCX0KKwkJCX0gCisJCSNlbmRpZgorCiAJCXdo aWxlICgoYyA9ICpwdHIpICE9ICdcMCcpCiAJCXsKIAkJCWlmICgodW5zaWduZWQgY2hhcikgYyA8 ICh1bnNpZ25lZCBjaGFyKSAweDIwKQpAQCAtMTQyOCw2ICsxNDkwLDQwIEBAIENvcHlBdHRyaWJ1 dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCXsKIAkJ CWNvbnN0IGNoYXIgKnRwdHIgPSBwdHI7CiAKKwkJCSNpZm5kZWYgVVNFX05PX1NJTUQKKwkJCQl7 CQorCQkJCQljb25zdCBjaGFyKiBlbmQgPSB0cHRyICsgc3RybGVuKHRwdHIpOworCisJCQkJCVZl Y3RvcjggZGVsaW1fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYyk7CisJCQkJCVZlY3Rv cjggcXVvdGVfbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KHF1b3RlYyk7CisJCQkJCVZlY3Rvcjgg bmV3bGluZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJCQkJCVZlY3RvcjggY2Fy cmlhZ2VfcmV0dXJuX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXHInKTsKKworCQkJCQl3aGls ZSAodHB0ciArIHNpemVvZihWZWN0b3I4KSA8PSBlbmQpIHsKKwkJCQkJCVZlY3RvcjggY2h1bms7 CisJCQkJCQlWZWN0b3I4IHNwZWNpYWxfbWFzazsKKwkJCQkJCXVpbnQzMiBtYXNrOworCisJCQkJ CQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgdHB0cik7CisJCQkJCQlzcGVj aWFsX21hc2sgPSB2ZWN0b3I4X29yKAorCQkJCQkJCXZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVu aywgZGVsaW1fbWFzayksCisJCQkJCQkJCQkgICB2ZWN0b3I4X2VxKGNodW5rLCBxdW90ZV9tYXNr KSksCisJCQkJCQkJdmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBuZXdsaW5lX21hc2spLAor CQkJCQkJCQkJICAgdmVjdG9yOF9lcShjaHVuaywgY2FycmlhZ2VfcmV0dXJuX21hc2spKQorCQkJ CQkJKTsKKworCQkJCQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxfbWFzayk7 CisJCQkJCQlpZiAobWFzayAhPSAwKSB7CisJCQkJCQkJdHB0ciArPSBwZ19yaWdodG1vc3Rfb25l X3BvczMyKG1hc2spOworCQkJCQkJCXVzZV9xdW90ZSA9IHRydWU7CisJCQkJCQkJYnJlYWs7CisJ CQkJCQl9CisKKwkJCQkJCXRwdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCQl9CisJCQkJfQor CQkJI2VuZGlmCisKIAkJCXdoaWxlICgoYyA9ICp0cHRyKSAhPSAnXDAnKQogCQkJewogCQkJCWlm IChjID09IGRlbGltYyB8fCBjID09IHF1b3RlYyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHInKQpA QCAtMTQ1MSw2ICsxNTQ3LDM2IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0 YXRlLCBjb25zdCBjaGFyICpzdHJpbmcsCiAJCSAqIFdlIGFkb3B0IHRoZSBzYW1lIG9wdGltaXph dGlvbiBzdHJhdGVneSBhcyBpbiBDb3B5QXR0cmlidXRlT3V0VGV4dAogCQkgKi8KIAkJc3RhcnQg PSBwdHI7CisKKwkJI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJewkKKwkJCQljb25zdCBjaGFyKiBl bmQgPSBwdHIgKyBzdHJsZW4ocHRyKTsKKworCQkJCVZlY3RvcjggZXNjYXBlX21hc2sgPSB2ZWN0 b3I4X2Jyb2FkY2FzdChlc2NhcGVjKTsKKwkJCQlWZWN0b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4 X2Jyb2FkY2FzdChxdW90ZWMpOworCisJCQkJd2hpbGUgKHB0ciArIHNpemVvZihWZWN0b3I4KSA8 PSBlbmQpIHsKKwkJCQkJVmVjdG9yOCBjaHVuazsKKwkJCQkJVmVjdG9yOCBzcGVjaWFsX21hc2s7 CisJCQkJCXVpbnQzMiBtYXNrOworCisJCQkJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25zdCB1 aW50OCAqKSBwdHIpOworCQkJCQlzcGVjaWFsX21hc2sgPSB2ZWN0b3I4X29yKAorCQkJCQkJdmVj dG9yOF9lcShjaHVuaywgZXNjYXBlX21hc2spLCAKKwkJCQkJCQl2ZWN0b3I4X2VxKGNodW5rLCBx dW90ZV9tYXNrKSk7CisKKwkJCQkJbWFzayA9IHZlY3RvcjhfaGlnaGJpdF9tYXNrKHNwZWNpYWxf bWFzayk7CisJCQkJCWlmIChtYXNrICE9IDApIHsKKwkJCQkJCXB0ciArPSBwZ19yaWdodG1vc3Rf b25lX3BvczMyKG1hc2spOworCQkJCQkJdXNlX3F1b3RlID0gdHJ1ZTsKKwkJCQkJCWJyZWFrOwor CQkJCQl9CisKKwkJCQkJcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQl9CisJCQl9CisJCSNl bmRpZgorCQkKIAkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKGMgPT0g cXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0gCjIuMzQuMQoK --0000000000006d82d1064aa6e22b--