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 1wADXn-002Avt-0t for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Apr 2026 21:01:07 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wADXl-002Pqi-2B for pgsql-hackers@arkaria.postgresql.org; Tue, 07 Apr 2026 21:01:06 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wADXl-002Pqa-0B for pgsql-hackers@lists.postgresql.org; Tue, 07 Apr 2026 21:01:05 +0000 Received: from mail-dl1-x1236.google.com ([2607:f8b0:4864:20::1236]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wADXi-000000016JX-1U9Q for pgsql-hackers@postgresql.org; Tue, 07 Apr 2026 21:01:04 +0000 Received: by mail-dl1-x1236.google.com with SMTP id a92af1059eb24-1271195d2a7so1721927c88.0 for ; Tue, 07 Apr 2026 14:01:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775595661; x=1776200461; darn=postgresql.org; h=in-reply-to:references:cc:to:from:subject:message-id:date :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=PwWxUPWTNzEnm0zX2Eg5iQtrVTdMFAL/6Jx6PFQFjN0=; b=RnyB1NS/MmMkwGBhPm3QJ227CptT19ruNPFLfqziDuIFP4nJSEgZcLuF0fsgJ10fxA hCJ//zs44KVxx8NORfnzBC601bBo0r7vLLJgEQCANgD/xecdEInNDGcY2kYDjptsR3Zp tjVh4NFSFG0fiWpURAp9HiPtxKDNcy/ifNZ0Sdddt1aaH6h3KYp7eMMkgtV6iApIdz8Y UX5nFf83qHxYCPMlAi7PwXvLSQx45OPPFWjH88BHDy/xEe8om2tVvF5f+91SGW9QoVIG RsQ1VuL2rSnuDHfmUEiYZ6xpwFoyvZecr+qB+S8FRvOewtVu8I9gZey3sHTnyEX5RgJy IWHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775595661; x=1776200461; h=in-reply-to:references:cc:to:from:subject:message-id:date :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=PwWxUPWTNzEnm0zX2Eg5iQtrVTdMFAL/6Jx6PFQFjN0=; b=DzgoQW+CoZeoheW3A8aC7rP4Xyqp4lOV8MbyjjreWtKmf3DWNjLRunDq2VSPkp9U25 0KVNmT/oTbas3zYPsIvCqJyH+N1RRImjXnDAF1Ku/JvlpAGxhMgrf6GYbuPvRWqfkqJH Kun5z/hvIX3eK55AeY+28xDY7Jp9KdugS0uL2pQdmZTa7mHWl2zy1vw6S3stfTwCV006 QrTua+f7P1npnY3CHqfkj0nSa7pDz6f7pS7AvbBWsn6p0SyL4pu1Q+XFWkpg2cPWRiq6 l8W2vQ77MvtFhS+wjyxEpyD9YQ5PpzYdBlR7LLBSUr6pmCO6IyIrqfzzCoayGDq1uFpQ ZNKg== X-Forwarded-Encrypted: i=1; AJvYcCWOIKKaMXUF4mcbYBhsTuZ/6TWW7JSmw/ZO2cGkIj7SiEjeyBJxkNA6/A2Ppref/W0Cp5BlnCQjwXT3os4R@postgresql.org X-Gm-Message-State: AOJu0Ywjb99GSZHekcwspfWHGwHyg5V7ZwrUNPXjVDKEtpH7WiQxXZaD vFqdMkIhviJF3cfdruKbWtZxilR6S5Ou0ZptChdlBRW2K2jXsnX8V1mt X-Gm-Gg: AeBDietjClo321dM9O5lhrxSvS469wiL3NmcHu7JGiyrSw6DanQY+upBpYHbHXMyfUK gqCyaeHIIIoezHaa56sX++WWWo5R2OPkAGWitdCWKxv0Wot54OF3h+bYMVbLvG+wWfIhPxT4CKr wFpPr5YbHbFQMuhKYnkNdbglNb3bXP97/vz5T3KT+qP/dwk1t4DXLDGe7BpVdgKQCj5knllDfQK 4RkNPn3+dRqND5glpyDd3uzeSOlu0dOG50Og8REUbgsNg5vkWuN1fiB9EEyYK3MlI9KI2UUlTrv PyM62gmuGhqcR/GMajPqvTaq5F8hKTysB+rIpQED699W/YgPvuAXGVwHiGn5XqZBSXLCDjcMlFo M4p1R49zA1m6mx0usq2MRmZgc9Jqrr0i9JapYESD992+G0/cxDyoWbdzal1BWAGDX/R+mGDL7yB 5PbrHuMSXuWQ71Jw46Lko3LWdPFmPBgn5hWHXDtWT5kamxXw== X-Received: by 2002:a05:7022:10d:b0:12a:713b:896a with SMTP id a92af1059eb24-12bfb7458damr10421369c88.17.1775595661304; Tue, 07 Apr 2026 14:01:01 -0700 (PDT) Received: from localhost ([2804:14d:328a:a59c:ecba:fcaa:a831:c445]) by smtp.gmail.com with ESMTPSA id a92af1059eb24-12bedd70f18sm16342754c88.6.2026.04.07.14.00.58 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 07 Apr 2026 14:01:00 -0700 (PDT) Content-Type: multipart/mixed; boundary=7da32911355ab8d657c1eba4060ab83e8bcb68565d05d8fd5b675c97c90f Mime-Version: 1.0 Date: Tue, 07 Apr 2026 18:00:56 -0300 Message-Id: Subject: Re: postgres_fdw: Use COPY to speed up batch inserts From: "Matheus Alcantara" To: "Masahiko Sawada" Cc: "Andrew Dunstan" , "jian he" , "Tomas Vondra" , 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 --7da32911355ab8d657c1eba4060ab83e8bcb68565d05d8fd5b675c97c90f Content-Type: multipart/alternative; boundary=0ac9812fe7d2c6398d40fad09478aaded39b4a114cc38667d312dc88e7d9 --0ac9812fe7d2c6398d40fad09478aaded39b4a114cc38667d312dc88e7d9 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Content-Type: text/plain; charset=UTF-8 On Wed Apr 1, 2026 at 12:50 PM -03, Matheus Alcantara wrote: > 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've played with changing the format from TEXT to CSV to avoid this duplicated code and I'm attaching a new version with the results. We still need a special function to handle the escape but I think that it's less complicated compared with TEXT. I was a bit concerned about the performance so I've executed a benchmark using pgbench that run a COPY FROM with 100 rows on a foreign table and I've got the following results: Command: pgbench -n -c 10 -j 10 -t 100 -f bench.sql postgres batch_size: 10 patch tps: 5588.402946 master tps: 4691.619829 batch_size: 100 patch tps: 11834.459579 master tps: 5578.925053 batch_size: 1000 patch tps: 11181.554907 master tps: 6452.945124 The results looks good, so I think that CSV is a valid format option. -- Matheus Alcantara EDB: https://www.enterprisedb.com --0ac9812fe7d2c6398d40fad09478aaded39b4a114cc38667d312dc88e7d9-- --7da32911355ab8d657c1eba4060ab83e8bcb68565d05d8fd5b675c97c90f Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=v14-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch Content-Type: text/plain; charset=utf-8; name=v14-0001-postgres_fdw-Use-COPY-as-remote-SQL-when-possibl.patch RnJvbSBjYzA5NzNlMjMwMTNiYjI3M2UwNGQ3OTY2MTI4NDY0YWMyYTM2OGQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNYXRoZXVzIEFsY2FudGFyYSA8bXRocy5kZXZAcG0ubWU+CkRh dGU6IFdlZCwgMjggSmFuIDIwMjYgMTk6NTU6NDggLTAzMDAKU3ViamVjdDogW1BBVENIIHYxNF0g cG9zdGdyZXNfZmR3OiBVc2UgQ09QWSBhcyByZW1vdGUgU1FMIHdoZW4gcG9zc2libGUKClByZXZp b3VzbHkgd2hlbiBhbiB1c2VyIGV4ZWN1dGUgYSBDT1BZIG9uIGEgZm9yZWlnbiB0YWJsZSwgcG9z dGdyZXNfZmR3CnNlbmQgYSBJTlNFUlQgYXMgYSByZW1vdGUgU1FMIHRvIHRoZSBmb3JlaWduIHNl cnZlci4gVGhpcyBjb21taXQKaW50cm9kdWNlIHRoZSBhYmlsaXR5IHRvIHVzZSB0aGUgQ09QWSBj b21tYW5kIGluc3RlYWQuCgpUaGUgQ09QWSBjb21tYW5kIHdpbGwgb25seSBiZSB1c2VkIHdoZW4g YW4gdXNlciBleGVjdXRlIGEgQ09QWSBvbiBhCmZvcmVpZ24gdGFibGUgYW5kIGFsc28gdGhlIGZv cmVpZ24gdGFibGUgc2hvdWxkIG5vdCBoYXZlIHRyaWdnZXJzCmJlY2F1c2UgcmVtb3RlIHRyaWdn ZXJzIG1pZ2h0IG1vZGlmeSB0aGUgaW5zZXJ0ZWQgcm93IGFuZCBzaW5jZSBDT1BZCmRvZXMgbm90 IHN1cHBvcnQgYSBSRVRVUk5JTkcgY2xhdXNlLCB3ZSBjYW5ub3Qgc3luY2hyb25pemUgdGhlIGxv Y2FsClR1cGxlVGFibGVTbG90IHdpdGggdGhvc2UgY2hhbmdlcyBmb3IgdXNlIGluIGxvY2FsIEFG VEVSIHRyaWdnZXJzLCBzbyBpZgp0aGUgZm9yZWlnbiB0YWJsZSBoYXMgYW55IHRyaWdnZXIgSU5T RVJUIHdpbGwgYmUgdXNlZC4KCkF1dGhvcjogTWF0aGV1cyBBbGNhbnRhcmEgPG10aHMuZGV2QHBt Lm1lPgpSZXZpZXdlZC1CeTogVG9tYXMgVm9uZHJhIDx0b21hc0B2b25kcmEubWU+ClJldmlld2Vk LUJ5OiBKYWt1YiBXYXJ0YWsgPGpha3ViLndhcnRha0BlbnRlcnByaXNlZGIuY29tPgpSZXZpZXdl ZC1CeTogamlhbiBoZSA8amlhbi51bml2ZXJzYWxpdHlAZ21haWwuY29tPgpSZXZpZXdlZC1CeTog RGV3ZWkgRGFpIDxkYWlkZXdlaTE5NzBAMTYzLmNvbT4KUmV2aWV3ZWQtQnk6IE1hc2FoaWtvIFNh d2FkYSA8c2F3YWRhLm1zaGtAZ21haWwuY29tPgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly93d3cucG9z dGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9mbGF0L0RESVpKMjE3T1VESy4yUjVXRTRPR0w1UFRZJTQw Z21haWwuY29tCi0tLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jICAgICAgICAgICAg ICAgIHwgIDU2ICsrKysrCiAuLi4vcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5v dXQgICAgfCAgNzUgKysrKysrLQogY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMg ICAgICAgICAgIHwgMjEyICsrKysrKysrKysrKysrKysrLQogY29udHJpYi9wb3N0Z3Jlc19mZHcv cG9zdGdyZXNfZmR3LmggICAgICAgICAgIHwgICAxICsKIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Nx bC9wb3N0Z3Jlc19mZHcuc3FsICAgICB8ICA4MiArKysrKysrCiA1IGZpbGVzIGNoYW5nZWQsIDQx NyBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2RlcGFyc2UuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFyc2UuYwppbmRl eCBjMTU5ZWNkMTU1OC4uYTFlMDI0ZDNmNjYgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L2RlcGFyc2UuYworKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKQEAgLTIx NzcsNiArMjE3Nyw2MiBAQCBkZXBhcnNlSW5zZXJ0U3FsKFN0cmluZ0luZm8gYnVmLCBSYW5nZVRi bEVudHJ5ICpydGUsCiAJCQkJCQkgd2l0aENoZWNrT3B0aW9uTGlzdCwgcmV0dXJuaW5nTGlzdCwg cmV0cmlldmVkX2F0dHJzKTsKIH0KIAorLyoKKyAqICBCdWlsZCBhIENPUFkgRlJPTSBTVERJTiBz dGF0ZW1lbnQgdXNpbmcgdGhlIENTViBmb3JtYXQKKyAqLwordm9pZAorZGVwYXJzZUNvcHlTcWwo U3RyaW5nSW5mbyBidWYsIFJlbGF0aW9uIHJlbCwgTGlzdCAqdGFyZ2V0X2F0dHJzKQoreworCU9p ZAkJCXJlbGlkID0gUmVsYXRpb25HZXRSZWxpZChyZWwpOworCVR1cGxlRGVzYwl0dXBkZXNjID0g UmVsYXRpb25HZXREZXNjcihyZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQluYXR0 cnMgPSBsaXN0X2xlbmd0aCh0YXJnZXRfYXR0cnMpOworCisJYXBwZW5kU3RyaW5nSW5mbyhidWYs ICJDT1BZICIpOworCWRlcGFyc2VSZWxhdGlvbihidWYsIHJlbCk7CisJaWYgKG5hdHRycyA+IDAp CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJygnKTsKKworCWZvcmVhY2hfaW50KGF0dG51 bSwgdGFyZ2V0X2F0dHJzKQorCXsKKwkJRm9ybV9wZ19hdHRyaWJ1dGUgYXR0ciA9IFR1cGxlRGVz Y0F0dHIodHVwZGVzYywgYXR0bnVtIC0gMSk7CisJCWNoYXIJICAgKmNvbG5hbWU7CisJCUxpc3QJ ICAgKm9wdGlvbnM7CisJCUxpc3RDZWxsICAgKmxjOworCisJCWlmIChhdHRyLT5hdHRnZW5lcmF0 ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZyhidWYsICIsICIpOworCisJCWZpcnN0ID0gZmFsc2U7CisKKwkJLyogVXNlIGF0dHJpYnV0 ZSBuYW1lIG9yIGNvbHVtbl9uYW1lIG9wdGlvbi4gKi8KKwkJY29sbmFtZSA9IE5hbWVTdHIoYXR0 ci0+YXR0bmFtZSk7CisJCW9wdGlvbnMgPSBHZXRGb3JlaWduQ29sdW1uT3B0aW9ucyhyZWxpZCwg YXR0bnVtKTsKKwkJZm9yZWFjaChsYywgb3B0aW9ucykKKwkJeworCQkJRGVmRWxlbSAgICAqZGVm ID0gKERlZkVsZW0gKikgbGZpcnN0KGxjKTsKKworCQkJaWYgKHN0cmNtcChkZWYtPmRlZm5hbWUs ICJjb2x1bW5fbmFtZSIpID09IDApCisJCQl7CisJCQkJY29sbmFtZSA9IGRlZkdldFN0cmluZyhk ZWYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhi dWYsIHF1b3RlX2lkZW50aWZpZXIoY29sbmFtZSkpOworCX0KKwlpZiAobmF0dHJzID4gMCkKKwkJ YXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIpIEZST00gU1RESU4iKTsKKwllbHNlCisJCWFw cGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIEZST00gU1RESU4iKTsKKworCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoYnVmLCAiIChGT1JNQVQgQ1NWKSIpOworfQorCisKIC8qCiAgKiByZWJ1aWxk IHJlbW90ZSBJTlNFUlQgc3RhdGVtZW50CiAgKgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jl c19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4 cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggY2QyMjU1MzIzNmYuLjE0ZmM0ZGZlYzA3IDEw MDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0 CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKQEAg LTc2NTQsNiArNzY1NCwyOCBAQCBzZWxlY3QgKiBmcm9tIGdyZW0xOwogKDIgcm93cykKIAogZGVs ZXRlIGZyb20gZ3JlbTE7CistLSB0ZXN0IHRoYXQgZmR3IGFsc28gdXNlIENPUFkgRlJPTSBhcyBh IHJlbW90ZSBzcWwKK3NldCBjbGllbnRfbWluX21lc3NhZ2VzIHRvICdsb2cnOworY3JlYXRlIGZ1 bmN0aW9uIGluc2VydF9vcl9jb3B5KCkgcmV0dXJucyB0cmlnZ2VyIGFzICQkCitkZWNsYXJlIHF1 ZXJ5IHRleHQ7CitiZWdpbgorICAgIHF1ZXJ5IDo9IGN1cnJlbnRfcXVlcnkoKTsKKyAgICByYWlz ZSBub3RpY2UgJyUnLCBxdWVyeTsKK3JldHVybiBuZXc7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBn c3FsOworQ1JFQVRFIFRSSUdHRVIgdHJpZ19yb3dfYmVmb3JlCitCRUZPUkUgSU5TRVJUIE9SIFVQ REFURSBPUiBERUxFVEUgT04gZ2xvYzEKK0ZPUiBFQUNIIFJPVyBFWEVDVVRFIFBST0NFRFVSRSBp bnNlcnRfb3JfY29weSgpOworY29weSBncmVtMSBmcm9tIHN0ZGluOworTE9HOiAgcmVjZWl2ZWQg bWVzc2FnZSB2aWEgcmVtb3RlIGNvbm5lY3Rpb246IE5PVElDRTogIENPUFkgcHVibGljLmdsb2Mx KGEpIEZST00gU1RESU4gKEZPUk1BVCBDU1YpCitkcm9wIHRyaWdnZXIgdHJpZ19yb3dfYmVmb3Jl IG9uIGdsb2MxOworcmVzZXQgY2xpZW50X21pbl9tZXNzYWdlczsKKy0tIHRlc3QgdGhhdCBjb3B5 IGRvZXMgbm90IGZhaWwgd2l0aCBjb2x1bW5fbmFtZSBhbGlhcworY3JlYXRlIHRhYmxlIGdsb2My KHh4eCBpbnQpOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZ3JlbTIoYSBpbnQpIHNlcnZlciBsb29w YmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2dsb2MyJyk7CithbHRlciBmb3JlaWduIHRhYmxlIGdy ZW0yIGFsdGVyIGNvbHVtbiBhIG9wdGlvbnMgKGNvbHVtbl9uYW1lICd4eHgnKTsKK2NvcHkgZ3Jl bTIgZnJvbSBzdGRpbjsKIC0tIHRlc3QgYmF0Y2ggaW5zZXJ0CiBhbHRlciBzZXJ2ZXIgbG9vcGJh Y2sgb3B0aW9ucyAoYWRkIGJhdGNoX3NpemUgJzEwJyk7CiBleHBsYWluICh2ZXJib3NlLCBjb3N0 cyBvZmYpCkBAIC03NjcxLDE2ICs3NjkzLDE4IEBAIGluc2VydCBpbnRvIGdyZW0xIChhKSB2YWx1 ZXMgKDEpLCAoMik7CiBzZWxlY3QgKiBmcm9tIGdsb2MxOwogIGEgfCBiIHwgYyAKIC0tLSstLS0r LS0tCisgMyB8IDYgfCAgCiAgMSB8IDIgfCAgCiAgMiB8IDQgfCAgCi0oMiByb3dzKQorKDMgcm93 cykKIAogc2VsZWN0ICogZnJvbSBncmVtMTsKICBhIHwgYiB8IGMgCiAtLS0rLS0tKy0tLQorIDMg fCA2IHwgOQogIDEgfCAyIHwgMwogIDIgfCA0IHwgNgotKDIgcm93cykKKygzIHJvd3MpCiAKIGRl bGV0ZSBmcm9tIGdyZW0xOwogLS0gYmF0Y2ggaW5zZXJ0IHdpdGggZm9yZWlnbiBwYXJ0aXRpb25z LgpAQCAtNzcwNSw2ICs3NzI5LDEyIEBAIHNlbGVjdCBjb3VudCgqKSBmcm9tIHRhYl9iYXRjaF9z aGFyZGVkOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hfbG9jYWw7CiBkcm9wIHRhYmxlIHRhYl9iYXRj aF9zaGFyZGVkOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hfc2hhcmRlZF9wMV9yZW1vdGU7CistLSB0 ZXN0IGJhdGNoIGluc2VydCB1c2luZyBjb3B5CitzZXQgY2xpZW50X21pbl9tZXNzYWdlcyB0byAn ZGVidWcxJzsKK2NvcHkgZ3JlbTEgZnJvbSBzdGRpbjsKK0RFQlVHOiAgZm9yZWlnbiBtb2RpZnkg d2l0aCBDT1BZIGJhdGNoX3NpemU6IDEwCitERUJVRzogIGZvcmVpZ24gbW9kaWZ5IHdpdGggQ09Q WSBiYXRjaF9zaXplOiAxMAorcmVzZXQgY2xpZW50X21pbl9tZXNzYWdlczsKIGFsdGVyIHNlcnZl ciBsb29wYmFjayBvcHRpb25zIChkcm9wIGJhdGNoX3NpemUpOwogLS0gPT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLS0g dGVzdCBsb2NhbCB0cmlnZ2VycwpAQCAtOTU4Niw2ICs5NjE2LDE3IEBAIHNlbGVjdCAqIGZyb20g cmVtMjsKICAgMiB8IGJhcgogKDIgcm93cykKIAorZGVsZXRlIGZyb20gcmVtMjsKKy0tIFRlc3Qg Q09QWSB3aXRoIE5VTEwgYW5kIHNwZWNpYWwgY2hhcmFjdGVycworY29weSByZW0yIGZyb20gc3Rk aW47CitzZWxlY3QgKiBmcm9tIHJlbTI7CisgZjEgfCBmMiAgCistLS0tKy0tLS0tCisgIDEgfCAK KyAgICB8IGJhcgorICAzIHwgYSJiCisoMyByb3dzKQorCiBkZWxldGUgZnJvbSByZW0yOwogLS0g VGVzdCBjaGVjayBjb25zdHJhaW50cwogYWx0ZXIgdGFibGUgbG9jMiBhZGQgY29uc3RyYWludCBs b2MyX2YxcG9zaXRpdmUgY2hlY2sgKGYxID49IDApOwpAQCAtOTU5NSw3ICs5NjM2LDggQEAgY29w eSByZW0yIGZyb20gc3RkaW47CiBjb3B5IHJlbTIgZnJvbSBzdGRpbjsgLS0gRVJST1IKIEVSUk9S OiAgbmV3IHJvdyBmb3IgcmVsYXRpb24gImxvYzIiIHZpb2xhdGVzIGNoZWNrIGNvbnN0cmFpbnQg ImxvYzJfZjFwb3NpdGl2ZSIKIERFVEFJTDogIEZhaWxpbmcgcm93IGNvbnRhaW5zICgtMSwgeHl6 enkpLgotQ09OVEVYVDogIHJlbW90ZSBTUUwgY29tbWFuZDogSU5TRVJUIElOVE8gcHVibGljLmxv YzIoZjEsIGYyKSBWQUxVRVMgKCQxLCAkMikKK0NPTlRFWFQ6ICBDT1BZIGxvYzIsIGxpbmUgMTog IiItMSIsInh5enp5IiIKK3JlbW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihmMSwg ZjIpIEZST00gU1RESU4gKEZPUk1BVCBDU1YpCiBDT1BZIHJlbTIsIGxpbmUgMTogIi0xCXh5enp5 Igogc2VsZWN0ICogZnJvbSByZW0yOwogIGYxIHwgZjIgIApAQCAtOTc1Miw3ICs5Nzk0LDggQEAg Y29weSByZW0yIGZyb20gc3RkaW47CiBjb3B5IHJlbTIgZnJvbSBzdGRpbjsgLS0gRVJST1IKIEVS Uk9SOiAgbmV3IHJvdyBmb3IgcmVsYXRpb24gImxvYzIiIHZpb2xhdGVzIGNoZWNrIGNvbnN0cmFp bnQgImxvYzJfZjFwb3NpdGl2ZSIKIERFVEFJTDogIEZhaWxpbmcgcm93IGNvbnRhaW5zICgtMSwg eHl6enkpLgotQ09OVEVYVDogIHJlbW90ZSBTUUwgY29tbWFuZDogSU5TRVJUIElOVE8gcHVibGlj LmxvYzIoZjEsIGYyKSBWQUxVRVMgKCQxLCAkMikKK0NPTlRFWFQ6ICBDT1BZIGxvYzIsIGxpbmUg MTogIiItMSIsInh5enp5IiIKK3JlbW90ZSBTUUwgY29tbWFuZDogQ09QWSBwdWJsaWMubG9jMihm MSwgZjIpIEZST00gU1RESU4gKEZPUk1BVCBDU1YpCiBDT1BZIHJlbTIKIHNlbGVjdCAqIGZyb20g cmVtMjsKICBmMSB8IGYyICAKQEAgLTk3OTEsNiArOTgzNCwzMCBAQCBzZWxlY3QgKiBmcm9tIHJl bTI7CiAKIGRyb3AgdHJpZ2dlciB0cmlnX251bGwgb24gbG9jMjsKIGRlbGV0ZSBmcm9tIHJlbTI7 CistLSBUZXN0IENPUFkgRlJPTSB3aXRoIGNvbHVtbiBsaXN0IGFuZCBzcGVjaWFsIGNoYXJhY3Rl cnMKK2NvcHkgcmVtMiAoZjEsIGYyKSBmcm9tIHN0ZGluOworc2VsZWN0ICogZnJvbSByZW0yOwor IGYxIHwgIGYyICAgCistLS0tKy0tLS0tLS0KKyAgMSB8IGhlbGxvKworICAgIHwgd29ybGQKKygx IHJvdykKKworZGVsZXRlIGZyb20gcmVtMjsKKy0tIFRlc3QgdGhhdCBmbG9hdCBudW1iZXJzIGRv IG5vdCBsb29zZSBwcmVjaXNpb24gd2hlbiBzZW5kaW5nIHRvIHRoZSBmb3JlaWduCistLSBzZXJ2 ZXIKK2NyZWF0ZSB0YWJsZSBmKGEgZmxvYXQpOworY3JlYXRlIGZvcmVpZ24gdGFibGUgZl9mZHco YSBmbG9hdCkgc2VydmVyIGxvb3BiYWNrIG9wdGlvbnModGFibGVfbmFtZSAnZicpOworc2V0IGV4 dHJhX2Zsb2F0X2RpZ2l0cyA9IDA7Citjb3B5IGZfZmR3IGZyb20gc3RkaW47CityZXNldCBleHRy YV9mbG9hdF9kaWdpdHM7CitzZWxlY3QgKiBmcm9tIGY7CisgICAgICAgICBhICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxLjAwMDAwMDAwMDAwMDAwMDIKKygxIHJvdykKKworZHJv cCB0YWJsZSBmOwogLS0gQ2hlY2sgd2l0aCB6ZXJvLWNvbHVtbiBmb3JlaWduIHRhYmxlOyBiYXRj aCBpbnNlcnQgd2lsbCBiZSBkaXNhYmxlZAogYWx0ZXIgdGFibGUgbG9jMiBkcm9wIGNvbHVtbiBm MTsKIGFsdGVyIHRhYmxlIGxvYzIgZHJvcCBjb2x1bW4gZjI7CmRpZmYgLS1naXQgYS9jb250cmli L3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3Rn cmVzX2Zkdy5jCmluZGV4IGNjOGVjMjRjMzBlLi4zMzAxZDYwMDk2NyAxMDA2NDQKLS0tIGEvY29u dHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19m ZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTY0LDYgKzY0LDkgQEAgUEdfTU9EVUxFX01BR0lDX0VYVCgK IC8qIElmIG5vIHJlbW90ZSBlc3RpbWF0ZXMsIGFzc3VtZSBhIHNvcnQgY29zdHMgMjAlIGV4dHJh ICovCiAjZGVmaW5lIERFRkFVTFRfRkRXX1NPUlRfTVVMVElQTElFUiAxLjIKIAorLyogQnVmZmVy IHNpemUgdG8gc2VuZCBDT1BZIElOIGRhdGEqLworI2RlZmluZSBDT1BZQlVGU0laIDgxOTIKKwog LyoKICAqIEluZGV4ZXMgb2YgRkRXLXByaXZhdGUgaW5mb3JtYXRpb24gc3RvcmVkIGluIGZkd19w cml2YXRlIGxpc3RzLgogICoKQEAgLTE5OSw2ICsyMDIsOCBAQCB0eXBlZGVmIHN0cnVjdCBQZ0Zk d01vZGlmeVN0YXRlCiAJYm9vbAkJaGFzX3JldHVybmluZzsJLyogaXMgdGhlcmUgYSBSRVRVUk5J TkcgY2xhdXNlPyAqLwogCUxpc3QJICAgKnJldHJpZXZlZF9hdHRyczsJLyogYXR0ciBudW1iZXJz IHJldHJpZXZlZCBieSBSRVRVUk5JTkcgKi8KIAorCWJvb2wJCXVzZV9jb3B5OworCiAJLyogaW5m byBhYm91dCBwYXJhbWV0ZXJzIGZvciBwcmVwYXJlZCBzdGF0ZW1lbnQgKi8KIAlBdHRyTnVtYmVy CWN0aWRBdHRubzsJCS8qIGF0dG51bSBvZiBpbnB1dCByZXNqdW5rIGN0aWQgY29sdW1uICovCiAJ aW50CQkJcF9udW1zOwkJCS8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIHRvIHRyYW5zbWl0ICovCkBA IC01NDYsNiArNTUxLDEzIEBAIHN0YXRpYyB2b2lkIG1lcmdlX2Zkd19vcHRpb25zKFBnRmR3UmVs YXRpb25JbmZvICpmcGluZm8sCiAJCQkJCQkJICBjb25zdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBp bmZvX28sCiAJCQkJCQkJICBjb25zdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvX2kpOwogc3Rh dGljIGludAlnZXRfYmF0Y2hfc2l6ZV9vcHRpb24oUmVsYXRpb24gcmVsKTsKK3N0YXRpYyBUdXBs ZVRhYmxlU2xvdCAqKmV4ZWN1dGVfZm9yZWlnbl9tb2RpZnlfdXNpbmdfY29weShQZ0Zkd01vZGlm eVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkJCQkJCQkgIFR1cGxlVGFibGVTbG90ICoqc2xvdHMs CisJCQkJCQkJCQkJCQkJCSAgaW50ICpudW1TbG90cyk7CitzdGF0aWMgdm9pZCBjb252ZXJ0X3Ns b3RfdG9fY29weV9jc3YoU3RyaW5nSW5mbyBidWYsCisJCQkJCQkJCQkgUGdGZHdNb2RpZnlTdGF0 ZSAqZm1zdGF0ZSwKKwkJCQkJCQkJCSBUdXBsZVRhYmxlU2xvdCAqc2xvdCk7CitzdGF0aWMgdm9p ZCBhcHBlbmRTdHJpbmdJbmZvQ3N2KFN0cmluZ0luZm8gYnVmLCBjb25zdCBjaGFyICpzdHJpbmcp OwogCiAKIC8qCkBAIC0yMTY2LDExICsyMTc4LDEyIEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5z ZXJ0KE1vZGlmeVRhYmxlU3RhdGUgKm10c3RhdGUsCiAJUmFuZ2VUYmxFbnRyeSAqcnRlOwogCVR1 cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihyZWwpOwogCWludAkJCWF0dG51bTsK LQlpbnQJCQl2YWx1ZXNfZW5kX2xlbjsKKwlpbnQJCQl2YWx1ZXNfZW5kX2xlbiA9IDA7CiAJU3Ry aW5nSW5mb0RhdGEgc3FsOwogCUxpc3QJICAgKnRhcmdldEF0dHJzID0gTklMOwogCUxpc3QJICAg KnJldHJpZXZlZF9hdHRycyA9IE5JTDsKIAlib29sCQlkb05vdGhpbmcgPSBmYWxzZTsKKwlib29s CQl1c2VDb3B5ID0gZmFsc2U7CiAKIAkvKgogCSAqIElmIHRoZSBmb3JlaWduIHRhYmxlIHdlIGFy ZSBhYm91dCB0byBpbnNlcnQgcm91dGVkIHJvd3MgaW50byBpcyBhbHNvIGFuCkBAIC0yMjQ4LDEx ICsyMjYxLDQzIEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduSW5zZXJ0KE1vZGlmeVRhYmxlU3RhdGUg Km10c3RhdGUsCiAJCXJ0ZSA9IGV4ZWNfcnRfZmV0Y2gocmVzdWx0UmVsYXRpb24sIGVzdGF0ZSk7 CiAJfQogCisJLyoKKwkgKiBXZSBjYW4gdXNlIENPUFkgZm9yIHJlbW90ZSBpbnNlcnRzIG9ubHkg aWYgYWxsIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworCSAqIGFyZSBtZXQ6CisJICoKKwkgKiBE aXJlY3QgRXhlY3V0aW9uOiBUaGUgY29tbWFuZCBpcyBhIENPUFkgRlJPTSBvbiB0aGUgZm9yZWln biB0YWJsZQorCSAqIGl0c2VsZiwgbm90IHBhcnQgb2YgYSBwYXJ0aXRpb25lZCB0YWJsZSdzIHR1 cGxlIHJvdXRpbmcuICgKKwkgKiByZXN1bHRSZWxJbmZvLT5yaV9Sb290UmVzdWx0UmVsSW5mbyA9 PSBOVUxMKQorCSAqCisJICogTm8gQ2hlY2sgT3B0aW9uczogVGhlcmUgYXJlIG5vIFdJVEggQ0hF Q0sgT1BUSU9OIGNvbnN0cmFpbnRzIG9yCisJICogUm93LUxldmVsIFNlY3VyaXR5IHBvbGljaWVz IHRoYXQgbmVlZCB0byBiZSBlbmZvcmNlZCBsb2NhbGx5CisJICogKHJlc3VsdFJlbEluZm8tPnJp X1dpdGhDaGVja09wdGlvbnMgPT0gTklMKS4KKwkgKgorCSAqIE5vIExvY2FsIEFGVEVSIFRyaWdn ZXJzOiBUaGVyZSBhcmUgbm8gQUZURVIgUk9XIHRyaWdnZXJzIGRlZmluZWQKKwkgKiBsb2NhbGx5 IG9uIHRoZSBmb3JlaWduIHRhYmxlLgorCSAqCisJICogUmVtb3RlIHRyaWdnZXJzIG1pZ2h0IG1v ZGlmeSB0aGUgaW5zZXJ0ZWQgcm93LiBCZWNhdXNlIHRoZSBDT1BZCisJICogcHJvdG9jb2wgZG9l cyBub3Qgc3VwcG9ydCBhIFJFVFVSTklORyBjbGF1c2UsIHdlIGNhbm5vdCByZXRyaWV2ZSB0aG9z ZQorCSAqIGNoYW5nZXMgdG8gc3luY2hyb25pemUgdGhlIGxvY2FsIFR1cGxlVGFibGVTbG90IHJl cXVpcmVkIGJ5IGxvY2FsIEFGVEVSCisJICogdHJpZ2dlcnMuCisJICovCisJaWYgKHJlc3VsdFJl bEluZm8tPnJpX1Jvb3RSZXN1bHRSZWxJbmZvID09IE5VTEwgJiYgcmVzdWx0UmVsSW5mby0+cmlf V2l0aENoZWNrT3B0aW9ucyA9PSBOSUwpCisJeworCQkvKiBUaGVyZSBpcyBubyBSRVRVUk5JTkcg Y2xhdXNlIG9uIENPUFkgKi8KKwkJQXNzZXJ0KHJlc3VsdFJlbEluZm8tPnJpX3JldHVybmluZ0xp c3QgPT0gTklMKTsKKworCQl1c2VDb3B5ID0gKHJlc3VsdFJlbEluZm8tPnJpX1RyaWdEZXNjID09 IE5VTEwgfHwKKwkJCQkgICAhcmVzdWx0UmVsSW5mby0+cmlfVHJpZ0Rlc2MtPnRyaWdfaW5zZXJ0 X2FmdGVyX3Jvdyk7CisJfQorCiAJLyogQ29uc3RydWN0IHRoZSBTUUwgY29tbWFuZCBzdHJpbmcu ICovCi0JZGVwYXJzZUluc2VydFNxbCgmc3FsLCBydGUsIHJlc3VsdFJlbGF0aW9uLCByZWwsIHRh cmdldEF0dHJzLCBkb05vdGhpbmcsCi0JCQkJCSByZXN1bHRSZWxJbmZvLT5yaV9XaXRoQ2hlY2tP cHRpb25zLAotCQkJCQkgcmVzdWx0UmVsSW5mby0+cmlfcmV0dXJuaW5nTGlzdCwKLQkJCQkJICZy ZXRyaWV2ZWRfYXR0cnMsICZ2YWx1ZXNfZW5kX2xlbik7CisJaWYgKHVzZUNvcHkpCisJCWRlcGFy c2VDb3B5U3FsKCZzcWwsIHJlbCwgdGFyZ2V0QXR0cnMpOworCWVsc2UKKwkJZGVwYXJzZUluc2Vy dFNxbCgmc3FsLCBydGUsIHJlc3VsdFJlbGF0aW9uLCByZWwsIHRhcmdldEF0dHJzLCBkb05vdGhp bmcsCisJCQkJCQkgcmVzdWx0UmVsSW5mby0+cmlfV2l0aENoZWNrT3B0aW9ucywKKwkJCQkJCSBy ZXN1bHRSZWxJbmZvLT5yaV9yZXR1cm5pbmdMaXN0LAorCQkJCQkJICZyZXRyaWV2ZWRfYXR0cnMs ICZ2YWx1ZXNfZW5kX2xlbik7CiAKIAkvKiBDb25zdHJ1Y3QgYW4gZXhlY3V0aW9uIHN0YXRlLiAq LwogCWZtc3RhdGUgPSBjcmVhdGVfZm9yZWlnbl9tb2RpZnkobXRzdGF0ZS0+cHMuc3RhdGUsCkBA IC0yMjY1LDYgKzIzMTAsNyBAQCBwb3N0Z3Jlc0JlZ2luRm9yZWlnbkluc2VydChNb2RpZnlUYWJs ZVN0YXRlICptdHN0YXRlLAogCQkJCQkJCQkJdmFsdWVzX2VuZF9sZW4sCiAJCQkJCQkJCQlyZXRy aWV2ZWRfYXR0cnMgIT0gTklMLAogCQkJCQkJCQkJcmV0cmlldmVkX2F0dHJzKTsKKwlmbXN0YXRl LT51c2VfY29weSA9IHVzZUNvcHk7CiAKIAkvKgogCSAqIElmIHRoZSBnaXZlbiByZXN1bHRSZWxJ bmZvIGFscmVhZHkgaGFzIFBnRmR3TW9kaWZ5U3RhdGUgc2V0LCBpdCBtZWFucwpAQCAtNDA5NCw2 ICs0MTQwLDkgQEAgZXhlY3V0ZV9mb3JlaWduX21vZGlmeShFU3RhdGUgKmVzdGF0ZSwKIAkJICAg b3BlcmF0aW9uID09IENNRF9VUERBVEUgfHwKIAkJICAgb3BlcmF0aW9uID09IENNRF9ERUxFVEUp OwogCisJaWYgKGZtc3RhdGUtPnVzZV9jb3B5KQorCQlyZXR1cm4gZXhlY3V0ZV9mb3JlaWduX21v ZGlmeV91c2luZ19jb3B5KGZtc3RhdGUsIHNsb3RzLCBudW1TbG90cyk7CisKIAkvKiBGaXJzdCwg cHJvY2VzcyBhIHBlbmRpbmcgYXN5bmNocm9ub3VzIHJlcXVlc3QsIGlmIGFueS4gKi8KIAlpZiAo Zm1zdGF0ZS0+Y29ubl9zdGF0ZS0+cGVuZGluZ0FyZXEpCiAJCXByb2Nlc3NfcGVuZGluZ19yZXF1 ZXN0KGZtc3RhdGUtPmNvbm5fc3RhdGUtPnBlbmRpbmdBcmVxKTsKQEAgLTc4ODcsMyArNzkzNiwx NTYgQEAgZ2V0X2JhdGNoX3NpemVfb3B0aW9uKFJlbGF0aW9uIHJlbCkKIAogCXJldHVybiBiYXRj aF9zaXplOwogfQorCisvKgorICogZXhlY3V0ZV9mb3JlaWduX21vZGlmeV91c2luZ19jb3B5Cisg KgkJUGVyZm9ybSBmb3JlaWduLXRhYmxlIG1vZGlmaWNhdGlvbiB1c2luZyB0aGUgQ09QWSBjb21t YW5kLgorICovCitzdGF0aWMgVHVwbGVUYWJsZVNsb3QgKioKK2V4ZWN1dGVfZm9yZWlnbl9tb2Rp ZnlfdXNpbmdfY29weShQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJCQkgIFR1cGxl VGFibGVTbG90ICoqc2xvdHMsCisJCQkJCQkJCSAgaW50ICpudW1TbG90cykKK3sKKwlQR3Jlc3Vs dCAgICpyZXM7CisJU3RyaW5nSW5mb0RhdGEgY29weV9kYXRhOworCWludAkJCW5fcm93czsKKwlp bnQJCQlpOworCWludAkJCW5lc3RsZXZlbDsKKworCUFzc2VydChmbXN0YXRlLT51c2VfY29weSA9 PSB0cnVlKTsKKworCWVsb2coREVCVUcxLCAiZm9yZWlnbiBtb2RpZnkgd2l0aCBDT1BZIGJhdGNo X3NpemU6ICVkIiwgZm1zdGF0ZS0+YmF0Y2hfc2l6ZSk7CisKKwkvKiBNYWtlIHN1cmUgYW55IGNv bnN0YW50cyBpbiB0aGUgc2xvdHMgYXJlIHByaW50ZWQgcG9ydGFibHkgKi8KKwluZXN0bGV2ZWwg PSBzZXRfdHJhbnNtaXNzaW9uX21vZGVzKCk7CisKKwkvKiBTZW5kIENPUFkgY29tbWFuZCAqLwor CWlmICghUFFzZW5kUXVlcnkoZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpKQorCQlwZ2Zk d19yZXBvcnRfZXJyb3IoTlVMTCwgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpOworCisJ LyogZ2V0IHRoZSBDT1BZIHJlc3VsdCAqLworCXJlcyA9IHBnZmR3X2dldF9yZXN1bHQoZm1zdGF0 ZS0+Y29ubik7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09QWV9JTikKKwkJ cGdmZHdfcmVwb3J0X2Vycm9yKHJlcywgZm1zdGF0ZS0+Y29ubiwgZm1zdGF0ZS0+cXVlcnkpOwor CisJLyogQ2xlYW4gdXAgdGhlIENPUFkgY29tbWFuZCByZXN1bHQgKi8KKwlQUWNsZWFyKHJlcyk7 CisKKwkvKiBDb252ZXJ0IHRoZSBUdXBsZVRhYmxlU2xvdCBkYXRhIGludG8gYSBURVhULWZvcm1h dHRlZCBsaW5lICovCisJaW5pdFN0cmluZ0luZm8oJmNvcHlfZGF0YSk7CisJZm9yIChpID0gMDsg aSA8ICpudW1TbG90czsgaSsrKQorCXsKKwkJY29udmVydF9zbG90X3RvX2NvcHlfY3N2KCZjb3B5 X2RhdGEsIGZtc3RhdGUsIHNsb3RzW2ldKTsKKworCQkvKgorCQkgKiBTZW5kIGluaXRpYWwgQ09Q WSBkYXRhIGlmIHRoZSBidWZmZXIgcmVhY2hlcyB0aGUgbGltaXQgdG8gYXZvaWQKKwkJICogbGFy Z2UgbWVtb3J5IHVzYWdlLgorCQkgKi8KKwkJaWYgKGNvcHlfZGF0YS5sZW4gPj0gQ09QWUJVRlNJ WikKKwkJeworCQkJaWYgKFBRcHV0Q29weURhdGEoZm1zdGF0ZS0+Y29ubiwgY29weV9kYXRhLmRh dGEsIGNvcHlfZGF0YS5sZW4pIDw9IDApCisJCQkJcGdmZHdfcmVwb3J0X2Vycm9yKE5VTEwsIGZt c3RhdGUtPmNvbm4sIGZtc3RhdGUtPnF1ZXJ5KTsKKwkJCXJlc2V0U3RyaW5nSW5mbygmY29weV9k YXRhKTsKKwkJfQorCX0KKworCS8qIFNlbmQgdGhlIHJlbWFpbmluZyBDT1BZIGRhdGEgKi8KKwlp ZiAoY29weV9kYXRhLmxlbiA+IDApCisJeworCQlpZiAoUFFwdXRDb3B5RGF0YShmbXN0YXRlLT5j b25uLCBjb3B5X2RhdGEuZGF0YSwgY29weV9kYXRhLmxlbikgPD0gMCkKKwkJCXBnZmR3X3JlcG9y dF9lcnJvcihOVUxMLCBmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisJfQorCisJcGZy ZWUoY29weV9kYXRhLmRhdGEpOworCisJLyogRW5kIHRoZSBDT1BZIG9wZXJhdGlvbiAqLworCWlm IChQUXB1dENvcHlFbmQoZm1zdGF0ZS0+Y29ubiwgTlVMTCkgPCAwIHx8IFBRZmx1c2goZm1zdGF0 ZS0+Y29ubikpCisJCXBnZmR3X3JlcG9ydF9lcnJvcihOVUxMLCBmbXN0YXRlLT5jb25uLCBmbXN0 YXRlLT5xdWVyeSk7CisKKwkvKgorCSAqIEdldCB0aGUgcmVzdWx0LCBhbmQgY2hlY2sgZm9yIHN1 Y2Nlc3MuCisJICovCisJcmVzID0gcGdmZHdfZ2V0X3Jlc3VsdChmbXN0YXRlLT5jb25uKTsKKwlp ZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQlwZ2Zkd19yZXBv cnRfZXJyb3IocmVzLCBmbXN0YXRlLT5jb25uLCBmbXN0YXRlLT5xdWVyeSk7CisKKwluX3Jvd3Mg PSBhdG9pKFBRY21kVHVwbGVzKHJlcykpOworCisJLyogQW5kIGNsZWFuIHVwICovCisJUFFjbGVh cihyZXMpOworCisJcmVzZXRfdHJhbnNtaXNzaW9uX21vZGVzKG5lc3RsZXZlbCk7CisKKwlNZW1v cnlDb250ZXh0UmVzZXQoZm1zdGF0ZS0+dGVtcF9jeHQpOworCisJKm51bVNsb3RzID0gbl9yb3dz OworCisJLyoKKwkgKiBSZXR1cm4gTlVMTCBpZiBub3RoaW5nIHdhcyBpbnNlcnRlZCBvbiB0aGUg cmVtb3RlIGVuZAorCSAqLworCXJldHVybiAobl9yb3dzID4gMCkgPyBzbG90cyA6IE5VTEw7Cit9 CisKKy8qCisgKiAgV3JpdGUgdGFyZ2V0IGF0dHJpYnV0ZSB2YWx1ZXMgZnJvbSBmbXN0YXRlIGlu dG8gYnVmIGJ1ZmZlciB0byBiZSBzZW50IGFzCisgKiAgQ09QWSBGUk9NIFNURElOIGRhdGEKKyAq Lworc3RhdGljIHZvaWQKK2NvbnZlcnRfc2xvdF90b19jb3B5X2NzdihTdHJpbmdJbmZvIGJ1ZiwK KwkJCQkJCSBQZ0Zkd01vZGlmeVN0YXRlICpmbXN0YXRlLAorCQkJCQkJIFR1cGxlVGFibGVTbG90 ICpzbG90KQoreworCVR1cGxlRGVzYwl0dXBkZXNjID0gUmVsYXRpb25HZXREZXNjcihmbXN0YXRl LT5yZWwpOworCWJvb2wJCWZpcnN0ID0gdHJ1ZTsKKwlpbnQJCQlpID0gMDsKKworCWZvcmVhY2hf aW50KGF0dG51bSwgZm1zdGF0ZS0+dGFyZ2V0X2F0dHJzKQorCXsKKwkJQ29tcGFjdEF0dHJpYnV0 ZSAqYXR0ciA9IFR1cGxlRGVzY0NvbXBhY3RBdHRyKHR1cGRlc2MsIGF0dG51bSAtIDEpOworCQlE YXR1bQkJZGF0dW07CisJCWJvb2wJCWlzbnVsbDsKKworCQkvKiBJZ25vcmUgZ2VuZXJhdGVkIGNv bHVtbnM7IHRoZXkgYXJlIHNldCB0byBERUZBVUxUICovCisJCWlmIChhdHRyLT5hdHRnZW5lcmF0 ZWQpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0KQorCQkJYXBwZW5kU3RyaW5nSW5mb0No YXJNYWNybyhidWYsICcsJyk7CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJZGF0dW0gPSBzbG90X2dl dGF0dHIoc2xvdCwgYXR0bnVtLCAmaXNudWxsKTsKKworCQlpZiAoaXNudWxsKQorCQl7CisJCQkv KiBJbiBDU1YgZm9ybWF0LCBOVUxMIGlzIGFuIGVtcHR5IHVucXVvdGVkIGZpZWxkICovCisJCX0K KwkJZWxzZQorCQl7CisJCQljb25zdCBjaGFyICp2YWx1ZSA9IE91dHB1dEZ1bmN0aW9uQ2FsbCgm Zm1zdGF0ZS0+cF9mbGluZm9baV0sCisJCQkJCQkJCQkJCQkgICBkYXR1bSk7CisKKwkJCWFwcGVu ZFN0cmluZ0luZm9Dc3YoYnVmLCB2YWx1ZSk7CisJCX0KKwkJaSsrOworCX0KKworCWFwcGVuZFN0 cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAnXG4nKTsKK30KKworLyoKKyAqIEFwcGVuZCBhIHN0cmlu ZyB0byBidWYsIHdpdGggQ1NWIGVzY2FwaW5nIChxdW90ZSBmaWVsZCwgZG91YmxlIGFueSBxdW90 ZXMpLgorICovCitzdGF0aWMgdm9pZAorYXBwZW5kU3RyaW5nSW5mb0NzdihTdHJpbmdJbmZvIGJ1 ZiwgY29uc3QgY2hhciAqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKnB0cjsKKworCWFwcGVuZFN0 cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAnIicpOworCWZvciAocHRyID0gc3RyaW5nOyAqcHRyOyBw dHIrKykKKwl7CisJCWlmICgqcHRyID09ICciJykKKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFj cm8oYnVmLCAnIicpOworCQlhcHBlbmRTdHJpbmdJbmZvQ2hhck1hY3JvKGJ1ZiwgKnB0cik7CisJ fQorCWFwcGVuZFN0cmluZ0luZm9DaGFyTWFjcm8oYnVmLCAnIicpOworfQpkaWZmIC0tZ2l0IGEv Y29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmggYi9jb250cmliL3Bvc3RncmVzX2Zk dy9wb3N0Z3Jlc19mZHcuaAppbmRleCBhMmJiMWZmMzUyYy4uZmM2OTIyZGRkNGYgMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCisrKyBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCkBAIC0yMDQsNiArMjA0LDcgQEAgZXh0ZXJuIHZvaWQg cmVidWlsZEluc2VydFNxbChTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLAogCQkJCQkJCSBj aGFyICpvcmlnX3F1ZXJ5LCBMaXN0ICp0YXJnZXRfYXR0cnMsCiAJCQkJCQkJIGludCB2YWx1ZXNf ZW5kX2xlbiwgaW50IG51bV9wYXJhbXMsCiAJCQkJCQkJIGludCBudW1fcm93cyk7CitleHRlcm4g dm9pZCBkZXBhcnNlQ29weVNxbChTdHJpbmdJbmZvIGJ1ZiwgUmVsYXRpb24gcmVsLCBMaXN0ICp0 YXJnZXRfYXR0cnMpOwogZXh0ZXJuIHZvaWQgZGVwYXJzZVVwZGF0ZVNxbChTdHJpbmdJbmZvIGJ1 ZiwgUmFuZ2VUYmxFbnRyeSAqcnRlLAogCQkJCQkJCSBJbmRleCBydGluZGV4LCBSZWxhdGlvbiBy ZWwsCiAJCQkJCQkJIExpc3QgKnRhcmdldEF0dHJzLApkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwv cG9zdGdyZXNfZmR3LnNxbAppbmRleCA1OTk2M2UyOThiOC4uMWU3MTcyNjNhYTggMTAwNjQ0Ci0t LSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCisrKyBiL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCkBAIC0xOTcwLDYgKzE5NzAsMzcg QEAgc2VsZWN0ICogZnJvbSBnbG9jMTsKIHNlbGVjdCAqIGZyb20gZ3JlbTE7CiBkZWxldGUgZnJv bSBncmVtMTsKIAorLS0gdGVzdCB0aGF0IGZkdyBhbHNvIHVzZSBDT1BZIEZST00gYXMgYSByZW1v dGUgc3FsCitzZXQgY2xpZW50X21pbl9tZXNzYWdlcyB0byAnbG9nJzsKKworY3JlYXRlIGZ1bmN0 aW9uIGluc2VydF9vcl9jb3B5KCkgcmV0dXJucyB0cmlnZ2VyIGFzICQkCitkZWNsYXJlIHF1ZXJ5 IHRleHQ7CitiZWdpbgorICAgIHF1ZXJ5IDo9IGN1cnJlbnRfcXVlcnkoKTsKKyAgICByYWlzZSBu b3RpY2UgJyUnLCBxdWVyeTsKK3JldHVybiBuZXc7CitlbmQ7CiskJCBsYW5ndWFnZSBwbHBnc3Fs OworCitDUkVBVEUgVFJJR0dFUiB0cmlnX3Jvd19iZWZvcmUKK0JFRk9SRSBJTlNFUlQgT1IgVVBE QVRFIE9SIERFTEVURSBPTiBnbG9jMQorRk9SIEVBQ0ggUk9XIEVYRUNVVEUgUFJPQ0VEVVJFIGlu c2VydF9vcl9jb3B5KCk7CisKK2NvcHkgZ3JlbTEgZnJvbSBzdGRpbjsKKzMKK1wuCisKK2Ryb3Ag dHJpZ2dlciB0cmlnX3Jvd19iZWZvcmUgb24gZ2xvYzE7CityZXNldCBjbGllbnRfbWluX21lc3Nh Z2VzOworCistLSB0ZXN0IHRoYXQgY29weSBkb2VzIG5vdCBmYWlsIHdpdGggY29sdW1uX25hbWUg YWxpYXMKK2NyZWF0ZSB0YWJsZSBnbG9jMih4eHggaW50KTsKK2NyZWF0ZSBmb3JlaWduIHRhYmxl IGdyZW0yKGEgaW50KSBzZXJ2ZXIgbG9vcGJhY2sgb3B0aW9ucyh0YWJsZV9uYW1lICdnbG9jMicp OworYWx0ZXIgZm9yZWlnbiB0YWJsZSBncmVtMiBhbHRlciBjb2x1bW4gYSBvcHRpb25zIChjb2x1 bW5fbmFtZSAneHh4Jyk7Citjb3B5IGdyZW0yIGZyb20gc3RkaW47CisxCitcLgorCiAtLSB0ZXN0 IGJhdGNoIGluc2VydAogYWx0ZXIgc2VydmVyIGxvb3BiYWNrIG9wdGlvbnMgKGFkZCBiYXRjaF9z aXplICcxMCcpOwogZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQpAQCAtMTk5Niw2ICsyMDI3 LDI0IEBAIGRyb3AgdGFibGUgdGFiX2JhdGNoX2xvY2FsOwogZHJvcCB0YWJsZSB0YWJfYmF0Y2hf c2hhcmRlZDsKIGRyb3AgdGFibGUgdGFiX2JhdGNoX3NoYXJkZWRfcDFfcmVtb3RlOwogCistLSB0 ZXN0IGJhdGNoIGluc2VydCB1c2luZyBjb3B5CitzZXQgY2xpZW50X21pbl9tZXNzYWdlcyB0byAn ZGVidWcxJzsKK2NvcHkgZ3JlbTEgZnJvbSBzdGRpbjsKKzEKKzIKKzMKKzQKKzUKKzYKKzcKKzgK KzkKKzEwCisxMQorMTIKK1wuCityZXNldCBjbGllbnRfbWluX21lc3NhZ2VzOworCiBhbHRlciBz ZXJ2ZXIgbG9vcGJhY2sgb3B0aW9ucyAoZHJvcCBiYXRjaF9zaXplKTsKIAogLS0gPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQpAQCAtMjg2Myw2ICsyOTEyLDE2IEBAIHNlbGVjdCAqIGZyb20gcmVtMjsKIAogZGVsZXRlIGZy b20gcmVtMjsKIAorLS0gVGVzdCBDT1BZIHdpdGggTlVMTCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJz Citjb3B5IHJlbTIgZnJvbSBzdGRpbjsKKzEJXE4KK1xOCWJhcgorMwlhImIKK1wuCitzZWxlY3Qg KiBmcm9tIHJlbTI7CisKK2RlbGV0ZSBmcm9tIHJlbTI7CisKIC0tIFRlc3QgY2hlY2sgY29uc3Ry YWludHMKIGFsdGVyIHRhYmxlIGxvYzIgYWRkIGNvbnN0cmFpbnQgbG9jMl9mMXBvc2l0aXZlIGNo ZWNrIChmMSA+PSAwKTsKIGFsdGVyIGZvcmVpZ24gdGFibGUgcmVtMiBhZGQgY29uc3RyYWludCBy ZW0yX2YxcG9zaXRpdmUgY2hlY2sgKGYxID49IDApOwpAQCAtMzA2MCw2ICszMTE5LDI5IEBAIGRy b3AgdHJpZ2dlciB0cmlnX251bGwgb24gbG9jMjsKIAogZGVsZXRlIGZyb20gcmVtMjsKIAorLS0g VGVzdCBDT1BZIEZST00gd2l0aCBjb2x1bW4gbGlzdCBhbmQgc3BlY2lhbCBjaGFyYWN0ZXJzCitj b3B5IHJlbTIgKGYxLCBmMikgZnJvbSBzdGRpbjsKKzEJaGVsbG9cbndvcmxkCitcLgorc2VsZWN0 ICogZnJvbSByZW0yOworCitkZWxldGUgZnJvbSByZW0yOworCistLSBUZXN0IHRoYXQgZmxvYXQg bnVtYmVycyBkbyBub3QgbG9vc2UgcHJlY2lzaW9uIHdoZW4gc2VuZGluZyB0byB0aGUgZm9yZWln bgorLS0gc2VydmVyCitjcmVhdGUgdGFibGUgZihhIGZsb2F0KTsKK2NyZWF0ZSBmb3JlaWduIHRh YmxlIGZfZmR3KGEgZmxvYXQpIHNlcnZlciBsb29wYmFjayBvcHRpb25zKHRhYmxlX25hbWUgJ2Yn KTsKKworc2V0IGV4dHJhX2Zsb2F0X2RpZ2l0cyA9IDA7Citjb3B5IGZfZmR3IGZyb20gc3RkaW47 CisxLjAwMDAwMDAwMDAwMDAwMDIKK1wuCisKK3Jlc2V0IGV4dHJhX2Zsb2F0X2RpZ2l0czsKK3Nl bGVjdCAqIGZyb20gZjsKKworZHJvcCB0YWJsZSBmOworCiAtLSBDaGVjayB3aXRoIHplcm8tY29s dW1uIGZvcmVpZ24gdGFibGU7IGJhdGNoIGluc2VydCB3aWxsIGJlIGRpc2FibGVkCiBhbHRlciB0 YWJsZSBsb2MyIGRyb3AgY29sdW1uIGYxOwogYWx0ZXIgdGFibGUgbG9jMiBkcm9wIGNvbHVtbiBm MjsKLS0gCjIuNTIuMAoK --7da32911355ab8d657c1eba4060ab83e8bcb68565d05d8fd5b675c97c90f--