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 1w7xpp-0004wq-0R for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 15:50:25 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7xpn-001Dba-3D for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 15:50:24 +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 1w7xpn-001DbQ-22 for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 15:50:24 +0000 Received: from mail-dy1-x1330.google.com ([2607:f8b0:4864:20::1330]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7xpk-000000002Ps-49zV for pgsql-hackers@postgresql.org; Wed, 01 Apr 2026 15:50:23 +0000 Received: by mail-dy1-x1330.google.com with SMTP id 5a478bee46e88-2c4db6bca03so661406eec.1 for ; Wed, 01 Apr 2026 08:50:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775058618; x=1775663418; darn=postgresql.org; h=in-reply-to:references:mime-version:subject:cc:to:from:message-id :date:from:to:cc:subject:date:message-id:reply-to; bh=wtyZfzXy/nXIJazeFHWpZ7QfwvaBD1ms8jqE8tkQfPA=; b=Ui16fH+BFgRkOdnpfNLg+hHrPqbyVgmGyYtcCbtbc49sx/a1WzNiA19Q+HwPe73M45 YL/bH/jFQRNcy/XGh3jfZHp6wYtCpRCykdWyNlTFT+konOg6OZhxWTpv5hmR9D5oJC6z Awyat6DK7/JI3opE1XtNu7+xADnXJcoUxoWGYOU8F1RAxJhTvpI80M+q2zynWQlsAOI8 r6g2m0zHVQMXzHm6Kamgh2tt9EBtwf3MUKJqIrp2QdeoiKj1qWyybfmsf8n56QX0xV3H 6L8RirzC+n7f0jVmMCvOBR95LGzGzfP7zE8i1HqWRsc45AW2lEx5mzwiM3AIESo4+lyK xfsA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775058618; x=1775663418; h=in-reply-to:references:mime-version:subject:cc:to:from:message-id :date:x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=wtyZfzXy/nXIJazeFHWpZ7QfwvaBD1ms8jqE8tkQfPA=; b=c4EfksuISdOrxD5CZuEWYopSEq8omp4BjK8FjR5aWAWT88uPE6KWhEpSh/FZxHpDN0 YXB2tZA5xkb81PT7NQ3ay/hYtfQQF8VHCWxQwhuSncuTPASLTLNxsO/6BqTTNoOLo0Tz URt7Ho65BcmK2oTAcArMAlAq85LlbEFXmWMYqtstWIQ6hKmFE2Voz4sT6vHUB4HBU6/+ eXObN7i1Ks1BVyqfxxdGxOB9h3ueaHlpfiBBYRNEIudMw3NyPAYF0OJDKn6NLsS+wejt 58RgUG1rWWec/RXnOyBtRG5l7G+2A+o0jFtAAOhqAJAoVr7y9O8WnCSxE61wQZHLIsAW kx2Q== X-Forwarded-Encrypted: i=1; AJvYcCVoDL8pIrwVCBUh1v4YSat5UFTWOCdEGmgrT7McyGMlwtkYSRA3iAKg1RnfFg4gveivO3pvpU1EkGdv9uQm@postgresql.org X-Gm-Message-State: AOJu0YxXvPrbQ3F5+9ncUKWLvfRbmHvo1oUUsMg4KeYRS2FPsnjd939z XqhWa/qQ4QWJWiEoMic/EuOuNe/qAfPt4vi5sNGKgwSR7J9gOwRHv8F7 X-Gm-Gg: ATEYQzzvWr6capaO2z59dx2NZ3coJNztag7j2Rli6X56gOdIQGPX+igclo9YnV8GNSM iRHoVSuVioI5Pn5FDEXrpP3bosh+EADaoYft9oVanvDSBgSLqvWsXoDRslvGWlU9yq7s30RE79x nHNtf+Vpy8ZqXHotlWM9jtGr97GPeao0FPq4iDXyYw7aCM8aNXBAbpe6KKTQCeANg3dqq2ZcmAl veYN1eXOt3/A9x0Mb22OX+O29tl+CVSmU4o3PPonGAY/wbP5rdZg3QNWtfQKsO7N2D/H2l62o4e l4K3xIDGbG2GNbc0Si1EQs7wL2LVdgCadLbMHJ7jUfwX2okjlVBi+ORfvaHvv6DWF7yIK1hJFp0 YmWThPZaQ19nGc12osvflg489GtJx1rH4OXQdAGEltwUYaoEKaQdfRs5vC2kR0o2YnV36BVd7Qj /4ClWMn/H8rtVc0JosPpnz0NM6KPYDp2WByX8Px01wZpkVIA== X-Received: by 2002:a05:7301:1289:b0:2c5:c532:1fe1 with SMTP id 5a478bee46e88-2c7baf44296mr3691106eec.3.1775058618394; Wed, 01 Apr 2026 08:50:18 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:5d38:f778:e9e8:f3af]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-2ca7caeb83dsm86528eec.22.2026.04.01.08.50.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 01 Apr 2026 08:50:17 -0700 (PDT) Content-Type: multipart/mixed; boundary=d0d1e43ef87c946f54e6331411e128dfdde554237d9207ccbaf3f8422744 Date: Wed, 01 Apr 2026 12:50:14 -0300 Message-Id: From: "Matheus Alcantara" To: "Masahiko Sawada" Cc: "Andrew Dunstan" , "jian he" , "Tomas Vondra" , Subject: Re: postgres_fdw: Use COPY to speed up batch inserts Mime-Version: 1.0 X-Mailer: aerc 0.21.0 References: <5c52f4c7-74fa-4594-8378-53fd49f39329@dunslane.net> <72ec1708-0c02-4ae9-b4f5-ee2bac5fd2f3@gmail.com> In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --d0d1e43ef87c946f54e6331411e128dfdde554237d9207ccbaf3f8422744 Content-Type: multipart/alternative; boundary=598deef07232351f076f319149d29c5d7e0a5d0b6abcc879259cce77bb27 --598deef07232351f076f319149d29c5d7e0a5d0b6abcc879259cce77bb27 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Mon Mar 30, 2026 at 4:14 PM -03, Masahiko Sawada wrote: >> Please see the new attached version. > > I've reviewed the v12 patch, and here are review comments: > > The COPY data sent via postgres_fdw should properly escape the input > data. The bug I found can be reproduced with the following scenario: > > -- on local server > create server remote foreign data wrapper postgres_fdw; > create foreign table t (a int, b text) server remote; > create user mapping for public server remote; > > -- on remote server > create table t (a int, b text); > > -- on local server > copy t(a, d) from stdin; > Enter data to be copied followed by a newline. > End with a backslash and a period on a line by itself, or an EOF signal. >>> 1 hello\nworld >>> \. > ERROR: invalid input syntax for type integer: "world" > CONTEXT: COPY t, line 2, column a: "world" > remote SQL command: COPY public.t(a, d) FROM STDIN (FORMAT TEXT) > I think that we need something like CopyAttributeOutText() here.=20 To fix this I've added appendStringInfoText() which is a similar version of CopyAttributeOutText() that works with a StringInfo. I did not find any function that I could reuse here, if such function exists please let me know. I'm wondering if we should have this similar function or try to combine both to avoid duplicated logic, although it looks complicated to me at first look to combine these both usages. Another option is to use the BINARY format, but it is less portable compared to the TEXT format across machines architectures and PostgreSQL versions [1]. For CSV we can just wrap the string into ' but I think that we can have a performance issue. What do you think? I've also quickly benchmarked this change and I've got very similar execution time, with and without this change. > --- > I think the patch misses calling set_transmission_modes() and > reset_transmission_modes() when converting the tuple slots. A > problematic scenario is: > > -- on local server > create server remote foreign data wrapper postgres_fdw; > create foreign table f (a float) server remote; > create user mapping for public server remote; > > -- on remote server > create table f (a float); > > -- on local server > set extra_float_digits =3D 0; > copy test_float from stdin; > 1.0000000000000002 > \. > select * from f; > a > ---- > 1 > (1 row) > IIUC the correct output on this case should still be 1 if we did not reset extra_float_digits, right? postgres=3D# create table xxx(a float); CREATE TABLE postgres=3D# set extra_float_digits =3D 0; SET postgres=3D# copy xxx from stdin; 1.0000000000000002 \. COPY 1 postgres=3D# select * from xxx; a --- 1 (1 row) postgres=3D# reset extra_float_digits; RESET postgres=3D# select * from xxx; a -------------------- 1.0000000000000002 (1 row) But you are right that set_transmission_modes() call is missing and without it we will send "1" for the foreign server and it will lost the actual value. I've fixed this on the new version. > --- > + > + appendStringInfo(buf, "COPY "); > + deparseRelation(buf, rel); > + if (nattrs > 0) > + appendStringInfo(buf, "("); > > appendStringInfoString() or appendStringInfoChar() should be used instead= . > Fixed. Thank you for reviewing this patch! [1] https://www.postgresql.org/docs/current/sql-copy.html#SQL-COPY-FILE-FOR= MATS -- Matheus Alcantara EDB: https://www.enterprisedb.com --598deef07232351f076f319149d29c5d7e0a5d0b6abcc879259cce77bb27-- --d0d1e43ef87c946f54e6331411e128dfdde554237d9207ccbaf3f8422744 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v13-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch Content-Type: text/plain; charset=utf-8; name=v13-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch RnJvbSBjMzQ0YzViYTNkM2Q3YzBlMGU5ZjQ3ZTI3OTQ0MmNiYzdmMjUyYTZkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjggSmFuIDIwMjYgMTk6NTU6NDggLTAzMDAKU3ViamVjdDogW1BBVENIIHYxM10g cG9zdGdyZXNfZmR3OiBVc2UgQ09QWSBhcyByZW1vdGUgU1FMIHdoZW4gcG9zc2libGUKClByZXZp b3VzbHkgd2hlbiBhbiB1c2VyIGV4ZWN1dGUgYSBDT1BZIG9uIGEgZm9yZWlnbiB0YWJsZSwgcG9z dGdyZXNfZmR3CnNlbmQgYSBJTlNFUlQgYXMgYSByZW1vdGUgU1FMIHRvIHRoZSBmb3JlaWduIHNl cnZlci4gVGhpcyBjb21taXQKaW50cm9kdWNlIHRoZSBhYmlsaXR5IHRvIHVzZSB0aGUgQ09QWSBj b21tYW5kIGluc3RlYWQuCgpUaGUgQ09QWSBjb21tYW5kIHdpbGwgb25seSBiZSB1c2VkIHdoZW4g YW4gdXNlciBleGVjdXRlIGEgQ09QWSBvbiBhCmZvcmVpZ24gdGFibGUgYW5kIGFsc28gdGhlIGZv cmVpZ24gdGFibGUgc2hvdWxkIG5vdCBoYXZlIHRyaWdnZXJzCmJlY2F1c2UgcmVtb3RlIHRyaWdn ZXJzIG1pZ2h0IG1vZGlmeSB0aGUgaW5zZXJ0ZWQgcm93IGFuZCBzaW5jZSBDT1BZCmRvZXMgbm90 IHN1cHBvcnQgYSBSRVRVUk5JTkcgY2xhdXNlLCB3ZSBjYW5ub3Qgc3luY2hyb25pemUgdGhlIGxv Y2FsClR1cGxlVGFibGVTbG90IHdpdGggdGhvc2UgY2hhbmdlcyBmb3IgdXNlIGluIGxvY2FsIEFG VEVSIHRyaWdnZXJzLCBzbyBpZgp0aGUgZm9yZWlnbiB0YWJsZSBoYXMgYW55IHRyaWdnZXIgSU5T RVJUIHdpbGwgYmUgdXNlZC4KCkF1dGhvcjogTWF0aGV1cyBBbGNhbnRhcmEgPG10aHMuZGV2QHBt Lm1lPgpSZXZpZXdlZC1CeTogVG9tYXMgVm9uZHJhIDx0b21hc0B2b25kcmEubWU+ClJldmlld2Vk LUJ5OiBKYWt1YiBXYXJ0YWsgPGpha3ViLndhcnRha0BlbnRlcnByaXNlZGIuY29tPgpSZXZpZXdl ZC1CeTogamlhbiBoZSA8amlhbi51bml2ZXJzYWxpdHlAZ21haWwuY29tPgpSZXZpZXdlZC1CeTog RGV3ZWkgRGFpIDxkYWlkZXdlaTE5NzBAMTYzLmNvbT4KUmV2aWV3ZWQtQnk6IE1hc2FoaWtvIFNh d2FkYSA8c2F3YWRhLm1zaGtAZ21haWwuY29tPgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9z dGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0RESVpKMjE3T1VESy4yUjVXRTRPR0w1UFRZJTQw Z21haWwuY29tCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jICAgICAgICAgICAg ICAgIHwgIDU2ICsrKysKIC4uLi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91 dCAgICB8ICA2NCArKysrLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgICAg ICAgICAgIHwgMjY1ICsrKysrKysrKysrKysrKysrLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9z dGdyZXNfZmR3LmggICAgICAgICAgIHwgICAxICsKIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9w b3N0Z3Jlc19mZHcuc3FsICAgICB8ICA3MiArKysrKwogNSBmaWxlcyBjaGFuZ2VkLCA0NDkgaW5z ZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVz X2Zkdy9kZXBhcnNlLmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKaW5kZXggYzE1 OWVjZDE1NTguLjljYTBiMDVjNzcxIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9k ZXBhcnNlLmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCkBAIC0yMTc3LDYg KzIxNzcsNjIgQEAgZGVwYXJzZUluc2VydFNxbChTdHJpbmdJbmZvIGJ1ZiwgUmFuZ2VUYmxFbnRy eSAqcnRlLAogCQkJCQkJIHdpdGhDaGVja09wdGlvbkxpc3QsIHJldHVybmluZ0xpc3QsIHJldHJp ZXZlZF9hdHRycyk7CiB9CiAKKy8qCisgKiAgQnVpbGQgYSBDT1BZIEZST00gU1RESU4gc3RhdGVt ZW50IHVzaW5nIHRoZSBURVhUIGZvcm1hdAorICovCit2b2lkCitkZXBhcnNlQ29weVNxbChTdHJp bmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBMaXN0ICp0YXJnZXRfYXR0cnMpCit7CisJT2lkCQkJ cmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbCk7CisJVHVwbGVEZXNjCXR1cGRlc2MgPSBSZWxh dGlvbkdldERlc2NyKHJlbCk7CisJYm9vbAkJZmlyc3QgPSB0cnVlOworCWludAkJCW5hdHRycyA9 IGxpc3RfbGVuZ3RoKHRhcmdldF9hdHRycyk7CisKKwlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIkNP UFkgIik7CisJZGVwYXJzZVJlbGF0aW9uKGJ1ZiwgcmVsKTsKKwlpZiAobmF0dHJzID4gMCkKKwkJ YXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKCcpOworCisJZm9yZWFjaF9pbnQoYXR0bnVtLCB0 YXJnZXRfYXR0cnMpCisJeworCQlGb3JtX3BnX2F0dHJpYnV0ZSBhdHRyID0gVHVwbGVEZXNjQXR0 cih0dXBkZXNjLCBhdHRudW0gLSAxKTsKKwkJY2hhcgkgICAqY29sbmFtZTsKKwkJTGlzdAkgICAq b3B0aW9uczsKKwkJTGlzdENlbGwgICAqbGM7CisKKwkJaWYgKGF0dHItPmF0dGdlbmVyYXRlZCkK KwkJCWNvbnRpbnVlOworCisJCWlmICghZmlyc3QpCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIiwgIik7CisKKwkJZmlyc3QgPSBmYWxzZTsKKworCQkvKiBVc2UgYXR0cmlidXRlIG5h bWUgb3IgY29sdW1uX25hbWUgb3B0aW9uLiAqLworCQljb2xuYW1lID0gTmFtZVN0cihhdHRyLT5h dHRuYW1lKTsKKwkJb3B0aW9ucyA9IEdldEZvcmVpZ25Db2x1bW5PcHRpb25zKHJlbGlkLCBhdHRu dW0pOworCQlmb3JlYWNoKGxjLCBvcHRpb25zKQorCQl7CisJCQlEZWZFbGVtICAgICpkZWYgPSAo RGVmRWxlbSAqKSBsZmlyc3QobGMpOworCisJCQlpZiAoc3RyY21wKGRlZi0+ZGVmbmFtZSwgImNv bHVtbl9uYW1lIikgPT0gMCkKKwkJCXsKKwkJCQljb2xuYW1lID0gZGVmR2V0U3RyaW5nKGRlZik7 CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1Ziwg cXVvdGVfaWRlbnRpZmllcihjb2xuYW1lKSk7CisJfQorCWlmIChuYXR0cnMgPiAwKQorCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIikgRlJPTSBTVERJTiIpOworCWVsc2UKKwkJYXBwZW5k U3RyaW5nSW5mb1N0cmluZyhidWYsICIgRlJPTSBTVERJTiIpOworCisJYXBwZW5kU3RyaW5nSW5m b1N0cmluZyhidWYsICIgKEZPUk1BVCBURVhUKSIpOworfQorCisKIC8qCiAgKiByZWJ1aWxkIHJl bW90ZSBJTlNFUlQgc3RhdGVtZW50CiAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVj dGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggMGY1MjcxZDQ3NmUuLmQ0ZTNkZmY0N2EwIDEwMDY0 NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0Cisr KyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKQEAgLTc2 MTEsNiArNzYxMSwyOCBAQCBzZWxlY3QgKiBmcm9tIGdyZW0xOwogKDIgcm93cykKIAogZGVsZXRl IGZyb20gZ3JlbTE7CistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBhcyBhIHJl bW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworY3JlYXRlIGZ1bmN0 aW9uIGluc2VydF9vcl9jb3B5KCkgcmV0dXJucyB0cmlnZ2VyIGFzICQkCitkZWNsYXJlIHF1ZXJ5 IHRleHQ7CitiZWdpbgorICAgIHF1ZXJ5IDo9IGN1cnJlbnRfcXVlcnkoKTsKKyAgICByYWlzZSBu b3RpY2UgJyUnLCBxdWVyeTsKK3JldHVybiBuZXc7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3Fs OworQ1JFQVRFIFRSSUdHRVIgdHJpZ19yb3dfYmVmb3JlCitCRUZPUkUgSU5TRVJUIE9SIFVQREFU RSBPUiBERUxFVEUgT04gZ2xvYzEKK0ZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSBpbnNl cnRfb3JfY29weSgpOworY29weSBncmVtMSBmcm9tIHN0ZGluOworTE9HOiAgcmVjZWl2ZWQgbWVz c2FnZSB2aWEgcmVtb3RlIGNvbm5lY3Rpb246IE5PVElDRTogIENPUFkgcHVibGljLmdsb2MxKGEp IEZST00gU1RESU4gKEZPUk1BVCBURVhUKQorZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBv biBnbG9jMTsKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CistLSB0ZXN0IHRoYXQgY29weSBk b2VzIG5vdCBmYWlsIHdpdGggY29sdW1uX25hbWUgYWxpYXMKK2NyZWF0ZSB0YWJsZSBnbG9jMih4 eHggaW50KTsKK2NyZWF0ZSBmb3JlaWduIHRhYmxlIGdyZW0yKGEgaW50KSBzZXJ2ZXIgbG9vcGJh Y2sgb3B0aW9ucyh0YWJsZV9uYW1lICdnbG9jMicpOworYWx0ZXIgZm9yZWlnbiB0YWJsZSBncmVt MiBhbHRlciBjb2x1bW4gYSBvcHRpb25zIChjb2x1bW5fbmFtZSAneHh4Jyk7Citjb3B5IGdyZW0y IGZyb20gc3RkaW47CiAtLSB0ZXN0IGJhdGNoIGluc2VydAogYWx0ZXIgc2VydmVyIGxvb3BiYWNr IG9wdGlvbnMgKGFkZCBiYXRjaF9zaXplICcxMCcpOwogZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQpAQCAtNzYyOCwxNiArNzY1MCwxOCBAQCBpbnNlcnQgaW50byBncmVtMSAoYSkgdmFsdWVz ICgxKSwgKDIpOwogc2VsZWN0ICogZnJvbSBnbG9jMTsKICBhIHwgYiB8IGMgCiAtLS0rLS0tKy0t LQorIDMgfCA2IHwgIAogIDEgfCAyIHwgIAogIDIgfCA0IHwgIAotKDIgcm93cykKKygzIHJvd3Mp CiAKIHNlbGVjdCAqIGZyb20gZ3JlbTE7CiAgYSB8IGIgfCBjIAogLS0tKy0tLSstLS0KKyAzIHwg NiB8IDkKICAxIHwgMiB8IDMKICAyIHwgNCB8IDYKLSgyIHJvd3MpCisoMyByb3dzKQogCiBkZWxl dGUgZnJvbSBncmVtMTsKIC0tIGJhdGNoIGluc2VydCB3aXRoIGZvcmVpZ24gcGFydGl0aW9ucy4K QEAgLTc2NjIsNiArNzY4NiwxMiBAQCBzZWxlY3QgY291bnQoKikgZnJvbSB0YWJfYmF0Y2hfc2hh cmRlZDsKIGRyb3AgdGFibGUgdGFiX2JhdGNoX2xvY2FsOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hf c2hhcmRlZDsKIGRyb3AgdGFibGUgdGFiX2JhdGNoX3NoYXJkZWRfcDFfcmVtb3RlOworLS0gdGVz dCBiYXRjaCBpbnNlcnQgdXNpbmcgY29weQorc2V0IGNsaWVudF9taW5fbWVzc2FnZXMgdG8gJ2Rl YnVnMSc7Citjb3B5IGdyZW0xIGZyb20gc3RkaW47CitERUJVRzogIGZvcmVpZ24gbW9kaWZ5IHdp dGggQ09QWSBiYXRjaF9zaXplOiAxMAorREVCVUc6ICBmb3JlaWduIG1vZGlmeSB3aXRoIENPUFkg YmF0Y2hfc2l6ZTogMTAKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CiBhbHRlciBzZXJ2ZXIg bG9vcGJhY2sgb3B0aW9ucyAoZHJvcCBiYXRjaF9zaXplKTsKIC0tID09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIHRl c3QgbG9jYWwgdHJpZ2dlcnMKQEAgLTk1NTIsNyArOTU4Miw4IEBAIGNvcHkgcmVtMiBmcm9tIHN0 ZGluOwogY29weSByZW0yIGZyb20gc3RkaW47IC0tIEVSUk9SCiBFUlJPUjogIG5ldyByb3cgZm9y IHJlbGF0aW9uICJsb2MyIiB2aW9sYXRlcyBjaGVjayBjb25zdHJhaW50ICJsb2MyX2YxcG9zaXRp dmUiCiBERVRBSUw6ICBGYWlsaW5nIHJvdyBjb250YWlucyAoLTEsIHh5enp5KS4KLUNPTlRFWFQ6 ICByZW1vdGUgU1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRPIHB1YmxpYy5sb2MyKGYxLCBmMikgVkFM VUVTICgkMSwgJDIpCitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3Jl bW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZP Uk1BVCBURVhUKQogQ09QWSByZW0yLCBsaW5lIDE6ICItMQl4eXp6eSIKIHNlbGVjdCAqIGZyb20g cmVtMjsKICBmMSB8IGYyICAKQEAgLTk3MDksNyArOTc0MCw4IEBAIGNvcHkgcmVtMiBmcm9tIHN0 ZGluOwogY29weSByZW0yIGZyb20gc3RkaW47IC0tIEVSUk9SCiBFUlJPUjogIG5ldyByb3cgZm9y IHJlbGF0aW9uICJsb2MyIiB2aW9sYXRlcyBjaGVjayBjb25zdHJhaW50ICJsb2MyX2YxcG9zaXRp dmUiCiBERVRBSUw6ICBGYWlsaW5nIHJvdyBjb250YWlucyAoLTEsIHh5enp5KS4KLUNPTlRFWFQ6 ICByZW1vdGUgU1FMIGNvbW1hbmQ6IElOU0VSVCBJTlRPIHB1YmxpYy5sb2MyKGYxLCBmMikgVkFM VUVTICgkMSwgJDIpCitDT05URVhUOiAgQ09QWSBsb2MyLCBsaW5lIDE6ICItMQl4eXp6eSIKK3Jl bW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwgZjIpIEZST00gU1RESU4gKEZP Uk1BVCBURVhUKQogQ09QWSByZW0yCiBzZWxlY3QgKiBmcm9tIHJlbTI7CiAgZjEgfCBmMiAgCkBA IC05NzQ4LDYgKzk3ODAsMzAgQEAgc2VsZWN0ICogZnJvbSByZW0yOwogCiBkcm9wIHRyaWdnZXIg dHJpZ19udWxsIG9uIGxvYzI7CiBkZWxldGUgZnJvbSByZW0yOworLS0gVGVzdCBDT1BZIEZST00g d2l0aCBjb2x1bW4gbGlzdCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzCitjb3B5IHJlbTIgKGYxLCBm MikgZnJvbSBzdGRpbjsKK3NlbGVjdCAqIGZyb20gcmVtMjsKKyBmMSB8ICBmMiAgIAorLS0tLSst LS0tLS0tCisgIDEgfCBoZWxsbysKKyAgICB8IHdvcmxkCisoMSByb3cpCisKK2RlbGV0ZSBmcm9t IHJlbTI7CistLSBUZXN0IHRoYXQgZmxvYXQgbnVtYmVycyBkbyBub3QgbG9vc2UgcHJlY2lzaW9u IHdoZW4gc2VuZGluZyB0byB0aGUgZm9yZWlnbgorLS0gc2VydmVyCitjcmVhdGUgdGFibGUgZihh IGZsb2F0KTsKK2NyZWF0ZSBmb3JlaWduIHRhYmxlIGZfZmR3KGEgZmxvYXQpIHNlcnZlciBsb29w YmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2YnKTsKK3NldCBleHRyYV9mbG9hdF9kaWdpdHMgPSAw OworY29weSBmX2ZkdyBmcm9tIHN0ZGluOworcmVzZXQgZXh0cmFfZmxvYXRfZGlnaXRzOworc2Vs ZWN0ICogZnJvbSBmOworICAgICAgICAgYSAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t CisgMS4wMDAwMDAwMDAwMDAwMDAyCisoMSByb3cpCisKK2Ryb3AgdGFibGUgZjsKIC0tIENoZWNr IHdpdGggemVyby1jb2x1bW4gZm9yZWlnbiB0YWJsZTsgYmF0Y2ggaW5zZXJ0IHdpbGwgYmUgZGlz YWJsZWQKIGFsdGVyIHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjE7CiBhbHRlciB0YWJsZSBsb2My IGRyb3AgY29sdW1uIGYyOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdy ZXNfZmR3LmMgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYwppbmRleCA0MWU0 N2NjNzk1Yi4uYzBlN2M1ZDZmZGUgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bv c3RncmVzX2Zkdy5jCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCkBA IC02NCw2ICs2NCw5IEBAIFBHX01PRFVMRV9NQUdJQ19FWFQoCiAvKiBJZiBubyByZW1vdGUgZXN0 aW1hdGVzLCBhc3N1bWUgYSBzb3J0IGNvc3RzIDIwJSBleHRyYSAqLwogI2RlZmluZSBERUZBVUxU X0ZEV19TT1JUX01VTFRJUExJRVIgMS4yCiAKKy8qIEJ1ZmZlciBzaXplIHRvIHNlbmQgQ09QWSBJ TiBkYXRhKi8KKyNkZWZpbmUgQ09QWUJVRlNJWiA4MTkyCisKIC8qCiAgKiBJbmRleGVzIG9mIEZE Vy1wcml2YXRlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBmZHdfcHJpdmF0ZSBsaXN0cy4KICAqCkBA IC0xOTksNiArMjAyLDggQEAgdHlwZWRlZiBzdHJ1Y3QgUGdGZHdNb2RpZnlTdGF0ZQogCWJvb2wJ CWhhc19yZXR1cm5pbmc7CS8qIGlzIHRoZXJlIGEgUkVUVVJOSU5HIGNsYXVzZT8gKi8KIAlMaXN0 CSAgICpyZXRyaWV2ZWRfYXR0cnM7CS8qIGF0dHIgbnVtYmVycyByZXRyaWV2ZWQgYnkgUkVUVVJO SU5HICovCiAKKwlib29sCQl1c2VfY29weTsKKwogCS8qIGluZm8gYWJvdXQgcGFyYW1ldGVycyBm b3IgcHJlcGFyZWQgc3RhdGVtZW50ICovCiAJQXR0ck51bWJlcgljdGlkQXR0bm87CQkvKiBhdHRu dW0gb2YgaW5wdXQgcmVzanVuayBjdGlkIGNvbHVtbiAqLwogCWludAkJCXBfbnVtczsJCQkvKiBu dW1iZXIgb2YgcGFyYW1ldGVycyB0byB0cmFuc21pdCAqLwpAQCAtNTQ2LDYgKzU1MSwxMyBAQCBz dGF0aWMgdm9pZCBtZXJnZV9mZHdfb3B0aW9ucyhQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvLAog CQkJCQkJCSAgY29uc3QgUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mb19vLAogCQkJCQkJCSAgY29u c3QgUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mb19pKTsKIHN0YXRpYyBpbnQJZ2V0X2JhdGNoX3Np emVfb3B0aW9uKFJlbGF0aW9uIHJlbCk7CitzdGF0aWMgVHVwbGVUYWJsZVNsb3QgKipleGVjdXRl X2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHkoUGdGZHdNb2RpZnlTdGF0ZSAqZm1zdGF0ZSwKKwkJ CQkJCQkJCQkJCQkJICBUdXBsZVRhYmxlU2xvdCAqKnNsb3RzLAorCQkJCQkJCQkJCQkJCQkgIGlu dCAqbnVtU2xvdHMpOworc3RhdGljIHZvaWQgY29udmVydF9zbG90X3RvX2NvcHlfdGV4dChTdHJp bmdJbmZvIGJ1ZiwKKwkJCQkJCQkJCSAgUGdGZHdNb2RpZnlTdGF0ZSAqZm1zdGF0ZSwKKwkJCQkJ CQkJCSAgVHVwbGVUYWJsZVNsb3QgKnNsb3QpOworc3RhdGljIHZvaWQgYXBwZW5kU3RyaW5nSW5m b1RleHQoU3RyaW5nSW5mbyBidWYsIGNvbnN0IGNoYXIgKnN0cmluZyk7CiAKIAogLyoKQEAgLTIx NjYsMTEgKzIxNzgsMTIgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25JbnNlcnQoTW9kaWZ5VGFibGVT dGF0ZSAqbXRzdGF0ZSwKIAlSYW5nZVRibEVudHJ5ICpydGU7CiAJVHVwbGVEZXNjCXR1cGRlc2Mg PSBSZWxhdGlvbkdldERlc2NyKHJlbCk7CiAJaW50CQkJYXR0bnVtOwotCWludAkJCXZhbHVlc19l bmRfbGVuOworCWludAkJCXZhbHVlc19lbmRfbGVuID0gMDsKIAlTdHJpbmdJbmZvRGF0YSBzcWw7 CiAJTGlzdAkgICAqdGFyZ2V0QXR0cnMgPSBOSUw7CiAJTGlzdAkgICAqcmV0cmlldmVkX2F0dHJz ID0gTklMOwogCWJvb2wJCWRvTm90aGluZyA9IGZhbHNlOworCWJvb2wJCXVzZUNvcHkgPSBmYWxz ZTsKIAogCS8qCiAJICogSWYgdGhlIGZvcmVpZ24gdGFibGUgd2UgYXJlIGFib3V0IHRvIGluc2Vy dCByb3V0ZWQgcm93cyBpbnRvIGlzIGFsc28gYW4KQEAgLTIyNDgsMTEgKzIyNjEsNDMgQEAgcG9z dGdyZXNCZWdpbkZvcmVpZ25JbnNlcnQoTW9kaWZ5VGFibGVTdGF0ZSAqbXRzdGF0ZSwKIAkJcnRl ID0gZXhlY19ydF9mZXRjaChyZXN1bHRSZWxhdGlvbiwgZXN0YXRlKTsKIAl9CiAKKwkvKgorCSAq IFdlIGNhbiB1c2UgQ09QWSBmb3IgcmVtb3RlIGluc2VydHMgb25seSBpZiBhbGwgdGhlIGZvbGxv d2luZyBjb25kaXRpb25zCisJICogYXJlIG1ldDoKKwkgKgorCSAqIERpcmVjdCBFeGVjdXRpb246 IFRoZSBjb21tYW5kIGlzIGEgQ09QWSBGUk9NIG9uIHRoZSBmb3JlaWduIHRhYmxlCisJICogaXRz ZWxmLCBub3QgcGFydCBvZiBhIHBhcnRpdGlvbmVkIHRhYmxlJ3MgdHVwbGUgcm91dGluZy4gKAor CSAqIHJlc3VsdFJlbEluZm8tPnJpX1Jvb3RSZXN1bHRSZWxJbmZvID09IE5VTEwpCisJICoKKwkg KiBObyBDaGVjayBPcHRpb25zOiBUaGVyZSBhcmUgbm8gV0lUSCBDSEVDSyBPUFRJT04gY29uc3Ry YWludHMgb3IKKwkgKiBSb3ctTGV2ZWwgU2VjdXJpdHkgcG9saWNpZXMgdGhhdCBuZWVkIHRvIGJl IGVuZm9yY2VkIGxvY2FsbHkKKwkgKiAocmVzdWx0UmVsSW5mby0+cmlfV2l0aENoZWNrT3B0aW9u cyA9PSBOSUwpLgorCSAqCisJICogTm8gTG9jYWwgQUZURVIgVHJpZ2dlcnM6IFRoZXJlIGFyZSBu byBBRlRFUiBST1cgdHJpZ2dlcnMgZGVmaW5lZAorCSAqIGxvY2FsbHkgb24gdGhlIGZvcmVpZ24g dGFibGUuCisJICoKKwkgKiBSZW1vdGUgdHJpZ2dlcnMgbWlnaHQgbW9kaWZ5IHRoZSBpbnNlcnRl ZCByb3cuIEJlY2F1c2UgdGhlIENPUFkKKwkgKiBwcm90b2NvbCBkb2VzIG5vdCBzdXBwb3J0IGEg UkVUVVJOSU5HIGNsYXVzZSwgd2UgY2Fubm90IHJldHJpZXZlIHRob3NlCisJICogY2hhbmdlcyB0 byBzeW5jaHJvbml6ZSB0aGUgbG9jYWwgVHVwbGVUYWJsZVNsb3QgcmVxdWlyZWQgYnkgbG9jYWwg QUZURVIKKwkgKiB0cmlnZ2Vycy4KKwkgKi8KKwlpZiAocmVzdWx0UmVsSW5mby0+cmlfUm9vdFJl c3VsdFJlbEluZm8gPT0gTlVMTCAmJiByZXN1bHRSZWxJbmZvLT5yaV9XaXRoQ2hlY2tPcHRpb25z ID09IE5JTCkKKwl7CisJCS8qIFRoZXJlIGlzIG5vIFJFVFVSTklORyBjbGF1c2Ugb24gQ09QWSAq LworCQlBc3NlcnQocmVzdWx0UmVsSW5mby0+cmlfcmV0dXJuaW5nTGlzdCA9PSBOSUwpOworCisJ CXVzZUNvcHkgPSAocmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MgPT0gTlVMTCB8fAorCQkJCSAg ICFyZXN1bHRSZWxJbmZvLT5yaV9UcmlnRGVzYy0+dHJpZ19pbnNlcnRfYWZ0ZXJfcm93KTsKKwl9 CisKIAkvKiBDb25zdHJ1Y3QgdGhlIFNRTCBjb21tYW5kIHN0cmluZy4gKi8KLQlkZXBhcnNlSW5z ZXJ0U3FsKCZzcWwsIHJ0ZSwgcmVzdWx0UmVsYXRpb24sIHJlbCwgdGFyZ2V0QXR0cnMsIGRvTm90 aGluZywKLQkJCQkJIHJlc3VsdFJlbEluZm8tPnJpX1dpdGhDaGVja09wdGlvbnMsCi0JCQkJCSBy ZXN1bHRSZWxJbmZvLT5yaV9yZXR1cm5pbmdMaXN0LAotCQkJCQkgJnJldHJpZXZlZF9hdHRycywg JnZhbHVlc19lbmRfbGVuKTsKKwlpZiAodXNlQ29weSkKKwkJZGVwYXJzZUNvcHlTcWwoJnNxbCwg cmVsLCB0YXJnZXRBdHRycyk7CisJZWxzZQorCQlkZXBhcnNlSW5zZXJ0U3FsKCZzcWwsIHJ0ZSwg cmVzdWx0UmVsYXRpb24sIHJlbCwgdGFyZ2V0QXR0cnMsIGRvTm90aGluZywKKwkJCQkJCSByZXN1 bHRSZWxJbmZvLT5yaV9XaXRoQ2hlY2tPcHRpb25zLAorCQkJCQkJIHJlc3VsdFJlbEluZm8tPnJp X3JldHVybmluZ0xpc3QsCisJCQkJCQkgJnJldHJpZXZlZF9hdHRycywgJnZhbHVlc19lbmRfbGVu KTsKIAogCS8qIENvbnN0cnVjdCBhbiBleGVjdXRpb24gc3RhdGUuICovCiAJZm1zdGF0ZSA9IGNy ZWF0ZV9mb3JlaWduX21vZGlmeShtdHN0YXRlLT5wcy5zdGF0ZSwKQEAgLTIyNjUsNiArMjMxMCw3 IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5zZXJ0KE1vZGlmeVRhYmxlU3RhdGUgKm10c3RhdGUs CiAJCQkJCQkJCQl2YWx1ZXNfZW5kX2xlbiwKIAkJCQkJCQkJCXJldHJpZXZlZF9hdHRycyAhPSBO SUwsCiAJCQkJCQkJCQlyZXRyaWV2ZWRfYXR0cnMpOworCWZtc3RhdGUtPnVzZV9jb3B5ID0gdXNl Q29weTsKIAogCS8qCiAJICogSWYgdGhlIGdpdmVuIHJlc3VsdFJlbEluZm8gYWxyZWFkeSBoYXMg UGdGZHdNb2RpZnlTdGF0ZSBzZXQsIGl0IG1lYW5zCkBAIC00MDk0LDYgKzQxNDAsOSBAQCBleGVj dXRlX2ZvcmVpZ25fbW9kaWZ5KEVTdGF0ZSAqZXN0YXRlLAogCQkgICBvcGVyYXRpb24gPT0gQ01E X1VQREFURSB8fAogCQkgICBvcGVyYXRpb24gPT0gQ01EX0RFTEVURSk7CiAKKwlpZiAoZm1zdGF0 ZS0+dXNlX2NvcHkpCisJCXJldHVybiBleGVjdXRlX2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHko Zm1zdGF0ZSwgc2xvdHMsIG51bVNsb3RzKTsKKwogCS8qIEZpcnN0LCBwcm9jZXNzIGEgcGVuZGlu ZyBhc3luY2hyb25vdXMgcmVxdWVzdCwgaWYgYW55LiAqLwogCWlmIChmbXN0YXRlLT5jb25uX3N0 YXRlLT5wZW5kaW5nQXJlcSkKIAkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3QoZm1zdGF0ZS0+Y29u bl9zdGF0ZS0+cGVuZGluZ0FyZXEpOwpAQCAtNzg4NywzICs3OTM2LDIwOSBAQCBnZXRfYmF0Y2hf c2l6ZV9vcHRpb24oUmVsYXRpb24gcmVsKQogCiAJcmV0dXJuIGJhdGNoX3NpemU7CiB9CisKKy8q CisgKiBleGVjdXRlX2ZvcmVpZ25fbW9kaWZ5X3VzaW5nX2NvcHkKKyAqCQlQZXJmb3JtIGZvcmVp Z24tdGFibGUgbW9kaWZpY2F0aW9uIHVzaW5nIHRoZSBDT1BZIGNvbW1hbmQuCisgKi8KK3N0YXRp YyBUdXBsZVRhYmxlU2xvdCAqKgorZXhlY3V0ZV9mb3JlaWduX21vZGlmeV91c2luZ19jb3B5KFBn RmR3TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkJCSAgVHVwbGVUYWJsZVNsb3QgKipzbG90 cywKKwkJCQkJCQkJICBpbnQgKm51bVNsb3RzKQoreworCVBHcmVzdWx0ICAgKnJlczsKKwlTdHJp bmdJbmZvRGF0YSBjb3B5X2RhdGE7CisJaW50CQkJbl9yb3dzOworCWludAkJCWk7CisJaW50CQkJ bmVzdGxldmVsOworCisJQXNzZXJ0KGZtc3RhdGUtPnVzZV9jb3B5ID09IHRydWUpOworCisJZWxv ZyhERUJVRzEsICJmb3JlaWduIG1vZGlmeSB3aXRoIENPUFkgYmF0Y2hfc2l6ZTogJWQiLCBmbXN0 YXRlLT5iYXRjaF9zaXplKTsKKworCS8qIE1ha2Ugc3VyZSBhbnkgY29uc3RhbnRzIGluIHRoZSBz bG90cyBhcmUgcHJpbnRlZCBwb3J0YWJseSAqLworCW5lc3RsZXZlbCA9IHNldF90cmFuc21pc3Np b25fbW9kZXMoKTsKKworCS8qIFNlbmQgQ09QWSBjb21tYW5kICovCisJaWYgKCFQUXNlbmRRdWVy eShmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSkpCisJCXBnZmR3X3JlcG9ydF9lcnJvcihO VUxMLCBmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisKKwkvKiBnZXQgdGhlIENPUFkg cmVzdWx0ICovCisJcmVzID0gcGdmZHdfZ2V0X3Jlc3VsdChmbXN0YXRlLT5jb25uKTsKKwlpZiAo UFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT1BZX0lOKQorCQlwZ2Zkd19yZXBvcnRfZXJy b3IocmVzLCBmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisKKwkvKiBDbGVhbiB1cCB0 aGUgQ09QWSBjb21tYW5kIHJlc3VsdCAqLworCVBRY2xlYXIocmVzKTsKKworCS8qIENvbnZlcnQg dGhlIFR1cGxlVGFibGVTbG90IGRhdGEgaW50byBhIFRFWFQtZm9ybWF0dGVkIGxpbmUgKi8KKwlp bml0U3RyaW5nSW5mbygmY29weV9kYXRhKTsKKwlmb3IgKGkgPSAwOyBpIDwgKm51bVNsb3RzOyBp KyspCisJeworCQljb252ZXJ0X3Nsb3RfdG9fY29weV90ZXh0KCZjb3B5X2RhdGEsIGZtc3RhdGUs IHNsb3RzW2ldKTsKKworCQkvKgorCQkgKiBTZW5kIGluaXRpYWwgQ09QWSBkYXRhIGlmIHRoZSBi dWZmZXIgcmVhY2hlcyB0aGUgbGltaXQgdG8gYXZvaWQKKwkJICogbGFyZ2UgbWVtb3J5IHVzYWdl LgorCQkgKi8KKwkJaWYgKGNvcHlfZGF0YS5sZW4gPj0gQ09QWUJVRlNJWikKKwkJeworCQkJaWYg KFBRcHV0Q29weURhdGEoZm1zdGF0ZS0+Y29ubiwgY29weV9kYXRhLmRhdGEsIGNvcHlfZGF0YS5s ZW4pIDw9IDApCisJCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZtc3RhdGUtPmNvbm4sIGZt c3RhdGUtPnF1ZXJ5KTsKKwkJCXJlc2V0U3RyaW5nSW5mbygmY29weV9kYXRhKTsKKwkJfQorCX0K KworCS8qIFNlbmQgdGhlIHJlbWFpbmluZyBDT1BZIGRhdGEgKi8KKwlpZiAoY29weV9kYXRhLmxl biA+IDApCisJeworCQlpZiAoUFFwdXRDb3B5RGF0YShmbXN0YXRlLT5jb25uLCBjb3B5X2RhdGEu ZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCXBnZmR3X3JlcG9ydF9lcnJvcihOVUxMLCBm bXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisJfQorCisJcGZyZWUoY29weV9kYXRhLmRh dGEpOworCisJLyogRW5kIHRoZSBDT1BZIG9wZXJhdGlvbiAqLworCWlmIChQUXB1dENvcHlFbmQo Zm1zdGF0ZS0+Y29ubiwgTlVMTCkgPCAwIHx8IFBRZmx1c2goZm1zdGF0ZS0+Y29ubikpCisJCXBn ZmR3X3JlcG9ydF9lcnJvcihOVUxMLCBmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisK KwkvKgorCSAqIEdldCB0aGUgcmVzdWx0LCBhbmQgY2hlY2sgZm9yIHN1Y2Nlc3MuCisJICovCisJ cmVzID0gcGdmZHdfZ2V0X3Jlc3VsdChmbXN0YXRlLT5jb25uKTsKKwlpZiAoUFFyZXN1bHRTdGF0 dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ2Zkd19yZXBvcnRfZXJyb3IocmVzLCBm bXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisKKwluX3Jvd3MgPSBhdG9pKFBRY21kVHVw bGVzKHJlcykpOworCisJLyogQW5kIGNsZWFuIHVwICovCisJUFFjbGVhcihyZXMpOworCisJcmVz ZXRfdHJhbnNtaXNzaW9uX21vZGVzKG5lc3RsZXZlbCk7CisKKwlNZW1vcnlDb250ZXh0UmVzZXQo Zm1zdGF0ZS0+dGVtcF9jeHQpOworCisJKm51bVNsb3RzID0gbl9yb3dzOworCisJLyoKKwkgKiBS ZXR1cm4gTlVMTCBpZiBub3RoaW5nIHdhcyBpbnNlcnRlZCBvbiB0aGUgcmVtb3RlIGVuZAorCSAq LworCXJldHVybiAobl9yb3dzID4gMCkgPyBzbG90cyA6IE5VTEw7Cit9CisKKy8qCisgKiAgV3Jp dGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmbXN0YXRlIGludG8gYnVmIGJ1ZmZlciB0 byBiZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElOIGRhdGEKKyAqLworc3RhdGljIHZvaWQK K2NvbnZlcnRfc2xvdF90b19jb3B5X3RleHQoU3RyaW5nSW5mbyBidWYsCisJCQkJCQkgIFBnRmR3 TW9kaWZ5U3RhdGUgKmZtc3RhdGUsCisJCQkJCQkgIFR1cGxlVGFibGVTbG90ICpzbG90KQorewor CVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihmbXN0YXRlLT5yZWwpOworCWJv b2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlpID0gMDsKKworCWZvcmVhY2hfaW50KGF0dG51bSwg Zm1zdGF0ZS0+dGFyZ2V0X2F0dHJzKQorCXsKKwkJQ29tcGFjdEF0dHJpYnV0ZSAqYXR0ciA9IFR1 cGxlRGVzY0NvbXBhY3RBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQlEYXR1bQkJZGF0dW07 CisJCWJvb2wJCWlzbnVsbDsKKworCQkvKiBJZ25vcmUgZ2VuZXJhdGVkIGNvbHVtbnM7IHRoZXkg YXJlIHNldCB0byBERUZBVUxUICovCisJCWlmIChhdHRyLT5hdHRnZW5lcmF0ZWQpCisJCQljb250 aW51ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXJNYWNybyhidWYs ICdcdCcpOworCQlmaXJzdCA9IGZhbHNlOworCisJCWRhdHVtID0gc2xvdF9nZXRhdHRyKHNsb3Qs IGF0dG51bSwgJmlzbnVsbCk7CisKKwkJaWYgKGlzbnVsbCkKKwkJCWFwcGVuZFN0cmluZ0luZm9T dHJpbmcoYnVmLCAiXFxOIik7CisJCWVsc2UKKwkJeworCQkJY29uc3QgY2hhciAqdmFsdWUgPSBP dXRwdXRGdW5jdGlvbkNhbGwoJmZtc3RhdGUtPnBfZmxpbmZvW2ldLAorCQkJCQkJCQkJCQkJICAg ZGF0dW0pOworCisJCQkvKiBFc2NhcGUgdGhlIHZhbHVlIGlmIG5lZWRlZCAqLworCQkJYXBwZW5k U3RyaW5nSW5mb1RleHQoYnVmLCB2YWx1ZSk7CisJCX0KKwkJaSsrOworCX0KKworCWFwcGVuZFN0 cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAnXG4nKTsKK30KKworLyoKKyAqIEFwcGVuZCBhIHN0cmlu ZyB0byBidWYsIGVzY2FwaW5nIHNwZWNpYWwgY2hhcmFjdGVycyBmb3IgQ09QWSBURVhUIGZvcm1h dC4KKyAqIFNpbWlsYXIgdG8gQ29weUF0dHJpYnV0ZU91dFRleHQoKS4KKyAqLworc3RhdGljIHZv aWQKK2FwcGVuZFN0cmluZ0luZm9UZXh0KFN0cmluZ0luZm8gYnVmLCBjb25zdCBjaGFyICpzdHJp bmcpCit7CisJY29uc3QgY2hhciAqcHRyOworCWNvbnN0IGNoYXIgKnN0YXJ0OworCWNoYXIJCWM7 CisKKwlwdHIgPSBzdHJpbmc7CisJc3RhcnQgPSBwdHI7CisKKwl3aGlsZSAoKGMgPSAqcHRyKSAh PSAnXDAnKQorCXsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSBjIDwgKHVuc2lnbmVkIGNoYXIpIDB4 MjApCisJCXsKKwkJCS8qCisJCQkgKiBXZSB1c2UgQy1saWtlIGJhY2tzbGFzaCBub3RhdGlvbiBm b3IgdGhlIGNvbW1vbiBjb250cm9sCisJCQkgKiBjaGFyYWN0ZXJzOyBvdGhlciBjb250cm9sIGNo YXJzIGFyZSBwYXNzZWQgdGhyb3VnaCBhcy1pcyBzaW5jZQorCQkJICogdGhleSB3b24ndCBjb25m dXNlIHRoZSBDT1BZIHByb3RvY29sLgorCQkJICovCisJCQlzd2l0Y2ggKGMpCisJCQl7CisJCQkJ Y2FzZSAnXGInOgorCQkJCQljID0gJ2InOworCQkJCQlicmVhazsKKwkJCQljYXNlICdcZic6CisJ CQkJCWMgPSAnZic7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1xuJzoKKwkJCQkJYyA9ICduJzsK KwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnXHInOgorCQkJCQljID0gJ3InOworCQkJCQlicmVhazsK KwkJCQljYXNlICdcdCc6CisJCQkJCWMgPSAndCc7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1x2 JzoKKwkJCQkJYyA9ICd2JzsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJLyogQWxs IEFTQ0lJIGNvbnRyb2wgY2hhcnMgYXJlIGxlbmd0aCAxICovCisJCQkJCXB0cisrOworCQkJCQlj b250aW51ZTsKKwkJCX0KKwkJCS8qIER1bXAgbGl0ZXJhbCBwb3J0aW9uIGJlZm9yZSB0aGUgY29u dHJvbCBjaGFyYWN0ZXIgKi8KKwkJCWlmIChwdHIgPiBzdGFydCkKKwkJCQlhcHBlbmRCaW5hcnlT dHJpbmdJbmZvKGJ1Ziwgc3RhcnQsIHB0ciAtIHN0YXJ0KTsKKwkJCWFwcGVuZFN0cmluZ0luZm9D aGFyKGJ1ZiwgJ1xcJyk7CisJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsIGMpOworCQkJc3Rh cnQgPSArK3B0cjsKKwkJfQorCQllbHNlIGlmIChjID09ICdcXCcpCisJCXsKKwkJCS8qIEJhY2tz bGFzaCBtdXN0IGJlIGVzY2FwZWQgYXMgXFwgKi8KKwkJCWlmIChwdHIgPiBzdGFydCkKKwkJCQlh cHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1Ziwgc3RhcnQsIHB0ciAtIHN0YXJ0KTsKKwkJCWFwcGVu ZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJ1xcJyk7CisJCQlzdGFydCA9IHB0cisrOworCQl9CisJCWVs c2UKKwkJCXB0cisrOworCX0KKworCS8qIER1bXAgcmVtYWluaW5nIGxpdGVyYWwgcG9ydGlvbiAq LworCWlmIChwdHIgPiBzdGFydCkKKwkJYXBwZW5kQmluYXJ5U3RyaW5nSW5mbyhidWYsIHN0YXJ0 LCBwdHIgLSBzdGFydCk7Cit9CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0 Z3Jlc19mZHcuaCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGEy YmIxZmYzNTJjLi5mYzY5MjJkZGQ0ZiAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcv cG9zdGdyZXNfZmR3LmgKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgK QEAgLTIwNCw2ICsyMDQsNyBAQCBleHRlcm4gdm9pZCByZWJ1aWxkSW5zZXJ0U3FsKFN0cmluZ0lu Zm8gYnVmLCBSZWxhdGlvbiByZWwsCiAJCQkJCQkJIGNoYXIgKm9yaWdfcXVlcnksIExpc3QgKnRh cmdldF9hdHRycywKIAkJCQkJCQkgaW50IHZhbHVlc19lbmRfbGVuLCBpbnQgbnVtX3BhcmFtcywK IAkJCQkJCQkgaW50IG51bV9yb3dzKTsKK2V4dGVybiB2b2lkIGRlcGFyc2VDb3B5U3FsKFN0cmlu Z0luZm8gYnVmLCBSZWxhdGlvbiByZWwsIExpc3QgKnRhcmdldF9hdHRycyk7CiBleHRlcm4gdm9p ZCBkZXBhcnNlVXBkYXRlU3FsKFN0cmluZ0luZm8gYnVmLCBSYW5nZVRibEVudHJ5ICpydGUsCiAJ CQkJCQkJIEluZGV4IHJ0aW5kZXgsIFJlbGF0aW9uIHJlbCwKIAkJCQkJCQkgTGlzdCAqdGFyZ2V0 QXR0cnMsCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3 LnNxbCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IDQ5 ZWQ3OTdlOGVmLi45YjBmMmJjMTZhMSAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcv c3FsL3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3Rn cmVzX2Zkdy5zcWwKQEAgLTE5MzYsNiArMTkzNiwzNyBAQCBzZWxlY3QgKiBmcm9tIGdsb2MxOwog c2VsZWN0ICogZnJvbSBncmVtMTsKIGRlbGV0ZSBmcm9tIGdyZW0xOwogCistLSB0ZXN0IHRoYXQg ZmR3IGFsc28gdXNlIENPUFkgRlJPTSBhcyBhIHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21l c3NhZ2VzIHRvICdsb2cnOworCitjcmVhdGUgZnVuY3Rpb24gaW5zZXJ0X29yX2NvcHkoKSByZXR1 cm5zIHRyaWdnZXIgYXMgJCQKK2RlY2xhcmUgcXVlcnkgdGV4dDsKK2JlZ2luCisgICAgcXVlcnkg Oj0gY3VycmVudF9xdWVyeSgpOworICAgIHJhaXNlIG5vdGljZSAnJScsIHF1ZXJ5OworcmV0dXJu IG5ldzsKK2VuZDsKKyQkIGxhbmd1YWdlIHBscGdzcWw7CisKK0NSRUFURSBUUklHR0VSIHRyaWdf cm93X2JlZm9yZQorQkVGT1JFIElOU0VSVCBPUiBVUERBVEUgT1IgREVMRVRFIE9OIGdsb2MxCitG T1IgRUFDSCBST1cgRVhFQ1VURSBQUk9DRURVUkUgaW5zZXJ0X29yX2NvcHkoKTsKKworY29weSBn cmVtMSBmcm9tIHN0ZGluOworMworXC4KKworZHJvcCB0cmlnZ2VyIHRyaWdfcm93X2JlZm9yZSBv biBnbG9jMTsKK3Jlc2V0IGNsaWVudF9taW5fbWVzc2FnZXM7CisKKy0tIHRlc3QgdGhhdCBjb3B5 IGRvZXMgbm90IGZhaWwgd2l0aCBjb2x1bW5fbmFtZSBhbGlhcworY3JlYXRlIHRhYmxlIGdsb2My KHh4eCBpbnQpOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZ3JlbTIoYSBpbnQpIHNlcnZlciBsb29w YmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2dsb2MyJyk7CithbHRlciBmb3JlaWduIHRhYmxlIGdy ZW0yIGFsdGVyIGNvbHVtbiBhIG9wdGlvbnMgKGNvbHVtbl9uYW1lICd4eHgnKTsKK2NvcHkgZ3Jl bTIgZnJvbSBzdGRpbjsKKzEKK1wuCisKIC0tIHRlc3QgYmF0Y2ggaW5zZXJ0CiBhbHRlciBzZXJ2 ZXIgbG9vcGJhY2sgb3B0aW9ucyAoYWRkIGJhdGNoX3NpemUgJzEwJyk7CiBleHBsYWluICh2ZXJi b3NlLCBjb3N0cyBvZmYpCkBAIC0xOTYyLDYgKzE5OTMsMjQgQEAgZHJvcCB0YWJsZSB0YWJfYmF0 Y2hfbG9jYWw7CiBkcm9wIHRhYmxlIHRhYl9iYXRjaF9zaGFyZGVkOwogZHJvcCB0YWJsZSB0YWJf YmF0Y2hfc2hhcmRlZF9wMV9yZW1vdGU7CiAKKy0tIHRlc3QgYmF0Y2ggaW5zZXJ0IHVzaW5nIGNv cHkKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdkZWJ1ZzEnOworY29weSBncmVtMSBmcm9t IHN0ZGluOworMQorMgorMworNAorNQorNgorNworOAorOQorMTAKKzExCisxMgorXC4KK3Jlc2V0 IGNsaWVudF9taW5fbWVzc2FnZXM7CisKIGFsdGVyIHNlcnZlciBsb29wYmFjayBvcHRpb25zIChk cm9wIGJhdGNoX3NpemUpOwogCiAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zMDI2LDYgKzMwNzUsMjkgQEAg ZHJvcCB0cmlnZ2VyIHRyaWdfbnVsbCBvbiBsb2MyOwogCiBkZWxldGUgZnJvbSByZW0yOwogCist LSBUZXN0IENPUFkgRlJPTSB3aXRoIGNvbHVtbiBsaXN0IGFuZCBzcGVjaWFsIGNoYXJhY3RlcnMK K2NvcHkgcmVtMiAoZjEsIGYyKSBmcm9tIHN0ZGluOworMQloZWxsb1xud29ybGQKK1wuCitzZWxl Y3QgKiBmcm9tIHJlbTI7CisKK2RlbGV0ZSBmcm9tIHJlbTI7CisKKy0tIFRlc3QgdGhhdCBmbG9h dCBudW1iZXJzIGRvIG5vdCBsb29zZSBwcmVjaXNpb24gd2hlbiBzZW5kaW5nIHRvIHRoZSBmb3Jl aWduCistLSBzZXJ2ZXIKK2NyZWF0ZSB0YWJsZSBmKGEgZmxvYXQpOworY3JlYXRlIGZvcmVpZ24g dGFibGUgZl9mZHcoYSBmbG9hdCkgc2VydmVyIGxvb3BiYWNrIG9wdGlvbnModGFibGVfbmFtZSAn ZicpOworCitzZXQgZXh0cmFfZmxvYXRfZGlnaXRzID0gMDsKK2NvcHkgZl9mZHcgZnJvbSBzdGRp bjsKKzEuMDAwMDAwMDAwMDAwMDAwMgorXC4KKworcmVzZXQgZXh0cmFfZmxvYXRfZGlnaXRzOwor c2VsZWN0ICogZnJvbSBmOworCitkcm9wIHRhYmxlIGY7CisKIC0tIENoZWNrIHdpdGggemVyby1j b2x1bW4gZm9yZWlnbiB0YWJsZTsgYmF0Y2ggaW5zZXJ0IHdpbGwgYmUgZGlzYWJsZWQKIGFsdGVy IHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjE7CiBhbHRlciB0YWJsZSBsb2MyIGRyb3AgY29sdW1u IGYyOwotLSAKMi41Mi4wCgo= --d0d1e43ef87c946f54e6331411e128dfdde554237d9207ccbaf3f8422744--