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.94.2) (envelope-from ) id 1rALaQ-006CwK-4K for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 02:55:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rALaM-001sLq-RX for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 02:54:58 +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.94.2) (envelope-from ) id 1rALaM-001sLi-3n for pgsql-hackers@lists.postgresql.org; Tue, 05 Dec 2023 02:54:58 +0000 Received: from mail-yw1-x112b.google.com ([2607:f8b0:4864:20::112b]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rALaI-00A9Kv-3K for pgsql-hackers@postgresql.org; Tue, 05 Dec 2023 02:54:57 +0000 Received: by mail-yw1-x112b.google.com with SMTP id 00721157ae682-5d3758fdd2eso49115017b3.0 for ; Mon, 04 Dec 2023 18:54:53 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701744892; x=1702349692; darn=postgresql.org; h=in-reply-to:autocrypt:from:references:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=Fia2Jk9xLKqq1DcwBkVa9UsuDVCPHvqbnc5PWZe7Puk=; b=fnUpDl04P9w3hRBrANcruQk0Uy5IzqWLBBxnv45npRrDTbTw9vJ4Cx21Tgulm/wcDn JkaPfa+VaBEUyRM7KrbdgLB92KuIGkFNcvTNiQ9NltCjZs7Z5y9v3cWgct8OPPlVuMNc dwX1oYn/8kidEvQXZJGb6dhjjZA1E8Q0/ygBKHdd3HygWkRmSUayFWqMTsB0Ydxnnzs5 Bk/kQ/pVZAXqaBLZPUXkAD35QZ2Quyz4E+IFA/q1ldUY1SKTpmpIypHylts3+xIwviV6 2FOsF7iggp3S/vLSr7GxsAJpE5cyxVII5IDJM944DS3r6I1BqmEf//XJucES8eKZ7ovp zXYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701744892; x=1702349692; h=in-reply-to:autocrypt:from:references:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Fia2Jk9xLKqq1DcwBkVa9UsuDVCPHvqbnc5PWZe7Puk=; b=idcZpKM+jsoyKo/eppXmqrBP4jefMjHMLRWwFs+Wjr/Whx5H/L3dnCkeTYx57u06k6 j3CTfcmn9naQrsvLVHgd73f5keXriwNKcuePI7gruFIpSdxVydVL/h8MtzyXbCutDaRh eWhGIHTYbeQ1PQ1BYMOte5hieWhX9JXWlJubdGGBuEgnNeeOm16DyMxCwMzuxTigQkxA vHeXbApyOD1JbSc3C4h6c14ZrNwnH+CaWtcHOo35UeNCaZ3Dor/etFJaOyB9O3LWf5sh lFXZ2QlAHSyMCdgPmX4I1kNz3YeXZDz4Vu2QN/OJ2hItkbApjob96g1lDU83b/euo8eN vDLg== X-Gm-Message-State: AOJu0Yw3+hyskf8IOKkuBQn4K3/bLlxPgGMkDE7Hp8tO4xqbbGaZAQCq Sy8GHzO/5xYLC9CQQ3Ge/E43OAPE3U06NugYBTw= X-Google-Smtp-Source: AGHT+IGdir+9BzOW7I/aY0C8HVampy3De3aap/ghX71WyEfitm7jMP0pCt3Nwca4tp5ewOWVdRQP8g== X-Received: by 2002:a05:690c:dd0:b0:5d7:1941:357c with SMTP id db16-20020a05690c0dd000b005d71941357cmr4172084ywb.99.1701744891764; Mon, 04 Dec 2023 18:54:51 -0800 (PST) Received: from [192.168.4.41] (162-239-31-113.lightspeed.dybhfl.sbcglobal.net. [162.239.31.113]) by smtp.gmail.com with ESMTPSA id w138-20020a814990000000b0059a34cfa2a8sm3792070ywa.62.2023.12.04.18.54.51 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 04 Dec 2023 18:54:51 -0800 (PST) Content-Type: multipart/mixed; boundary="------------dFi0rpRctt2Qdggk1MZVp8aX" Message-ID: Date: Mon, 4 Dec 2023 21:54:50 -0500 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Emitting JSON to file using COPY TO Content-Language: en-US To: Davin Shearer , Andrew Dunstan , PostgreSQL-development References: <3a98decf-3fe3-4b49-9b68-fda01338872c@sedlakovi.org> <24e3ee88-ec1e-421b-89ae-8a47ee0d2df1@joeconway.com> <7117a356-916c-4cf3-bad8-861490e65dcf@joeconway.com> <9c77b6fa-ee88-b2e6-0fa7-4fc81721da35@dunslane.net> <41dcba92-1075-e5e5-cb99-36711abf6cec@dunslane.net> <5c84b70b-ba18-c45d-dbbe-612fa229b2ce@dunslane.net> From: Joe Conway Autocrypt: addr=mail@joeconway.com; keydata= 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 In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------dFi0rpRctt2Qdggk1MZVp8aX Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 12/4/23 17:55, Davin Shearer wrote: > Sorry about the top posting / top quoting... the link you sent me gives > me a 404.  I'm not exactly sure what top quoting / posting means and > Googling those terms wasn't helpful for me, but I've removed the quoting > that my mail client is automatically "helpfully" adding to my emails.  I > mean no offense. No offense taken. But it is worthwhile to conform to the very long established norms of the mailing lists on which you participate. See: https://en.wikipedia.org/wiki/Posting_style I would describe the Postgres list style (based on that link) as "inline replying, in which the different parts of the reply follow the relevant parts of the original post...[with]...trimming of the original text" > There are however a few characters that need to be escaped > 1. |"|(double quote) > 2. |\|(backslash) > 3. |/|(forward slash) > 4. |\b|(backspace) > 5. |\f|(form feed) > 6. |\n|(new line) > 7. |\r|(carriage return) > 8. |\t|(horizontal tab) > > These characters should be represented in the test cases to see how the > escaping behaves and to ensure that the escaping is done properly per > JSON requirements. I can look at adding these as test cases. The latest version of the patch (attached) includes some of that already. For reference, the tests so far include this: 8<------------------------------- test=# select * from copytest; style | test | filler ---------+----------+-------- DOS | abc\r +| 1 | def | Unix | abc +| 2 | def | Mac | abc\rdef | 3 esc\ape | a\r\\r\ +| 4 | \nb | (4 rows) test=# copy copytest to stdout (format json); {"style":"DOS","test":"abc\r\ndef","filler":1} {"style":"Unix","test":"abc\ndef","filler":2} {"style":"Mac","test":"abc\rdef","filler":3} {"style":"esc\\ape","test":"a\\r\\\r\\\n\\nb","filler":4} 8<------------------------------- At this point "COPY TO" should be sending exactly the unaltered output of the postgres JSON processing functions. -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --------------dFi0rpRctt2Qdggk1MZVp8aX Content-Type: text/x-patch; charset=UTF-8; name="copyto_json.004.diff" Content-Disposition: attachment; filename="copyto_json.004.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvY29weS5zZ21sIGIvZG9jL3NyYy9zZ21s L3JlZi9jb3B5LnNnbWwKaW5kZXggMThlY2M2OS4uYWY4Nzc3YiAxMDA2NDQKKioqIGEvZG9j L3NyYy9zZ21sL3JlZi9jb3B5LnNnbWwKLS0tIGIvZG9jL3NyYy9zZ21sL3JlZi9jb3B5LnNn bWwKKioqKioqKioqKioqKioqIENPUFkgeyA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRl ciI+dGEKKioqIDQzLDQ4ICoqKioKLS0tIDQzLDUwIC0tLS0KICAgICAgRk9SQ0VfUVVPVEUg eyAoIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb2x1bW5fbmFtZTwvcmVwbGFj ZWFibGU+IFssIC4uLl0gKSB8ICogfQogICAgICBGT1JDRV9OT1RfTlVMTCB7ICggPHJlcGxh Y2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbHVtbl9uYW1lPC9yZXBsYWNlYWJsZT4gWywg Li4uXSApIHwgKiB9CiAgICAgIEZPUkNFX05VTEwgeyAoIDxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5jb2x1bW5fbmFtZTwvcmVwbGFjZWFibGU+IFssIC4uLl0gKSB8ICogfQor ICAgICBGT1JDRV9BUlJBWSBbIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5ib29s ZWFuPC9yZXBsYWNlYWJsZT4gXQorICAgICBGT1JDRV9ST1dfREVMSU1JVEVSIFsgPHJlcGxh Y2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmJvb2xlYW48L3JlcGxhY2VhYmxlPiBdCiAgICAg IEVOQ09ESU5HICc8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZW5jb2RpbmdfbmFt ZTwvcmVwbGFjZWFibGU+JwogIDwvc3lub3BzaXM+CiAgIDwvcmVmc3lub3BzaXNkaXY+Cioq KioqKioqKioqKioqKiBDT1BZIHsgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnRh CioqKiAyMDYsMjE0ICoqKioKLS0tIDIwOCwyMjEgLS0tLQogICAgICAgIFNlbGVjdHMgdGhl IGRhdGEgZm9ybWF0IHRvIGJlIHJlYWQgb3Igd3JpdHRlbjoKICAgICAgICA8bGl0ZXJhbD50 ZXh0PC9saXRlcmFsPiwKICAgICAgICA8bGl0ZXJhbD5jc3Y8L2xpdGVyYWw+IChDb21tYSBT ZXBhcmF0ZWQgVmFsdWVzKSwKKyAgICAgICA8bGl0ZXJhbD5qc29uPC9saXRlcmFsPiAoSmF2 YVNjcmlwdCBPYmplY3QgTm90YXRpb24pLAogICAgICAgIG9yIDxsaXRlcmFsPmJpbmFyeTwv bGl0ZXJhbD4uCiAgICAgICAgVGhlIGRlZmF1bHQgaXMgPGxpdGVyYWw+dGV4dDwvbGl0ZXJh bD4uCiAgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICBUaGUgPGxpdGVyYWw+ anNvbjwvbGl0ZXJhbD4gb3B0aW9uIGlzIGFsbG93ZWQgb25seSBpbgorICAgICAgIDxjb21t YW5kPkNPUFkgVE88L2NvbW1hbmQ+LgorICAgICAgPC9wYXJhPgogICAgICA8L2xpc3RpdGVt PgogICAgIDwvdmFybGlzdGVudHJ5PgogIAoqKioqKioqKioqKioqKiogQ09QWSB7IDxyZXBs YWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj50YQoqKiogMzcyLDM3NyAqKioqCi0tLSAzNzks NDEwIC0tLS0KICAgICAgIDwvcGFyYT4KICAgICAgPC9saXN0aXRlbT4KICAgICA8L3Zhcmxp c3RlbnRyeT4KKyAKKyAgICA8dmFybGlzdGVudHJ5PgorICAgICA8dGVybT48bGl0ZXJhbD5G T1JDRV9ST1dfREVMSU1JVEVSPC9saXRlcmFsPjwvdGVybT4KKyAgICAgPGxpc3RpdGVtPgor ICAgICAgPHBhcmE+CisgICAgICAgRm9yY2Ugb3V0cHV0IG9mIGNvbW1hcyBhcyByb3cgZGVs aW1pdGVycywgaW4gYWRkaXRpb24gdG8gdGhlIHVzdWFsCisgICAgICAgZW5kIG9mIGxpbmUg Y2hhcmFjdGVycy4gVGhpcyBvcHRpb24gaXMgYWxsb3dlZCBvbmx5IGluCisgICAgICAgPGNv bW1hbmQ+Q09QWSBUTzwvY29tbWFuZD4sIGFuZCBvbmx5IHdoZW4gdXNpbmcKKyAgICAgICA8 bGl0ZXJhbD5KU09OPC9saXRlcmFsPiBmb3JtYXQuCisgICAgICAgVGhlIGRlZmF1bHQgaXMg PGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorICAgICA8L2xpc3Rp dGVtPgorICAgIDwvdmFybGlzdGVudHJ5PgorIAorICAgIDx2YXJsaXN0ZW50cnk+CisgICAg IDx0ZXJtPjxsaXRlcmFsPkZPUkNFX0FSUkFZPC9saXRlcmFsPjwvdGVybT4KKyAgICAgPGxp c3RpdGVtPgorICAgICAgPHBhcmE+CisgICAgICAgRm9yY2Ugb3V0cHV0IG9mIGFycmF5IGRl Y29yYXRpb25zIGF0IHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiBvdXRwdXQuCisgICAgICAg VGhpcyBvcHRpb24gaW1wbGllcyB0aGUgPGxpdGVyYWw+Rk9SQ0VfUk9XX0RFTElNSVRFUjwv bGl0ZXJhbD4KKyAgICAgICBvcHRpb24uIEl0IGlzIGFsbG93ZWQgb25seSBpbiA8Y29tbWFu ZD5DT1BZIFRPPC9jb21tYW5kPiwgYW5kIG9ubHkKKyAgICAgICB3aGVuIHVzaW5nIDxsaXRl cmFsPkpTT048L2xpdGVyYWw+IGZvcm1hdC4KKyAgICAgICBUaGUgZGVmYXVsdCBpcyA8bGl0 ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+ CisgICAgPC92YXJsaXN0ZW50cnk+CiAgCiAgICAgPHZhcmxpc3RlbnRyeT4KICAgICAgPHRl cm0+PGxpdGVyYWw+RU5DT0RJTkc8L2xpdGVyYWw+PC90ZXJtPgpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvY29tbWFuZHMvY29weS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5j CmluZGV4IGNmYWQ0N2IuLjAyMzZhOWUgMTAwNjQ0CioqKiBhL3NyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHkuYwotLS0gYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMKKioqKioqKioq KioqKioqIFByb2Nlc3NDb3B5T3B0aW9ucyhQYXJzZVN0YXRlICpwc3RhdGUsCioqKiA0MTks NDI0ICoqKioKLS0tIDQxOSw0MjYgLS0tLQogIAlib29sCQlmb3JtYXRfc3BlY2lmaWVkID0g ZmFsc2U7CiAgCWJvb2wJCWZyZWV6ZV9zcGVjaWZpZWQgPSBmYWxzZTsKICAJYm9vbAkJaGVh ZGVyX3NwZWNpZmllZCA9IGZhbHNlOworIAlib29sCQlmb3JjZV9yb3dfZGVsaW1pdGVyX3Nw ZWNpZmllZCA9IGZhbHNlOworIAlib29sCQlmb3JjZV9hcnJheV9zcGVjaWZpZWQgPSBmYWxz ZTsKICAJTGlzdENlbGwgICAqb3B0aW9uOwogIAogIAkvKiBTdXBwb3J0IGV4dGVybmFsIHVz ZSBmb3Igb3B0aW9uIHNhbml0eSBjaGVja2luZyAqLwoqKioqKioqKioqKioqKiogUHJvY2Vz c0NvcHlPcHRpb25zKFBhcnNlU3RhdGUgKnBzdGF0ZSwKKioqIDQ0Myw0NDggKioqKgotLS0g NDQ1LDQ1MiAtLS0tCiAgCQkJCSAvKiBkZWZhdWx0IGZvcm1hdCAqLyA7CiAgCQkJZWxzZSBp ZiAoc3RyY21wKGZtdCwgImNzdiIpID09IDApCiAgCQkJCW9wdHNfb3V0LT5jc3ZfbW9kZSA9 IHRydWU7CisgCQkJZWxzZSBpZiAoc3RyY21wKGZtdCwgImpzb24iKSA9PSAwKQorIAkJCQlv cHRzX291dC0+anNvbl9tb2RlID0gdHJ1ZTsKICAJCQllbHNlIGlmIChzdHJjbXAoZm10LCAi YmluYXJ5IikgPT0gMCkKICAJCQkJb3B0c19vdXQtPmJpbmFyeSA9IHRydWU7CiAgCQkJZWxz ZQoqKioqKioqKioqKioqKiogUHJvY2Vzc0NvcHlPcHRpb25zKFBhcnNlU3RhdGUgKnBzdGF0 ZSwKKioqIDU0MCw1NDUgKioqKgotLS0gNTQ0LDU2MyAtLS0tCiAgCQkJCQkJCQlkZWZlbC0+ ZGVmbmFtZSksCiAgCQkJCQkJIHBhcnNlcl9lcnJwb3NpdGlvbihwc3RhdGUsIGRlZmVsLT5s b2NhdGlvbikpKTsKICAJCX0KKyAJCWVsc2UgaWYgKHN0cmNtcChkZWZlbC0+ZGVmbmFtZSwg ImZvcmNlX3Jvd19kZWxpbWl0ZXIiKSA9PSAwKQorIAkJeworIAkJCWlmIChmb3JjZV9yb3df ZGVsaW1pdGVyX3NwZWNpZmllZCkKKyAJCQkJZXJyb3JDb25mbGljdGluZ0RlZkVsZW0oZGVm ZWwsIHBzdGF0ZSk7CisgCQkJZm9yY2Vfcm93X2RlbGltaXRlcl9zcGVjaWZpZWQgPSB0cnVl OworIAkJCW9wdHNfb3V0LT5mb3JjZV9yb3dfZGVsaW1pdGVyID0gZGVmR2V0Qm9vbGVhbihk ZWZlbCk7CisgCQl9CisgCQllbHNlIGlmIChzdHJjbXAoZGVmZWwtPmRlZm5hbWUsICJmb3Jj ZV9hcnJheSIpID09IDApCisgCQl7CisgCQkJaWYgKGZvcmNlX2FycmF5X3NwZWNpZmllZCkK KyAJCQkJZXJyb3JDb25mbGljdGluZ0RlZkVsZW0oZGVmZWwsIHBzdGF0ZSk7CisgCQkJZm9y Y2VfYXJyYXlfc3BlY2lmaWVkID0gdHJ1ZTsKKyAJCQlvcHRzX291dC0+Zm9yY2VfYXJyYXkg PSBkZWZHZXRCb29sZWFuKGRlZmVsKTsKKyAJCX0KICAJCWVsc2UgaWYgKHN0cmNtcChkZWZl bC0+ZGVmbmFtZSwgImNvbnZlcnRfc2VsZWN0aXZlbHkiKSA9PSAwKQogIAkJewogIAkJCS8q CioqKioqKioqKioqKioqKiBQcm9jZXNzQ29weU9wdGlvbnMoUGFyc2VTdGF0ZSAqcHN0YXRl LAoqKiogNTk4LDYwMyAqKioqCi0tLSA2MTYsNjQ3IC0tLS0KICAJCQkJKGVycmNvZGUoRVJS Q09ERV9TWU5UQVhfRVJST1IpLAogIAkJCQkgZXJybXNnKCJjYW5ub3Qgc3BlY2lmeSBERUZB VUxUIGluIEJJTkFSWSBtb2RlIikpKTsKICAKKyAJaWYgKG9wdHNfb3V0LT5qc29uX21vZGUp CisgCXsKKyAJCWlmIChpc19mcm9tKQorIAkJCWVyZXBvcnQoRVJST1IsCisgCQkJCQkoZXJy Y29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisgCQkJCQkgZXJybXNnKCJj YW5ub3QgdXNlIEpTT04gbW9kZSBpbiBDT1BZIEZST00iKSkpOworIAorIAkJaWYgKG9wdHNf b3V0LT5mb3JjZV9hcnJheSAmJgorIAkJCWZvcmNlX3Jvd19kZWxpbWl0ZXJfc3BlY2lmaWVk ICYmCisgCQkJIW9wdHNfb3V0LT5mb3JjZV9yb3dfZGVsaW1pdGVyKQorIAkJCWVyZXBvcnQo RVJST1IsCisgCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CisgCQkJCQkgZXJybXNnKCJjYW5ub3Qgc3BlY2lmeSBGT1JDRV9ST1dfREVMSU1JVEVSIGZh bHNlIHdpdGggRk9SQ0VfQVJSQVkgdHJ1ZSIpKSk7CisgCisgCQlpZiAob3B0c19vdXQtPmZv cmNlX2FycmF5KQorIAkJCW9wdHNfb3V0LT5mb3JjZV9yb3dfZGVsaW1pdGVyID0gdHJ1ZTsK KyAJfQorIAllbHNlIGlmIChvcHRzX291dC0+Zm9yY2VfYXJyYXkpCisgCQllcmVwb3J0KEVS Uk9SLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisg CQkJCSBlcnJtc2coIkNPUFkgRk9SQ0VfQVJSQVkgcmVxdWlyZXMgSlNPTiBtb2RlIikpKTsK KyAJZWxzZSBpZiAob3B0c19vdXQtPmZvcmNlX3Jvd19kZWxpbWl0ZXIpCisgCQllcmVwb3J0 KEVSUk9SLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCks CisgCQkJCSBlcnJtc2coIkNPUFkgRk9SQ0VfUk9XX0RFTElNSVRFUiByZXF1aXJlcyBKU09O IG1vZGUiKSkpOworIAogIAkvKiBTZXQgZGVmYXVsdHMgZm9yIG9taXR0ZWQgb3B0aW9ucyAq LwogIAlpZiAoIW9wdHNfb3V0LT5kZWxpbSkKICAJCW9wdHNfb3V0LT5kZWxpbSA9IG9wdHNf b3V0LT5jc3ZfbW9kZSA/ICIsIiA6ICJcdCI7CioqKioqKioqKioqKioqKiBQcm9jZXNzQ29w eU9wdGlvbnMoUGFyc2VTdGF0ZSAqcHN0YXRlLAoqKiogNjY3LDY3MiAqKioqCi0tLSA3MTEs NzIxIC0tLS0KICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQp LAogIAkJCQkgZXJybXNnKCJjYW5ub3Qgc3BlY2lmeSBIRUFERVIgaW4gQklOQVJZIG1vZGUi KSkpOwogIAorIAlpZiAob3B0c19vdXQtPmpzb25fbW9kZSAmJiBvcHRzX291dC0+aGVhZGVy X2xpbmUpCisgCQllcmVwb3J0KEVSUk9SLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCisgCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5IEhFQURF UiBpbiBKU09OIG1vZGUiKSkpOworIAogIAkvKiBDaGVjayBxdW90ZSAqLwogIAlpZiAoIW9w dHNfb3V0LT5jc3ZfbW9kZSAmJiBvcHRzX291dC0+cXVvdGUgIT0gTlVMTCkKICAJCWVyZXBv cnQoRVJST1IsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8uYyBi L3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCmluZGV4IGM2NmEwNDcuLmZiYTMwNzAg MTAwNjQ0CioqKiBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCi0tLSBiL3NyYy9i YWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCioqKioqKioqKioqKioqKgoqKiogMzcsNDIgKioq KgotLS0gMzcsNDMgLS0tLQogICNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVyLmgi CiAgI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICAjaW5jbHVkZSAidGNvcC90Y29wcHJvdC5o IgorICNpbmNsdWRlICJ1dGlscy9qc29uLmgiCiAgI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNo ZS5oIgogICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogICNpbmNsdWRlICJ1dGlscy9w YXJ0Y2FjaGUuaCIKKioqKioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0CioqKiAxMTIsMTE3 ICoqKioKLS0tIDExMywxMjAgLS0tLQogIC8qIE5PVEU6IHRoZXJlJ3MgYSBjb3B5IG9mIHRo aXMgaW4gY29weWZyb21wYXJzZS5jICovCiAgc3RhdGljIGNvbnN0IGNoYXIgQmluYXJ5U2ln bmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAiOwogIAorIC8qIG5lZWQgZGVsaW1p dGVyIHRvIHN0YXJ0IG5leHQganNvbiBhcnJheSBlbGVtZW50ICovCisgc3RhdGljIGJvb2wg anNvbl9yb3dfZGVsaW1fbmVlZGVkID0gZmFsc2U7CiAgCiAgLyogbm9uLWV4cG9ydCBmdW5j dGlvbiBwcm90b3R5cGVzICovCiAgc3RhdGljIHZvaWQgRW5kQ29weShDb3B5VG9TdGF0ZSBj c3RhdGUpOwoqKioqKioqKioqKioqKiogRG9Db3B5VG8oQ29weVRvU3RhdGUgY3N0YXRlKQoq KiogODQ1LDg1MCAqKioqCi0tLSA4NDgsODY3IC0tLS0KICAKICAJCQlDb3B5U2VuZEVuZE9m Um93KGNzdGF0ZSk7CiAgCQl9CisgCisgCQkvKgorIAkJICogSWYgSlNPTiBoYXMgYmVlbiBy ZXF1ZXN0ZWQsIGFuZCBGT1JDRV9BUlJBWSBoYXMgYmVlbiBzcGVjaWZpZWQKKyAJCSAqIHNl bmQgdGhlIG9wZW5pbmcgYnJhY2tldC4KKyAJCSAqLworIAkJaWYgKGNzdGF0ZS0+b3B0cy5q c29uX21vZGUpCisgCQl7CisgCQkJaWYgKGNzdGF0ZS0+b3B0cy5mb3JjZV9hcnJheSkKKyAJ CQl7CisgCQkJCUNvcHlTZW5kQ2hhcihjc3RhdGUsICdbJyk7CisgCQkJCUNvcHlTZW5kRW5k T2ZSb3coY3N0YXRlKTsKKyAJCQl9CisgCQkJanNvbl9yb3dfZGVsaW1fbmVlZGVkID0gZmFs c2U7CisgCQl9CiAgCX0KICAKICAJaWYgKGNzdGF0ZS0+cmVsKQoqKioqKioqKioqKioqKiog RG9Db3B5VG8oQ29weVRvU3RhdGUgY3N0YXRlKQoqKiogODkyLDg5NyAqKioqCi0tLSA5MDks OTI1IC0tLS0KICAJCUNvcHlTZW5kRW5kT2ZSb3coY3N0YXRlKTsKICAJfQogIAorIAkvKgor IAkgKiBJZiBKU09OIGhhcyBiZWVuIHJlcXVlc3RlZCwgYW5kIEZPUkNFX0FSUkFZIGhhcyBi ZWVuIHNwZWNpZmllZAorIAkgKiBzZW5kIHRoZSBjbG9zaW5nIGJyYWNrZXQuCisgCSAqLwor IAlpZiAoY3N0YXRlLT5vcHRzLmpzb25fbW9kZSAmJgorIAkJY3N0YXRlLT5vcHRzLmZvcmNl X2FycmF5KQorIAl7CisgCQlDb3B5U2VuZENoYXIoY3N0YXRlLCAnXScpOworIAkJQ29weVNl bmRFbmRPZlJvdyhjc3RhdGUpOworIAl9CisgCiAgCU1lbW9yeUNvbnRleHREZWxldGUoY3N0 YXRlLT5yb3djb250ZXh0KTsKICAKICAJaWYgKGZlX2NvcHkpCioqKioqKioqKioqKioqKiBE b0NvcHlUbyhDb3B5VG9TdGF0ZSBjc3RhdGUpCioqKiA5MDYsOTE2ICoqKioKICBzdGF0aWMg dm9pZAogIENvcHlPbmVSb3dUbyhDb3B5VG9TdGF0ZSBjc3RhdGUsIFR1cGxlVGFibGVTbG90 ICpzbG90KQogIHsKLSAJYm9vbAkJbmVlZF9kZWxpbSA9IGZhbHNlOwotIAlGbWdySW5mbyAg ICpvdXRfZnVuY3Rpb25zID0gY3N0YXRlLT5vdXRfZnVuY3Rpb25zOwogIAlNZW1vcnlDb250 ZXh0IG9sZGNvbnRleHQ7Ci0gCUxpc3RDZWxsICAgKmN1cjsKLSAJY2hhcgkgICAqc3RyaW5n OwogIAogIAlNZW1vcnlDb250ZXh0UmVzZXQoY3N0YXRlLT5yb3djb250ZXh0KTsKICAJb2xk Y29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjc3RhdGUtPnJvd2NvbnRleHQpOwot LS0gOTM0LDk0MCAtLS0tCioqKioqKioqKioqKioqKiBDb3B5T25lUm93VG8oQ29weVRvU3Rh dGUgY3N0YXRlLCBUdXBsZVRhCioqKiA5MjEsOTc0ICoqKioKICAJCUNvcHlTZW5kSW50MTYo Y3N0YXRlLCBsaXN0X2xlbmd0aChjc3RhdGUtPmF0dG51bWxpc3QpKTsKICAJfQogIAohIAkv KiBNYWtlIHN1cmUgdGhlIHR1cGxlIGlzIGZ1bGx5IGRlY29uc3RydWN0ZWQgKi8KISAJc2xv dF9nZXRhbGxhdHRycyhzbG90KTsKISAKISAJZm9yZWFjaChjdXIsIGNzdGF0ZS0+YXR0bnVt bGlzdCkKICAJewohIAkJaW50CQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOwohIAkJRGF0 dW0JCXZhbHVlID0gc2xvdC0+dHRzX3ZhbHVlc1thdHRudW0gLSAxXTsKISAJCWJvb2wJCWlz bnVsbCA9IHNsb3QtPnR0c19pc251bGxbYXR0bnVtIC0gMV07CiAgCiEgCQlpZiAoIWNzdGF0 ZS0+b3B0cy5iaW5hcnkpCiEgCQl7CiEgCQkJaWYgKG5lZWRfZGVsaW0pCiEgCQkJCUNvcHlT ZW5kQ2hhcihjc3RhdGUsIGNzdGF0ZS0+b3B0cy5kZWxpbVswXSk7CiEgCQkJbmVlZF9kZWxp bSA9IHRydWU7CiEgCQl9CiAgCiEgCQlpZiAoaXNudWxsKQohIAkJewohIAkJCWlmICghY3N0 YXRlLT5vcHRzLmJpbmFyeSkKISAJCQkJQ29weVNlbmRTdHJpbmcoY3N0YXRlLCBjc3RhdGUt Pm9wdHMubnVsbF9wcmludF9jbGllbnQpOwohIAkJCWVsc2UKISAJCQkJQ29weVNlbmRJbnQz Mihjc3RhdGUsIC0xKTsKISAJCX0KISAJCWVsc2UKICAJCXsKICAJCQlpZiAoIWNzdGF0ZS0+ b3B0cy5iaW5hcnkpCiAgCQkJewohIAkJCQlzdHJpbmcgPSBPdXRwdXRGdW5jdGlvbkNhbGwo Jm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiEgCQkJCQkJCQkJCQl2YWx1ZSk7CiEgCQkJ CWlmIChjc3RhdGUtPm9wdHMuY3N2X21vZGUpCiEgCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NW KGNzdGF0ZSwgc3RyaW5nLAohIAkJCQkJCQkJCQljc3RhdGUtPm9wdHMuZm9yY2VfcXVvdGVf ZmxhZ3NbYXR0bnVtIC0gMV0sCiEgCQkJCQkJCQkJCWxpc3RfbGVuZ3RoKGNzdGF0ZS0+YXR0 bnVtbGlzdCkgPT0gMSk7CiAgCQkJCWVsc2UKISAJCQkJCUNvcHlBdHRyaWJ1dGVPdXRUZXh0 KGNzdGF0ZSwgc3RyaW5nKTsKICAJCQl9CiAgCQkJZWxzZQogIAkJCXsKISAJCQkJYnl0ZWEJ ICAgKm91dHB1dGJ5dGVzOwogIAohIAkJCQlvdXRwdXRieXRlcyA9IFNlbmRGdW5jdGlvbkNh bGwoJm91dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiEgCQkJCQkJCQkJCQkgICB2YWx1ZSk7 CiEgCQkJCUNvcHlTZW5kSW50MzIoY3N0YXRlLCBWQVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZB UkhEUlNaKTsKISAJCQkJQ29weVNlbmREYXRhKGNzdGF0ZSwgVkFSREFUQShvdXRwdXRieXRl cyksCiEgCQkJCQkJCSBWQVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZBUkhEUlNaKTsKICAJCQl9 CiAgCQl9CiAgCX0KICAKICAJQ29weVNlbmRFbmRPZlJvdyhjc3RhdGUpOwogIAotLS0gOTQ1 LDEwMjggLS0tLQogIAkJQ29weVNlbmRJbnQxNihjc3RhdGUsIGxpc3RfbGVuZ3RoKGNzdGF0 ZS0+YXR0bnVtbGlzdCkpOwogIAl9CiAgCiEgCWlmICghY3N0YXRlLT5vcHRzLmpzb25fbW9k ZSkKICAJewohIAkJYm9vbAkJbmVlZF9kZWxpbSA9IGZhbHNlOwohIAkJRm1nckluZm8gICAq b3V0X2Z1bmN0aW9ucyA9IGNzdGF0ZS0+b3V0X2Z1bmN0aW9uczsKISAJCUxpc3RDZWxsICAg KmN1cjsKISAJCWNoYXIJICAgKnN0cmluZzsKICAKISAJCS8qIE1ha2Ugc3VyZSB0aGUgdHVw bGUgaXMgZnVsbHkgZGVjb25zdHJ1Y3RlZCAqLwohIAkJc2xvdF9nZXRhbGxhdHRycyhzbG90 KTsKICAKISAJCWZvcmVhY2goY3VyLCBjc3RhdGUtPmF0dG51bWxpc3QpCiAgCQl7CisgCQkJ aW50CQkJYXR0bnVtID0gbGZpcnN0X2ludChjdXIpOworIAkJCURhdHVtCQl2YWx1ZSA9IHNs b3QtPnR0c192YWx1ZXNbYXR0bnVtIC0gMV07CisgCQkJYm9vbAkJaXNudWxsID0gc2xvdC0+ dHRzX2lzbnVsbFthdHRudW0gLSAxXTsKKyAKICAJCQlpZiAoIWNzdGF0ZS0+b3B0cy5iaW5h cnkpCiAgCQkJewohIAkJCQlpZiAobmVlZF9kZWxpbSkKISAJCQkJCUNvcHlTZW5kQ2hhcihj c3RhdGUsIGNzdGF0ZS0+b3B0cy5kZWxpbVswXSk7CiEgCQkJCW5lZWRfZGVsaW0gPSB0cnVl OwohIAkJCX0KISAKISAJCQlpZiAoaXNudWxsKQohIAkJCXsKISAJCQkJaWYgKCFjc3RhdGUt Pm9wdHMuYmluYXJ5KQohIAkJCQkJQ29weVNlbmRTdHJpbmcoY3N0YXRlLCBjc3RhdGUtPm9w dHMubnVsbF9wcmludF9jbGllbnQpOwogIAkJCQllbHNlCiEgCQkJCQlDb3B5U2VuZEludDMy KGNzdGF0ZSwgLTEpOwogIAkJCX0KICAJCQllbHNlCiAgCQkJewohIAkJCQlpZiAoIWNzdGF0 ZS0+b3B0cy5iaW5hcnkpCiEgCQkJCXsKISAJCQkJCXN0cmluZyA9IE91dHB1dEZ1bmN0aW9u Q2FsbCgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwKISAJCQkJCQkJCQkJCQl2YWx1ZSk7 CiEgCQkJCQlpZiAoY3N0YXRlLT5vcHRzLmNzdl9tb2RlKQohIAkJCQkJCUNvcHlBdHRyaWJ1 dGVPdXRDU1YoY3N0YXRlLCBzdHJpbmcsCiEgCQkJCQkJCQkJCQljc3RhdGUtPm9wdHMuZm9y Y2VfcXVvdGVfZmxhZ3NbYXR0bnVtIC0gMV0sCiEgCQkJCQkJCQkJCQlsaXN0X2xlbmd0aChj c3RhdGUtPmF0dG51bWxpc3QpID09IDEpOwohIAkJCQkJZWxzZQohIAkJCQkJCUNvcHlBdHRy aWJ1dGVPdXRUZXh0KGNzdGF0ZSwgc3RyaW5nKTsKISAJCQkJfQohIAkJCQllbHNlCiEgCQkJ CXsKISAJCQkJCWJ5dGVhCSAgICpvdXRwdXRieXRlczsKICAKISAJCQkJCW91dHB1dGJ5dGVz ID0gU2VuZEZ1bmN0aW9uQ2FsbCgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwKISAJCQkJ CQkJCQkJCQkgICB2YWx1ZSk7CiEgCQkJCQlDb3B5U2VuZEludDMyKGNzdGF0ZSwgVkFSU0la RShvdXRwdXRieXRlcykgLSBWQVJIRFJTWik7CiEgCQkJCQlDb3B5U2VuZERhdGEoY3N0YXRl LCBWQVJEQVRBKG91dHB1dGJ5dGVzKSwKISAJCQkJCQkJCSBWQVJTSVpFKG91dHB1dGJ5dGVz KSAtIFZBUkhEUlNaKTsKISAJCQkJfQogIAkJCX0KICAJCX0KICAJfQorIAllbHNlCisgCXsK KyAJCURhdHVtCXJvd2RhdGEgPSBFeGVjRmV0Y2hTbG90SGVhcFR1cGxlRGF0dW0oc2xvdCk7 CisgCQlTdHJpbmdJbmZvCXJlc3VsdDsKKyAKKyAJCXJlc3VsdCA9IG1ha2VTdHJpbmdJbmZv KCk7CisgCQljb21wb3NpdGVfdG9fanNvbihyb3dkYXRhLCByZXN1bHQsIGZhbHNlKTsKKyAK KyAJCWlmIChqc29uX3Jvd19kZWxpbV9uZWVkZWQgJiYKKyAJCQljc3RhdGUtPm9wdHMuZm9y Y2Vfcm93X2RlbGltaXRlcikKKyAJCXsKKyAJCQlDb3B5U2VuZENoYXIoY3N0YXRlLCAnLCcp OworIAkJfQorIAkJZWxzZSBpZiAoY3N0YXRlLT5vcHRzLmZvcmNlX3Jvd19kZWxpbWl0ZXIp CisgCQl7CisgCQkJLyogZmlyc3Qgcm93IG5lZWRzIG5vIGRlbGltaXRlciAqLworIAkJCUNv cHlTZW5kQ2hhcihjc3RhdGUsICcgJyk7CisgCQkJanNvbl9yb3dfZGVsaW1fbmVlZGVkID0g dHJ1ZTsKKyAJCX0KKyAKKyAJCUNvcHlTZW5kRGF0YShjc3RhdGUsIHJlc3VsdC0+ZGF0YSwg cmVzdWx0LT5sZW4pOworIAl9CiAgCiAgCUNvcHlTZW5kRW5kT2ZSb3coY3N0YXRlKTsKICAK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgYi9zcmMvYmFja2VuZC9w YXJzZXIvZ3JhbS55CmluZGV4IGQ2MzFhYzguLjE2YWExMzEgMTAwNjQ0CioqKiBhL3NyYy9i YWNrZW5kL3BhcnNlci9ncmFtLnkKLS0tIGIvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueQoq KioqKioqKioqKioqKiogY29weV9vcHRfaXRlbToKKioqIDM0MDgsMzQxMyAqKioqCi0tLSAz NDA4LDM0MTcgLS0tLQogIAkJCQl7CiAgCQkJCQkkJCA9IG1ha2VEZWZFbGVtKCJmb3JtYXQi LCAoTm9kZSAqKSBtYWtlU3RyaW5nKCJjc3YiKSwgQDEpOwogIAkJCQl9CisgCQkJfCBKU09O CisgCQkJCXsKKyAJCQkJCSQkID0gbWFrZURlZkVsZW0oImZvcm1hdCIsIChOb2RlICopIG1h a2VTdHJpbmcoImpzb24iKSwgQDEpOworIAkJCQl9CiAgCQkJfCBIRUFERVJfUAogIAkJCQl7 CiAgCQkJCQkkJCA9IG1ha2VEZWZFbGVtKCJoZWFkZXIiLCAoTm9kZSAqKSBtYWtlQm9vbGVh bih0cnVlKSwgQDEpOwoqKioqKioqKioqKioqKiogY29weV9vcHRfaXRlbToKKioqIDM0NDgs MzQ1MyAqKioqCi0tLSAzNDUyLDM0NjUgLS0tLQogIAkJCQl7CiAgCQkJCQkkJCA9IG1ha2VE ZWZFbGVtKCJlbmNvZGluZyIsIChOb2RlICopIG1ha2VTdHJpbmcoJDIpLCBAMSk7CiAgCQkJ CX0KKyAJCQl8IEZPUkNFIFJPVyBERUxJTUlURVIKKyAJCQkJeworIAkJCQkJJCQgPSBtYWtl RGVmRWxlbSgiZm9yY2Vfcm93X2RlbGltaXRlciIsIChOb2RlICopIG1ha2VCb29sZWFuKHRy dWUpLCBAMSk7CisgCQkJCX0KKyAJCQl8IEZPUkNFIEFSUkFZCisgCQkJCXsKKyAJCQkJCSQk ID0gbWFrZURlZkVsZW0oImZvcmNlX2FycmF5IiwgKE5vZGUgKikgbWFrZUJvb2xlYW4odHJ1 ZSksIEAxKTsKKyAJCQkJfQogIAkJOwogIAogIC8qIFRoZSBmb2xsb3dpbmcgZXhpc3QgZm9y IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJ5IG9sZCB2ZXJzaW9ucyAqLwoqKioq KioqKioqKioqKiogY29weV9nZW5lcmljX29wdF9lbGVtOgoqKiogMzQ5MCwzNDk1ICoqKioK LS0tIDM1MDIsMzUxMSAtLS0tCiAgCQkJCXsKICAJCQkJCSQkID0gbWFrZURlZkVsZW0oJDEs ICQyLCBAMSk7CiAgCQkJCX0KKyAJCQl8IEZPUk1BVF9MQSBjb3B5X2dlbmVyaWNfb3B0X2Fy ZworIAkJCQl7CisgCQkJCQkkJCA9IG1ha2VEZWZFbGVtKCJmb3JtYXQiLCAkMiwgQDEpOwor IAkJCQl9CiAgCQk7CiAgCiAgY29weV9nZW5lcmljX29wdF9hcmc6CmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9hZHQvanNvbi5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pz b24uYwppbmRleCA3MWFlNTNmLi5jYjQzMTFlIDEwMDY0NAoqKiogYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvanNvbi5jCi0tLSBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uLmMKKioq KioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0IEpzb25BZ2dTdGF0ZQoqKiogODMsOTAgKioq KgogIAlKc29uVW5pcXVlQnVpbGRlclN0YXRlIHVuaXF1ZV9jaGVjazsKICB9IEpzb25BZ2dT dGF0ZTsKICAKLSBzdGF0aWMgdm9pZCBjb21wb3NpdGVfdG9fanNvbihEYXR1bSBjb21wb3Np dGUsIFN0cmluZ0luZm8gcmVzdWx0LAotIAkJCQkJCQkgIGJvb2wgdXNlX2xpbmVfZmVlZHMp OwogIHN0YXRpYyB2b2lkIGFycmF5X2RpbV90b19qc29uKFN0cmluZ0luZm8gcmVzdWx0LCBp bnQgZGltLCBpbnQgbmRpbXMsIGludCAqZGltcywKICAJCQkJCQkJICBEYXR1bSAqdmFscywg Ym9vbCAqbnVsbHMsIGludCAqdmFsY291bnQsCiAgCQkJCQkJCSAgSnNvblR5cGVDYXRlZ29y eSB0Y2F0ZWdvcnksIE9pZCBvdXRmdW5jb2lkLAotLS0gODMsODggLS0tLQoqKioqKioqKioq KioqKiogYXJyYXlfdG9fanNvbl9pbnRlcm5hbChEYXR1bSBhcnJheSwgU3RyaQoqKiogNDkw LDQ5NyAqKioqCiAgCiAgLyoKICAgKiBUdXJuIGEgY29tcG9zaXRlIC8gcmVjb3JkIGludG8g SlNPTi4KICAgKi8KISBzdGF0aWMgdm9pZAogIGNvbXBvc2l0ZV90b19qc29uKERhdHVtIGNv bXBvc2l0ZSwgU3RyaW5nSW5mbyByZXN1bHQsIGJvb2wgdXNlX2xpbmVfZmVlZHMpCiAgewog IAlIZWFwVHVwbGVIZWFkZXIgdGQ7Ci0tLSA0ODgsNDk2IC0tLS0KICAKICAvKgogICAqIFR1 cm4gYSBjb21wb3NpdGUgLyByZWNvcmQgaW50byBKU09OLgorICAqIEV4cG9ydGVkIHNvIENP UFkgVE8gY2FuIHVzZSBpdC4KICAgKi8KISB2b2lkCiAgY29tcG9zaXRlX3RvX2pzb24oRGF0 dW0gY29tcG9zaXRlLCBTdHJpbmdJbmZvIHJlc3VsdCwgYm9vbCB1c2VfbGluZV9mZWVkcykK ICB7CiAgCUhlYXBUdXBsZUhlYWRlciB0ZDsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2Nv bW1hbmRzL2NvcHkuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHkuaAppbmRleCBmMmNj YTBiLi4yNjY5MTBkIDEwMDY0NAoqKiogYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5LmgK LS0tIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weS5oCioqKioqKioqKioqKioqKiB0eXBl ZGVmIHN0cnVjdCBDb3B5Rm9ybWF0T3B0aW9ucwoqKiogNDMsNDggKioqKgotLS0gNDMsNDkg LS0tLQogIAlib29sCQliaW5hcnk7CQkJLyogYmluYXJ5IGZvcm1hdD8gKi8KICAJYm9vbAkJ ZnJlZXplOwkJCS8qIGZyZWV6ZSByb3dzIG9uIGxvYWRpbmc/ICovCiAgCWJvb2wJCWNzdl9t b2RlOwkJLyogQ29tbWEgU2VwYXJhdGVkIFZhbHVlIGZvcm1hdD8gKi8KKyAJYm9vbAkJanNv bl9tb2RlOwkJLyogSlNPTiBmb3JtYXQ/ICovCiAgCUNvcHlIZWFkZXJDaG9pY2UgaGVhZGVy X2xpbmU7CS8qIGhlYWRlciBsaW5lPyAqLwogIAljaGFyCSAgICpudWxsX3ByaW50OwkJLyog TlVMTCBtYXJrZXIgc3RyaW5nIChzZXJ2ZXIgZW5jb2RpbmchKSAqLwogIAlpbnQJCQludWxs X3ByaW50X2xlbjsgLyogbGVuZ3RoIG9mIHNhbWUgKi8KKioqKioqKioqKioqKioqIHR5cGVk ZWYgc3RydWN0IENvcHlGb3JtYXRPcHRpb25zCioqKiA2MSw2NiAqKioqCi0tLSA2Miw2OSAt LS0tCiAgCUxpc3QJICAgKmZvcmNlX251bGw7CQkvKiBsaXN0IG9mIGNvbHVtbiBuYW1lcyAq LwogIAlib29sCQlmb3JjZV9udWxsX2FsbDsgLyogRk9SQ0VfTlVMTCAqPyAqLwogIAlib29s CSAgICpmb3JjZV9udWxsX2ZsYWdzOwkvKiBwZXItY29sdW1uIENTViBGTiBmbGFncyAqLwor IAlib29sCQlmb3JjZV9yb3dfZGVsaW1pdGVyOwkvKiB1c2UgY29tbWEgYXMgcGVyLXJvdyBK U09OIGRlbGltaXRlciAqLworIAlib29sCQlmb3JjZV9hcnJheTsJLyogSlNPTiBhcnJheTsg aW1wbGllcyBmb3JjZV9yb3dfZGVsaW1pdGVyICovCiAgCWJvb2wJCWNvbnZlcnRfc2VsZWN0 aXZlbHk7CS8qIGRvIHNlbGVjdGl2ZSBiaW5hcnkgY29udmVyc2lvbj8gKi8KICAJTGlzdAkg ICAqY29udmVydF9zZWxlY3Q7IC8qIGxpc3Qgb2YgY29sdW1uIG5hbWVzIChjYW4gYmUgTklM KSAqLwogIH0gQ29weUZvcm1hdE9wdGlvbnM7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91 dGlscy9qc29uLmggYi9zcmMvaW5jbHVkZS91dGlscy9qc29uLmgKaW5kZXggZjA3ZTgyYy4u YmFkYzVhNiAxMDA2NDQKKioqIGEvc3JjL2luY2x1ZGUvdXRpbHMvanNvbi5oCi0tLSBiL3Ny Yy9pbmNsdWRlL3V0aWxzL2pzb24uaAoqKioqKioqKioqKioqKioKKioqIDE3LDIyICoqKioK LS0tIDE3LDI0IC0tLS0KICAjaW5jbHVkZSAibGliL3N0cmluZ2luZm8uaCIKICAKICAvKiBm dW5jdGlvbnMgaW4ganNvbi5jICovCisgZXh0ZXJuIHZvaWQgY29tcG9zaXRlX3RvX2pzb24o RGF0dW0gY29tcG9zaXRlLCBTdHJpbmdJbmZvIHJlc3VsdCwKKyAJCQkJCQkJICBib29sIHVz ZV9saW5lX2ZlZWRzKTsKICBleHRlcm4gdm9pZCBlc2NhcGVfanNvbihTdHJpbmdJbmZvIGJ1 ZiwgY29uc3QgY2hhciAqc3RyKTsKICBleHRlcm4gY2hhciAqSnNvbkVuY29kZURhdGVUaW1l KGNoYXIgKmJ1ZiwgRGF0dW0gdmFsdWUsIE9pZCB0eXBpZCwKICAJCQkJCQkJCWNvbnN0IGlu dCAqdHpwKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29weS5v dXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvcHkub3V0CmluZGV4IGI0ODM2NWUu LmEzNGNiMzkgMTAwNjQ0CioqKiBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvY29weS5v dXQKLS0tIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dAoqKioqKioqKioq KioqKiogY29weSBjb3B5dGVzdDMgdG8gc3Rkb3V0IGNzdiBoZWFkZXI7CioqKiA0Miw0NyAq KioqCi0tLSA0Miw5OCAtLS0tCiAgYzEsImNvbCB3aXRoICwgY29tbWEiLCJjb2wgd2l0aCAi IiBxdW90ZSIKICAxLGEsMQogIDIsYiwyCisgLS0tIHRlc3QgY29weWluZyBpbiBKU09OIG1v ZGUgd2l0aCB2YXJpb3VzIHN0eWxlcworIGNvcHkgY29weXRlc3QgdG8gc3Rkb3V0IGpzb247 CisgeyJzdHlsZSI6IkRPUyIsInRlc3QiOiJhYmNcclxuZGVmIiwiZmlsbGVyIjoxfQorIHsi c3R5bGUiOiJVbml4IiwidGVzdCI6ImFiY1xuZGVmIiwiZmlsbGVyIjoyfQorIHsic3R5bGUi OiJNYWMiLCJ0ZXN0IjoiYWJjXHJkZWYiLCJmaWxsZXIiOjN9CisgeyJzdHlsZSI6ImVzY1xc YXBlIiwidGVzdCI6ImFcXHJcXFxyXFxcblxcbmIiLCJmaWxsZXIiOjR9CisgY29weSBjb3B5 dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29uKTsKKyB7InN0eWxlIjoiRE9TIiwidGVzdCI6 ImFiY1xyXG5kZWYiLCJmaWxsZXIiOjF9CisgeyJzdHlsZSI6IlVuaXgiLCJ0ZXN0IjoiYWJj XG5kZWYiLCJmaWxsZXIiOjJ9CisgeyJzdHlsZSI6Ik1hYyIsInRlc3QiOiJhYmNccmRlZiIs ImZpbGxlciI6M30KKyB7InN0eWxlIjoiZXNjXFxhcGUiLCJ0ZXN0IjoiYVxcclxcXHJcXFxu XFxuYiIsImZpbGxlciI6NH0KKyBjb3B5IGNvcHl0ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpz b24sIGZvcmNlX2FycmF5KTsKKyBbCisgIHsic3R5bGUiOiJET1MiLCJ0ZXN0IjoiYWJjXHJc bmRlZiIsImZpbGxlciI6MX0KKyAseyJzdHlsZSI6IlVuaXgiLCJ0ZXN0IjoiYWJjXG5kZWYi LCJmaWxsZXIiOjJ9CisgLHsic3R5bGUiOiJNYWMiLCJ0ZXN0IjoiYWJjXHJkZWYiLCJmaWxs ZXIiOjN9CisgLHsic3R5bGUiOiJlc2NcXGFwZSIsInRlc3QiOiJhXFxyXFxcclxcXG5cXG5i IiwiZmlsbGVyIjo0fQorIF0KKyBjb3B5IGNvcHl0ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpz b24sIGZvcmNlX3Jvd19kZWxpbWl0ZXIpOworICB7InN0eWxlIjoiRE9TIiwidGVzdCI6ImFi Y1xyXG5kZWYiLCJmaWxsZXIiOjF9CisgLHsic3R5bGUiOiJVbml4IiwidGVzdCI6ImFiY1xu ZGVmIiwiZmlsbGVyIjoyfQorICx7InN0eWxlIjoiTWFjIiwidGVzdCI6ImFiY1xyZGVmIiwi ZmlsbGVyIjozfQorICx7InN0eWxlIjoiZXNjXFxhcGUiLCJ0ZXN0IjoiYVxcclxcXHJcXFxu XFxuYiIsImZpbGxlciI6NH0KKyAtLSBFcnJvcgorIGNvcHkgY29weXRlc3QgdG8gc3Rkb3V0 CisgIChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkgdHJ1ZSwgZm9yY2Vfcm93X2RlbGltaXRl ciBmYWxzZSk7CisgRVJST1I6ICBjYW5ub3Qgc3BlY2lmeSBGT1JDRV9ST1dfREVMSU1JVEVS IGZhbHNlIHdpdGggRk9SQ0VfQVJSQVkgdHJ1ZQorIC0tIEVycm9yCisgY29weSBjb3B5dGVz dCB0byBzdGRvdXQKKyAgKGZvcm1hdCBqc29uLCBoZWFkZXIpOworIEVSUk9SOiAgY2Fubm90 IHNwZWNpZnkgSEVBREVSIGluIEpTT04gbW9kZQorIC0tIGVtYmVkZGVkIHF1b3RlcworIGNy ZWF0ZSB0ZW1wIHRhYmxlIGNvcHlqc29udGVzdCAoCisgICAgIGlkIGludDgsCisgICAgIGYx IHRleHQsCisgICAgIGYyIHRpbWVzdGFtcHR6KTsKKyBpbnNlcnQgaW50byBjb3B5anNvbnRl c3QKKyAgIHNlbGVjdCBnLmksCisgICAgICAgICAgQ0FTRSBXSEVOIGcuaSAlIDIgPSAwIFRI RU4KKyAgICAgICAgICAgICdsaW5lIHdpdGggJycgaW4gaXQ6ICcgfHwgZy5pOjp0ZXh0Cisg ICAgICAgICAgRUxTRQorICAgICAgICAgICAgJ2xpbmUgd2l0aCAiIGluIGl0OiAnIHx8IGcu aTo6dGV4dAorICAgICAgICAgIEVORCwKKyAgICAgICAgICAnTW9uIEZlYiAxMCAxNzozMjow MSAxOTk3IFBTVCcKKyAgIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsNSkgYXMgZyhpKTsKKyBj b3B5IGNvcHlqc29udGVzdCB0byBzdGRvdXQganNvbjsKKyB7ImlkIjoxLCJmMSI6ImxpbmUg d2l0aCBcIiBpbiBpdDogMSIsImYyIjoiMTk5Ny0wMi0xMFQxNzozMjowMS0wODowMCJ9Cisg eyJpZCI6MiwiZjEiOiJsaW5lIHdpdGggJyBpbiBpdDogMiIsImYyIjoiMTk5Ny0wMi0xMFQx NzozMjowMS0wODowMCJ9CisgeyJpZCI6MywiZjEiOiJsaW5lIHdpdGggXCIgaW4gaXQ6IDMi LCJmMiI6IjE5OTctMDItMTBUMTc6MzI6MDEtMDg6MDAifQorIHsiaWQiOjQsImYxIjoibGlu ZSB3aXRoICcgaW4gaXQ6IDQiLCJmMiI6IjE5OTctMDItMTBUMTc6MzI6MDEtMDg6MDAifQor IHsiaWQiOjUsImYxIjoibGluZSB3aXRoIFwiIGluIGl0OiA1IiwiZjIiOiIxOTk3LTAyLTEw VDE3OjMyOjAxLTA4OjAwIn0KICBjcmVhdGUgdGVtcCB0YWJsZSBjb3B5dGVzdDQgKAogIAlj MSBpbnQsCiAgCSJjb2xuYW1lIHdpdGggdGFiOiAJIiB0ZXh0KTsKZGlmZiAtLWdpdCBhL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29w eS5zcWwKaW5kZXggNDNkMmU5MC4uMTg5YzcwMyAxMDA2NDQKKioqIGEvc3JjL3Rlc3QvcmVn cmVzcy9zcWwvY29weS5zcWwKLS0tIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29weS5zcWwK KioqKioqKioqKioqKioqIHRoaXMgaXMganVzdCBhIGxpbmUgZnVsbCBvZiBqdW5rIHRoYXQg d28KKioqIDU0LDU5ICoqKioKLS0tIDU0LDk0IC0tLS0KICAKICBjb3B5IGNvcHl0ZXN0MyB0 byBzdGRvdXQgY3N2IGhlYWRlcjsKICAKKyAtLS0gdGVzdCBjb3B5aW5nIGluIEpTT04gbW9k ZSB3aXRoIHZhcmlvdXMgc3R5bGVzCisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQganNvbjsK KyAKKyBjb3B5IGNvcHl0ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpzb24pOworIAorIGNvcHkg Y29weXRlc3QgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkpOworIAorIGNv cHkgY29weXRlc3QgdG8gc3Rkb3V0IChmb3JtYXQganNvbiwgZm9yY2Vfcm93X2RlbGltaXRl cik7CisgCisgLS0gRXJyb3IKKyBjb3B5IGNvcHl0ZXN0IHRvIHN0ZG91dAorICAoZm9ybWF0 IGpzb24sIGZvcmNlX2FycmF5IHRydWUsIGZvcmNlX3Jvd19kZWxpbWl0ZXIgZmFsc2UpOwor IAorIC0tIEVycm9yCisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQKKyAgKGZvcm1hdCBqc29u LCBoZWFkZXIpOworIAorIC0tIGVtYmVkZGVkIHF1b3RlcworIGNyZWF0ZSB0ZW1wIHRhYmxl IGNvcHlqc29udGVzdCAoCisgICAgIGlkIGludDgsCisgICAgIGYxIHRleHQsCisgICAgIGYy IHRpbWVzdGFtcHR6KTsKKyAKKyBpbnNlcnQgaW50byBjb3B5anNvbnRlc3QKKyAgIHNlbGVj dCBnLmksCisgICAgICAgICAgQ0FTRSBXSEVOIGcuaSAlIDIgPSAwIFRIRU4KKyAgICAgICAg ICAgICdsaW5lIHdpdGggJycgaW4gaXQ6ICcgfHwgZy5pOjp0ZXh0CisgICAgICAgICAgRUxT RQorICAgICAgICAgICAgJ2xpbmUgd2l0aCAiIGluIGl0OiAnIHx8IGcuaTo6dGV4dAorICAg ICAgICAgIEVORCwKKyAgICAgICAgICAnTW9uIEZlYiAxMCAxNzozMjowMSAxOTk3IFBTVCcK KyAgIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsNSkgYXMgZyhpKTsKKyAKKyBjb3B5IGNvcHlq c29udGVzdCB0byBzdGRvdXQganNvbjsKKyAKICBjcmVhdGUgdGVtcCB0YWJsZSBjb3B5dGVz dDQgKAogIAljMSBpbnQsCiAgCSJjb2xuYW1lIHdpdGggdGFiOiAJIiB0ZXh0KTsK --------------dFi0rpRctt2Qdggk1MZVp8aX--