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 1rAaW5-007Hg3-S4 for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 18:51:35 +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 1rAaW4-005P6Q-HO for pgsql-hackers@arkaria.postgresql.org; Tue, 05 Dec 2023 18:51:32 +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 1rAaW2-005P68-SK for pgsql-hackers@lists.postgresql.org; Tue, 05 Dec 2023 18:51:32 +0000 Received: from mail-yw1-x1129.google.com ([2607:f8b0:4864:20::1129]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rAaVy-00AGOV-3d for pgsql-hackers@postgresql.org; Tue, 05 Dec 2023 18:51:30 +0000 Received: by mail-yw1-x1129.google.com with SMTP id 00721157ae682-5d747dbf81eso33989427b3.1 for ; Tue, 05 Dec 2023 10:51:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701802284; x=1702407084; darn=postgresql.org; h=in-reply-to:autocrypt:from:references:cc:to:content-language :subject:user-agent:mime-version:date:message-id:from:to:cc:subject :date:message-id:reply-to; bh=8PU/exy01q0CoHkBIpnNwBf910LxegIw8D3KIcwwxlM=; b=E3hONrLbMIrHV1HES1iuVhW0tmoWjaAday9w/VGly11zenbWran+77rP6J+xfo1O3H RGu8r2tLczUUofFvxczjjgjjiQXfGA4BFOTCzSQfEqJ9nbyBKaVUIrJO2zWnpV9GcQFi iTKwZDVmSfcqP6dfJG4VQH/Fw48IfUiY4K6t5co4MhbFENT04Z4SCyykb0TihyOyTJl8 7tKHhHKSBIryj0CbSKBRuxz1XRJlBs1FmNuxsTGW5OBqjGYjCaNHNe+Bp60oGvyCX5ms qfkum4+Ufbs2/vw+QlPeWKRqH/Q+FsiHxSU73LwEDBnidyWrB40UDqgWt0hiUGu7Bw3f Wdxw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701802284; x=1702407084; h=in-reply-to:autocrypt:from:references:cc: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=8PU/exy01q0CoHkBIpnNwBf910LxegIw8D3KIcwwxlM=; b=K6FaQDk0pfSzYB7eo+NMp7H4XpgeMVjVlAmdOA8xGdm2nJD2EPea5oc8e/nTvsSu96 p/18jVbiJCk1rgi/57xJ1ltX9Q6jTRk8bpC/Rd1xuIM49c3u2zsIRXZD7FGy0BiI+jxG lFq3JLfjLMqVBdon9/x/TPKlIAzu5ch90ayoZl1R7uGT1NZnyWoNh7VUfjN+DhOsa6EZ YOfL5SpMV78wOewpOh/CTN9NKij5gK7kR0Tzc/0LBlv3XLJEBpkZxLbLPFFtTNV3zen+ nprrxFGqxNe9XWhxNx5RI1i+4dt6fKustM6K/uDKYVoNF4lMkb6K7JMRfErfWwryX6qS 22ZQ== X-Gm-Message-State: AOJu0YyNXQV6KvOmABBbErL+/AxXNJrhlW0ntmuXUH0b25RJmUv/JA9I 0G605Gdh3Wr6LJykLm79haWGJg== X-Google-Smtp-Source: AGHT+IE4dHnatx/26GpmHJVl9jWI7nUQ1tj4cybnZpSUT4xMVt2JyTWAZ3aIZ8EKFkgol2J3rsGcZA== X-Received: by 2002:a81:b725:0:b0:5d3:8400:ba9 with SMTP id v37-20020a81b725000000b005d384000ba9mr10592275ywh.48.1701802284003; Tue, 05 Dec 2023 10:51:24 -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 d19-20020a81ab53000000b005d336130ea3sm3267807ywk.70.2023.12.05.10.51.23 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 05 Dec 2023 10:51:23 -0800 (PST) Content-Type: multipart/mixed; boundary="------------Z00JC9Zl5AchNryIz9t0FARv" Message-ID: <46cc4507-a0d9-4044-b2ce-5a8bca8015c0@joeconway.com> Date: Tue, 5 Dec 2023 13:51:22 -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 , PostgreSQL-development Cc: Andrew Dunstan References: <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> <398c22f6-4299-4b17-80bf-2f14f4afd592@joeconway.com> 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. --------------Z00JC9Zl5AchNryIz9t0FARv Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 12/5/23 12:43, Davin Shearer wrote: > Joe, those test cases look great and the outputs are the same as `jq`. > Forward slash escaping is optional, so not escaping them in Postgres is > okay. The important thing is that the software _reading_ JSON > interprets both '\/' and '/' as '/'. Thanks for the review and info. I modified the existing regression test thus: 8<-------------------------- create temp table copyjsontest ( id bigserial, f1 text, f2 timestamptz); insert into copyjsontest select g.i, CASE WHEN g.i % 2 = 0 THEN 'line with '' in it: ' || g.i::text ELSE 'line with " in it: ' || g.i::text END, 'Mon Feb 10 17:32:01 1997 PST' from generate_series(1,5) as g(i); insert into copyjsontest (f1) values (E'aaa\"bbb'::text), (E'aaa\\bbb'::text), (E'aaa\/bbb'::text), (E'aaa\bbbb'::text), (E'aaa\fbbb'::text), (E'aaa\nbbb'::text), (E'aaa\rbbb'::text), (E'aaa\tbbb'::text); copy copyjsontest to stdout json; {"id":1,"f1":"line with \" in it: 1","f2":"1997-02-10T20:32:01-05:00"} {"id":2,"f1":"line with ' in it: 2","f2":"1997-02-10T20:32:01-05:00"} {"id":3,"f1":"line with \" in it: 3","f2":"1997-02-10T20:32:01-05:00"} {"id":4,"f1":"line with ' in it: 4","f2":"1997-02-10T20:32:01-05:00"} {"id":5,"f1":"line with \" in it: 5","f2":"1997-02-10T20:32:01-05:00"} {"id":1,"f1":"aaa\"bbb","f2":null} {"id":2,"f1":"aaa\\bbb","f2":null} {"id":3,"f1":"aaa/bbb","f2":null} {"id":4,"f1":"aaa\bbbb","f2":null} {"id":5,"f1":"aaa\fbbb","f2":null} {"id":6,"f1":"aaa\nbbb","f2":null} {"id":7,"f1":"aaa\rbbb","f2":null} {"id":8,"f1":"aaa\tbbb","f2":null} 8<-------------------------- I think the code, documentation, and tests are in pretty good shape at this point. Latest version attached. Any other comments or complaints out there? -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --------------Z00JC9Zl5AchNryIz9t0FARv Content-Type: text/x-patch; charset=UTF-8; name="copyto_json.005.diff" Content-Disposition: attachment; filename="copyto_json.005.diff" Content-Transfer-Encoding: base64 QWRkIGpzb24gZm9ybWF0IG1vZGUgdG8gQ09QWSBUTwoKQWRkIGpzb24gZm9ybWF0IG1vZGUg c3VwcG9ydCB0byBDT1BZIFRPLCB3aGljaCBpbmNsdWRlcyB0aHJlZSBvdXRwdXQKdmFyaWF0 aW9uczogMSkgImpzb24gbGluZXMiIHdoaWNoIGlzIGVhY2ggcm93IGFzIGEganNvbiBvYmpl Y3QgZGVsaW1pdGVkCmJ5IG5ld2xpbmVzICh0aGUgZGVmYXVsdCk7IDIpICJqc29uIGxpbmVz IiwgZXhjZXB0IGluY2x1ZGUgY29tbWEgZGVsaW1pdGVycwpiZXR3ZWVuIGpzb24gb2JqZWN0 czsgYW5kIDMpICJqc29uIGFycmF5IiB3aGljaCBpcyB0aGUgc2FtZSBhcyAjMiwgYnV0IHdp dGgKdGhlIGFkZGl0aW9uIG9mIGEgbGVhZGluZyAiWyIgYW5kIHRyYWlsaW5nICJdIiB0byBm b3JtIGEgdmFsaWQganNvbiBhcnJheS4KCkVhcmx5IHZlcnNpb25zOiBoZWxwZnVsIGhpbnRz L3Jldmlld3MgcHJvdmlkZWQgYnkgTmF0aGFuIEJvc3NhcnQsClRvbSBMYW5lLCBhbmQgTWFj aWVrIFNha3JlamRhLiBGaW5hbCB2ZXJzaW9uczogcmV2aWV3ZWQgYnkgQW5kcmV3IER1bnN0 YW4KYW5kIERhdmluIFNoZWFyZXIuCgpSZXF1ZXN0ZWQtYnk6IERhdmluIFNoZWFyZXIKQXV0 aG9yOiBKb2UgQ29ud2F5ClJldmlld2VkLWJ5OiBBbmRyZXcgRHVuc3RhbiwgRGF2aW4gU2hl YXJlciAKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9mbGF0LzI0ZTNlZTg4LWVj MWUtNDIxYi04OWFlLThhNDdlZTBkMmRmMSU0MGpvZWNvbndheS5jb20jYTVlNmI4ODI5Zjlh NzRkZmM4MzVmNmYyOWYyZTQ0YzUKCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3JlZi9j b3B5LnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVmL2NvcHkuc2dtbAppbmRleCAxOGVjYzY5Li5h Zjg3NzdiIDEwMDY0NAoqKiogYS9kb2Mvc3JjL3NnbWwvcmVmL2NvcHkuc2dtbAotLS0gYi9k b2Mvc3JjL3NnbWwvcmVmL2NvcHkuc2dtbAoqKioqKioqKioqKioqKiogQ09QWSB7IDxyZXBs YWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj50YQoqKiogNDMsNDggKioqKgotLS0gNDMsNTAg LS0tLQogICAgICBGT1JDRV9RVU9URSB7ICggPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0 ZXIiPmNvbHVtbl9uYW1lPC9yZXBsYWNlYWJsZT4gWywgLi4uXSApIHwgKiB9CiAgICAgIEZP UkNFX05PVF9OVUxMIHsgKCA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Y29sdW1u X25hbWU8L3JlcGxhY2VhYmxlPiBbLCAuLi5dICkgfCAqIH0KICAgICAgRk9SQ0VfTlVMTCB7 ICggPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbHVtbl9uYW1lPC9yZXBsYWNl YWJsZT4gWywgLi4uXSApIHwgKiB9CisgICAgIEZPUkNFX0FSUkFZIFsgPHJlcGxhY2VhYmxl IGNsYXNzPSJwYXJhbWV0ZXIiPmJvb2xlYW48L3JlcGxhY2VhYmxlPiBdCisgICAgIEZPUkNF X1JPV19ERUxJTUlURVIgWyA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Ym9vbGVh bjwvcmVwbGFjZWFibGU+IF0KICAgICAgRU5DT0RJTkcgJzxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5lbmNvZGluZ19uYW1lPC9yZXBsYWNlYWJsZT4nCiAgPC9zeW5vcHNpcz4K ICAgPC9yZWZzeW5vcHNpc2Rpdj4KKioqKioqKioqKioqKioqIENPUFkgeyA8cmVwbGFjZWFi bGUgY2xhc3M9InBhcmFtZXRlciI+dGEKKioqIDIwNiwyMTQgKioqKgotLS0gMjA4LDIyMSAt LS0tCiAgICAgICAgU2VsZWN0cyB0aGUgZGF0YSBmb3JtYXQgdG8gYmUgcmVhZCBvciB3cml0 dGVuOgogICAgICAgIDxsaXRlcmFsPnRleHQ8L2xpdGVyYWw+LAogICAgICAgIDxsaXRlcmFs PmNzdjwvbGl0ZXJhbD4gKENvbW1hIFNlcGFyYXRlZCBWYWx1ZXMpLAorICAgICAgIDxsaXRl cmFsPmpzb248L2xpdGVyYWw+IChKYXZhU2NyaXB0IE9iamVjdCBOb3RhdGlvbiksCiAgICAg ICAgb3IgPGxpdGVyYWw+YmluYXJ5PC9saXRlcmFsPi4KICAgICAgICBUaGUgZGVmYXVsdCBp cyA8bGl0ZXJhbD50ZXh0PC9saXRlcmFsPi4KICAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJh PgorICAgICAgIFRoZSA8bGl0ZXJhbD5qc29uPC9saXRlcmFsPiBvcHRpb24gaXMgYWxsb3dl ZCBvbmx5IGluCisgICAgICAgPGNvbW1hbmQ+Q09QWSBUTzwvY29tbWFuZD4uCisgICAgICA8 L3BhcmE+CiAgICAgIDwvbGlzdGl0ZW0+CiAgICAgPC92YXJsaXN0ZW50cnk+CiAgCioqKioq KioqKioqKioqKiBDT1BZIHsgPHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPnRhCioq KiAzNzIsMzc3ICoqKioKLS0tIDM3OSw0MTAgLS0tLQogICAgICAgPC9wYXJhPgogICAgICA8 L2xpc3RpdGVtPgogICAgIDwvdmFybGlzdGVudHJ5PgorIAorICAgIDx2YXJsaXN0ZW50cnk+ CisgICAgIDx0ZXJtPjxsaXRlcmFsPkZPUkNFX1JPV19ERUxJTUlURVI8L2xpdGVyYWw+PC90 ZXJtPgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBGb3JjZSBvdXRw dXQgb2YgY29tbWFzIGFzIHJvdyBkZWxpbWl0ZXJzLCBpbiBhZGRpdGlvbiB0byB0aGUgdXN1 YWwKKyAgICAgICBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzLiBUaGlzIG9wdGlvbiBpcyBhbGxv d2VkIG9ubHkgaW4KKyAgICAgICA8Y29tbWFuZD5DT1BZIFRPPC9jb21tYW5kPiwgYW5kIG9u bHkgd2hlbiB1c2luZworICAgICAgIDxsaXRlcmFsPkpTT048L2xpdGVyYWw+IGZvcm1hdC4K KyAgICAgICBUaGUgZGVmYXVsdCBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAg ICA8L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisgICAgPC92YXJsaXN0ZW50cnk+CisgCisg ICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgPHRlcm0+PGxpdGVyYWw+Rk9SQ0VfQVJSQVk8L2xp dGVyYWw+PC90ZXJtPgorICAgICA8bGlzdGl0ZW0+CisgICAgICA8cGFyYT4KKyAgICAgICBG b3JjZSBvdXRwdXQgb2YgYXJyYXkgZGVjb3JhdGlvbnMgYXQgdGhlIGJlZ2lubmluZyBhbmQg ZW5kIG9mIG91dHB1dC4KKyAgICAgICBUaGlzIG9wdGlvbiBpbXBsaWVzIHRoZSA8bGl0ZXJh bD5GT1JDRV9ST1dfREVMSU1JVEVSPC9saXRlcmFsPgorICAgICAgIG9wdGlvbi4gSXQgaXMg YWxsb3dlZCBvbmx5IGluIDxjb21tYW5kPkNPUFkgVE88L2NvbW1hbmQ+LCBhbmQgb25seQor ICAgICAgIHdoZW4gdXNpbmcgPGxpdGVyYWw+SlNPTjwvbGl0ZXJhbD4gZm9ybWF0LgorICAg ICAgIFRoZSBkZWZhdWx0IGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgIDwv cGFyYT4KKyAgICAgPC9saXN0aXRlbT4KKyAgICA8L3Zhcmxpc3RlbnRyeT4KICAKICAgICA8 dmFybGlzdGVudHJ5PgogICAgICA8dGVybT48bGl0ZXJhbD5FTkNPRElORzwvbGl0ZXJhbD48 L3Rlcm0+CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMgYi9zcmMv YmFja2VuZC9jb21tYW5kcy9jb3B5LmMKaW5kZXggY2ZhZDQ3Yi4uMDIzNmE5ZSAxMDA2NDQK KioqIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weS5jCi0tLSBiL3NyYy9iYWNrZW5kL2Nv bW1hbmRzL2NvcHkuYwoqKioqKioqKioqKioqKiogUHJvY2Vzc0NvcHlPcHRpb25zKFBhcnNl U3RhdGUgKnBzdGF0ZSwKKioqIDQxOSw0MjQgKioqKgotLS0gNDE5LDQyNiAtLS0tCiAgCWJv b2wJCWZvcm1hdF9zcGVjaWZpZWQgPSBmYWxzZTsKICAJYm9vbAkJZnJlZXplX3NwZWNpZmll ZCA9IGZhbHNlOwogIAlib29sCQloZWFkZXJfc3BlY2lmaWVkID0gZmFsc2U7CisgCWJvb2wJ CWZvcmNlX3Jvd19kZWxpbWl0ZXJfc3BlY2lmaWVkID0gZmFsc2U7CisgCWJvb2wJCWZvcmNl X2FycmF5X3NwZWNpZmllZCA9IGZhbHNlOwogIAlMaXN0Q2VsbCAgICpvcHRpb247CiAgCiAg CS8qIFN1cHBvcnQgZXh0ZXJuYWwgdXNlIGZvciBvcHRpb24gc2FuaXR5IGNoZWNraW5nICov CioqKioqKioqKioqKioqKiBQcm9jZXNzQ29weU9wdGlvbnMoUGFyc2VTdGF0ZSAqcHN0YXRl LAoqKiogNDQzLDQ0OCAqKioqCi0tLSA0NDUsNDUyIC0tLS0KICAJCQkJIC8qIGRlZmF1bHQg Zm9ybWF0ICovIDsKICAJCQllbHNlIGlmIChzdHJjbXAoZm10LCAiY3N2IikgPT0gMCkKICAJ CQkJb3B0c19vdXQtPmNzdl9tb2RlID0gdHJ1ZTsKKyAJCQllbHNlIGlmIChzdHJjbXAoZm10 LCAianNvbiIpID09IDApCisgCQkJCW9wdHNfb3V0LT5qc29uX21vZGUgPSB0cnVlOwogIAkJ CWVsc2UgaWYgKHN0cmNtcChmbXQsICJiaW5hcnkiKSA9PSAwKQogIAkJCQlvcHRzX291dC0+ YmluYXJ5ID0gdHJ1ZTsKICAJCQllbHNlCioqKioqKioqKioqKioqKiBQcm9jZXNzQ29weU9w dGlvbnMoUGFyc2VTdGF0ZSAqcHN0YXRlLAoqKiogNTQwLDU0NSAqKioqCi0tLSA1NDQsNTYz IC0tLS0KICAJCQkJCQkJCWRlZmVsLT5kZWZuYW1lKSwKICAJCQkJCQkgcGFyc2VyX2VycnBv c2l0aW9uKHBzdGF0ZSwgZGVmZWwtPmxvY2F0aW9uKSkpOwogIAkJfQorIAkJZWxzZSBpZiAo c3RyY21wKGRlZmVsLT5kZWZuYW1lLCAiZm9yY2Vfcm93X2RlbGltaXRlciIpID09IDApCisg CQl7CisgCQkJaWYgKGZvcmNlX3Jvd19kZWxpbWl0ZXJfc3BlY2lmaWVkKQorIAkJCQllcnJv ckNvbmZsaWN0aW5nRGVmRWxlbShkZWZlbCwgcHN0YXRlKTsKKyAJCQlmb3JjZV9yb3dfZGVs aW1pdGVyX3NwZWNpZmllZCA9IHRydWU7CisgCQkJb3B0c19vdXQtPmZvcmNlX3Jvd19kZWxp bWl0ZXIgPSBkZWZHZXRCb29sZWFuKGRlZmVsKTsKKyAJCX0KKyAJCWVsc2UgaWYgKHN0cmNt cChkZWZlbC0+ZGVmbmFtZSwgImZvcmNlX2FycmF5IikgPT0gMCkKKyAJCXsKKyAJCQlpZiAo Zm9yY2VfYXJyYXlfc3BlY2lmaWVkKQorIAkJCQllcnJvckNvbmZsaWN0aW5nRGVmRWxlbShk ZWZlbCwgcHN0YXRlKTsKKyAJCQlmb3JjZV9hcnJheV9zcGVjaWZpZWQgPSB0cnVlOworIAkJ CW9wdHNfb3V0LT5mb3JjZV9hcnJheSA9IGRlZkdldEJvb2xlYW4oZGVmZWwpOworIAkJfQog IAkJZWxzZSBpZiAoc3RyY21wKGRlZmVsLT5kZWZuYW1lLCAiY29udmVydF9zZWxlY3RpdmVs eSIpID09IDApCiAgCQl7CiAgCQkJLyoKKioqKioqKioqKioqKioqIFByb2Nlc3NDb3B5T3B0 aW9ucyhQYXJzZVN0YXRlICpwc3RhdGUsCioqKiA1OTgsNjAzICoqKioKLS0tIDYxNiw2NDcg LS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCiAgCQkJCSBlcnJt c2coImNhbm5vdCBzcGVjaWZ5IERFRkFVTFQgaW4gQklOQVJZIG1vZGUiKSkpOwogIAorIAlp ZiAob3B0c19vdXQtPmpzb25fbW9kZSkKKyAJeworIAkJaWYgKGlzX2Zyb20pCisgCQkJZXJl cG9ydChFUlJPUiwKKyAJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9S VEVEKSwKKyAJCQkJCSBlcnJtc2coImNhbm5vdCB1c2UgSlNPTiBtb2RlIGluIENPUFkgRlJP TSIpKSk7CisgCisgCQlpZiAob3B0c19vdXQtPmZvcmNlX2FycmF5ICYmCisgCQkJZm9yY2Vf cm93X2RlbGltaXRlcl9zcGVjaWZpZWQgJiYKKyAJCQkhb3B0c19vdXQtPmZvcmNlX3Jvd19k ZWxpbWl0ZXIpCisgCQkJZXJlcG9ydChFUlJPUiwKKyAJCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKyAJCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5 IEZPUkNFX1JPV19ERUxJTUlURVIgZmFsc2Ugd2l0aCBGT1JDRV9BUlJBWSB0cnVlIikpKTsK KyAKKyAJCWlmIChvcHRzX291dC0+Zm9yY2VfYXJyYXkpCisgCQkJb3B0c19vdXQtPmZvcmNl X3Jvd19kZWxpbWl0ZXIgPSB0cnVlOworIAl9CisgCWVsc2UgaWYgKG9wdHNfb3V0LT5mb3Jj ZV9hcnJheSkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVfRkVB VFVSRV9OT1RfU1VQUE9SVEVEKSwKKyAJCQkJIGVycm1zZygiQ09QWSBGT1JDRV9BUlJBWSBy ZXF1aXJlcyBKU09OIG1vZGUiKSkpOworIAllbHNlIGlmIChvcHRzX291dC0+Zm9yY2Vfcm93 X2RlbGltaXRlcikKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKyAJCQkJIGVycm1zZygiQ09QWSBGT1JDRV9ST1df REVMSU1JVEVSIHJlcXVpcmVzIEpTT04gbW9kZSIpKSk7CisgCiAgCS8qIFNldCBkZWZhdWx0 cyBmb3Igb21pdHRlZCBvcHRpb25zICovCiAgCWlmICghb3B0c19vdXQtPmRlbGltKQogIAkJ b3B0c19vdXQtPmRlbGltID0gb3B0c19vdXQtPmNzdl9tb2RlID8gIiwiIDogIlx0IjsKKioq KioqKioqKioqKioqIFByb2Nlc3NDb3B5T3B0aW9ucyhQYXJzZVN0YXRlICpwc3RhdGUsCioq KiA2NjcsNjcyICoqKioKLS0tIDcxMSw3MjEgLS0tLQogIAkJCQkoZXJyY29kZShFUlJDT0RF X0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCiAgCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5 IEhFQURFUiBpbiBCSU5BUlkgbW9kZSIpKSk7CiAgCisgCWlmIChvcHRzX291dC0+anNvbl9t b2RlICYmIG9wdHNfb3V0LT5oZWFkZXJfbGluZSkKKyAJCWVyZXBvcnQoRVJST1IsCisgCQkJ CShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKyAJCQkJIGVycm1z ZygiY2Fubm90IHNwZWNpZnkgSEVBREVSIGluIEpTT04gbW9kZSIpKSk7CisgCiAgCS8qIENo ZWNrIHF1b3RlICovCiAgCWlmICghb3B0c19vdXQtPmNzdl9tb2RlICYmIG9wdHNfb3V0LT5x dW90ZSAhPSBOVUxMKQogIAkJZXJlcG9ydChFUlJPUiwKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2NvcHl0by5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMK aW5kZXggYzY2YTA0Ny4uZmJhMzA3MCAxMDA2NDQKKioqIGEvc3JjL2JhY2tlbmQvY29tbWFu ZHMvY29weXRvLmMKLS0tIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKKioqKioq KioqKioqKioqCioqKiAzNyw0MiAqKioqCi0tLSAzNyw0MyAtLS0tCiAgI2luY2x1ZGUgInJl d3JpdGUvcmV3cml0ZUhhbmRsZXIuaCIKICAjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgogICNp bmNsdWRlICJ0Y29wL3Rjb3Bwcm90LmgiCisgI2luY2x1ZGUgInV0aWxzL2pzb24uaCIKICAj aW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAgI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz LmgiCiAgI2luY2x1ZGUgInV0aWxzL3BhcnRjYWNoZS5oIgoqKioqKioqKioqKioqKiogdHlw ZWRlZiBzdHJ1Y3QKKioqIDExMiwxMTcgKioqKgotLS0gMTEzLDEyMCAtLS0tCiAgLyogTk9U RTogdGhlcmUncyBhIGNvcHkgb2YgdGhpcyBpbiBjb3B5ZnJvbXBhcnNlLmMgKi8KICBzdGF0 aWMgY29uc3QgY2hhciBCaW5hcnlTaWduYXR1cmVbMTFdID0gIlBHQ09QWVxuXDM3N1xyXG5c MCI7CiAgCisgLyogbmVlZCBkZWxpbWl0ZXIgdG8gc3RhcnQgbmV4dCBqc29uIGFycmF5IGVs ZW1lbnQgKi8KKyBzdGF0aWMgYm9vbCBqc29uX3Jvd19kZWxpbV9uZWVkZWQgPSBmYWxzZTsK ICAKICAvKiBub24tZXhwb3J0IGZ1bmN0aW9uIHByb3RvdHlwZXMgKi8KICBzdGF0aWMgdm9p ZCBFbmRDb3B5KENvcHlUb1N0YXRlIGNzdGF0ZSk7CioqKioqKioqKioqKioqKiBEb0NvcHlU byhDb3B5VG9TdGF0ZSBjc3RhdGUpCioqKiA4NDUsODUwICoqKioKLS0tIDg0OCw4NjcgLS0t LQogIAogIAkJCUNvcHlTZW5kRW5kT2ZSb3coY3N0YXRlKTsKICAJCX0KKyAKKyAJCS8qCisg CQkgKiBJZiBKU09OIGhhcyBiZWVuIHJlcXVlc3RlZCwgYW5kIEZPUkNFX0FSUkFZIGhhcyBi ZWVuIHNwZWNpZmllZAorIAkJICogc2VuZCB0aGUgb3BlbmluZyBicmFja2V0LgorIAkJICov CisgCQlpZiAoY3N0YXRlLT5vcHRzLmpzb25fbW9kZSkKKyAJCXsKKyAJCQlpZiAoY3N0YXRl LT5vcHRzLmZvcmNlX2FycmF5KQorIAkJCXsKKyAJCQkJQ29weVNlbmRDaGFyKGNzdGF0ZSwg J1snKTsKKyAJCQkJQ29weVNlbmRFbmRPZlJvdyhjc3RhdGUpOworIAkJCX0KKyAJCQlqc29u X3Jvd19kZWxpbV9uZWVkZWQgPSBmYWxzZTsKKyAJCX0KICAJfQogIAogIAlpZiAoY3N0YXRl LT5yZWwpCioqKioqKioqKioqKioqKiBEb0NvcHlUbyhDb3B5VG9TdGF0ZSBjc3RhdGUpCioq KiA4OTIsODk3ICoqKioKLS0tIDkwOSw5MjUgLS0tLQogIAkJQ29weVNlbmRFbmRPZlJvdyhj c3RhdGUpOwogIAl9CiAgCisgCS8qCisgCSAqIElmIEpTT04gaGFzIGJlZW4gcmVxdWVzdGVk LCBhbmQgRk9SQ0VfQVJSQVkgaGFzIGJlZW4gc3BlY2lmaWVkCisgCSAqIHNlbmQgdGhlIGNs b3NpbmcgYnJhY2tldC4KKyAJICovCisgCWlmIChjc3RhdGUtPm9wdHMuanNvbl9tb2RlICYm CisgCQljc3RhdGUtPm9wdHMuZm9yY2VfYXJyYXkpCisgCXsKKyAJCUNvcHlTZW5kQ2hhcihj c3RhdGUsICddJyk7CisgCQlDb3B5U2VuZEVuZE9mUm93KGNzdGF0ZSk7CisgCX0KKyAKICAJ TWVtb3J5Q29udGV4dERlbGV0ZShjc3RhdGUtPnJvd2NvbnRleHQpOwogIAogIAlpZiAoZmVf Y29weSkKKioqKioqKioqKioqKioqIERvQ29weVRvKENvcHlUb1N0YXRlIGNzdGF0ZSkKKioq IDkwNiw5MTYgKioqKgogIHN0YXRpYyB2b2lkCiAgQ29weU9uZVJvd1RvKENvcHlUb1N0YXRl IGNzdGF0ZSwgVHVwbGVUYWJsZVNsb3QgKnNsb3QpCiAgewotIAlib29sCQluZWVkX2RlbGlt ID0gZmFsc2U7Ci0gCUZtZ3JJbmZvICAgKm91dF9mdW5jdGlvbnMgPSBjc3RhdGUtPm91dF9m dW5jdGlvbnM7CiAgCU1lbW9yeUNvbnRleHQgb2xkY29udGV4dDsKLSAJTGlzdENlbGwgICAq Y3VyOwotIAljaGFyCSAgICpzdHJpbmc7CiAgCiAgCU1lbW9yeUNvbnRleHRSZXNldChjc3Rh dGUtPnJvd2NvbnRleHQpOwogIAlvbGRjb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3aXRjaFRv KGNzdGF0ZS0+cm93Y29udGV4dCk7Ci0tLSA5MzQsOTQwIC0tLS0KKioqKioqKioqKioqKioq IENvcHlPbmVSb3dUbyhDb3B5VG9TdGF0ZSBjc3RhdGUsIFR1cGxlVGEKKioqIDkyMSw5NzQg KioqKgogIAkJQ29weVNlbmRJbnQxNihjc3RhdGUsIGxpc3RfbGVuZ3RoKGNzdGF0ZS0+YXR0 bnVtbGlzdCkpOwogIAl9CiAgCiEgCS8qIE1ha2Ugc3VyZSB0aGUgdHVwbGUgaXMgZnVsbHkg ZGVjb25zdHJ1Y3RlZCAqLwohIAlzbG90X2dldGFsbGF0dHJzKHNsb3QpOwohIAohIAlmb3Jl YWNoKGN1ciwgY3N0YXRlLT5hdHRudW1saXN0KQogIAl7CiEgCQlpbnQJCQlhdHRudW0gPSBs Zmlyc3RfaW50KGN1cik7CiEgCQlEYXR1bQkJdmFsdWUgPSBzbG90LT50dHNfdmFsdWVzW2F0 dG51bSAtIDFdOwohIAkJYm9vbAkJaXNudWxsID0gc2xvdC0+dHRzX2lzbnVsbFthdHRudW0g LSAxXTsKICAKISAJCWlmICghY3N0YXRlLT5vcHRzLmJpbmFyeSkKISAJCXsKISAJCQlpZiAo bmVlZF9kZWxpbSkKISAJCQkJQ29weVNlbmRDaGFyKGNzdGF0ZSwgY3N0YXRlLT5vcHRzLmRl bGltWzBdKTsKISAJCQluZWVkX2RlbGltID0gdHJ1ZTsKISAJCX0KICAKISAJCWlmIChpc251 bGwpCiEgCQl7CiEgCQkJaWYgKCFjc3RhdGUtPm9wdHMuYmluYXJ5KQohIAkJCQlDb3B5U2Vu ZFN0cmluZyhjc3RhdGUsIGNzdGF0ZS0+b3B0cy5udWxsX3ByaW50X2NsaWVudCk7CiEgCQkJ ZWxzZQohIAkJCQlDb3B5U2VuZEludDMyKGNzdGF0ZSwgLTEpOwohIAkJfQohIAkJZWxzZQog IAkJewogIAkJCWlmICghY3N0YXRlLT5vcHRzLmJpbmFyeSkKICAJCQl7CiEgCQkJCXN0cmlu ZyA9IE91dHB1dEZ1bmN0aW9uQ2FsbCgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwKISAJ CQkJCQkJCQkJCXZhbHVlKTsKISAJCQkJaWYgKGNzdGF0ZS0+b3B0cy5jc3ZfbW9kZSkKISAJ CQkJCUNvcHlBdHRyaWJ1dGVPdXRDU1YoY3N0YXRlLCBzdHJpbmcsCiEgCQkJCQkJCQkJCWNz dGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRudW0gLSAxXSwKISAJCQkJCQkJCQkJ bGlzdF9sZW5ndGgoY3N0YXRlLT5hdHRudW1saXN0KSA9PSAxKTsKICAJCQkJZWxzZQohIAkJ CQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJpbmcpOwogIAkJCX0KICAJCQll bHNlCiAgCQkJewohIAkJCQlieXRlYQkgICAqb3V0cHV0Ynl0ZXM7CiAgCiEgCQkJCW91dHB1 dGJ5dGVzID0gU2VuZEZ1bmN0aW9uQ2FsbCgmb3V0X2Z1bmN0aW9uc1thdHRudW0gLSAxXSwK ISAJCQkJCQkJCQkJCSAgIHZhbHVlKTsKISAJCQkJQ29weVNlbmRJbnQzMihjc3RhdGUsIFZB UlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1opOwohIAkJCQlDb3B5U2VuZERhdGEoY3N0 YXRlLCBWQVJEQVRBKG91dHB1dGJ5dGVzKSwKISAJCQkJCQkJIFZBUlNJWkUob3V0cHV0Ynl0 ZXMpIC0gVkFSSERSU1opOwogIAkJCX0KICAJCX0KICAJfQogIAogIAlDb3B5U2VuZEVuZE9m Um93KGNzdGF0ZSk7CiAgCi0tLSA5NDUsMTAyOCAtLS0tCiAgCQlDb3B5U2VuZEludDE2KGNz dGF0ZSwgbGlzdF9sZW5ndGgoY3N0YXRlLT5hdHRudW1saXN0KSk7CiAgCX0KICAKISAJaWYg KCFjc3RhdGUtPm9wdHMuanNvbl9tb2RlKQogIAl7CiEgCQlib29sCQluZWVkX2RlbGltID0g ZmFsc2U7CiEgCQlGbWdySW5mbyAgICpvdXRfZnVuY3Rpb25zID0gY3N0YXRlLT5vdXRfZnVu Y3Rpb25zOwohIAkJTGlzdENlbGwgICAqY3VyOwohIAkJY2hhcgkgICAqc3RyaW5nOwogIAoh IAkJLyogTWFrZSBzdXJlIHRoZSB0dXBsZSBpcyBmdWxseSBkZWNvbnN0cnVjdGVkICovCiEg CQlzbG90X2dldGFsbGF0dHJzKHNsb3QpOwogIAohIAkJZm9yZWFjaChjdXIsIGNzdGF0ZS0+ YXR0bnVtbGlzdCkKICAJCXsKKyAJCQlpbnQJCQlhdHRudW0gPSBsZmlyc3RfaW50KGN1cik7 CisgCQkJRGF0dW0JCXZhbHVlID0gc2xvdC0+dHRzX3ZhbHVlc1thdHRudW0gLSAxXTsKKyAJ CQlib29sCQlpc251bGwgPSBzbG90LT50dHNfaXNudWxsW2F0dG51bSAtIDFdOworIAogIAkJ CWlmICghY3N0YXRlLT5vcHRzLmJpbmFyeSkKICAJCQl7CiEgCQkJCWlmIChuZWVkX2RlbGlt KQohIAkJCQkJQ29weVNlbmRDaGFyKGNzdGF0ZSwgY3N0YXRlLT5vcHRzLmRlbGltWzBdKTsK ISAJCQkJbmVlZF9kZWxpbSA9IHRydWU7CiEgCQkJfQohIAohIAkJCWlmIChpc251bGwpCiEg CQkJewohIAkJCQlpZiAoIWNzdGF0ZS0+b3B0cy5iaW5hcnkpCiEgCQkJCQlDb3B5U2VuZFN0 cmluZyhjc3RhdGUsIGNzdGF0ZS0+b3B0cy5udWxsX3ByaW50X2NsaWVudCk7CiAgCQkJCWVs c2UKISAJCQkJCUNvcHlTZW5kSW50MzIoY3N0YXRlLCAtMSk7CiAgCQkJfQogIAkJCWVsc2UK ICAJCQl7CiEgCQkJCWlmICghY3N0YXRlLT5vcHRzLmJpbmFyeSkKISAJCQkJewohIAkJCQkJ c3RyaW5nID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rpb25zW2F0dG51bSAtIDFd LAohIAkJCQkJCQkJCQkJCXZhbHVlKTsKISAJCQkJCWlmIChjc3RhdGUtPm9wdHMuY3N2X21v ZGUpCiEgCQkJCQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIHN0cmluZywKISAJCQkJ CQkJCQkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9xdW90ZV9mbGFnc1thdHRudW0gLSAxXSwKISAJ CQkJCQkJCQkJCWxpc3RfbGVuZ3RoKGNzdGF0ZS0+YXR0bnVtbGlzdCkgPT0gMSk7CiEgCQkJ CQllbHNlCiEgCQkJCQkJQ29weUF0dHJpYnV0ZU91dFRleHQoY3N0YXRlLCBzdHJpbmcpOwoh IAkJCQl9CiEgCQkJCWVsc2UKISAJCQkJewohIAkJCQkJYnl0ZWEJICAgKm91dHB1dGJ5dGVz OwogIAohIAkJCQkJb3V0cHV0Ynl0ZXMgPSBTZW5kRnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rp b25zW2F0dG51bSAtIDFdLAohIAkJCQkJCQkJCQkJCSAgIHZhbHVlKTsKISAJCQkJCUNvcHlT ZW5kSW50MzIoY3N0YXRlLCBWQVJTSVpFKG91dHB1dGJ5dGVzKSAtIFZBUkhEUlNaKTsKISAJ CQkJCUNvcHlTZW5kRGF0YShjc3RhdGUsIFZBUkRBVEEob3V0cHV0Ynl0ZXMpLAohIAkJCQkJ CQkJIFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERSU1opOwohIAkJCQl9CiAgCQkJfQog IAkJfQogIAl9CisgCWVsc2UKKyAJeworIAkJRGF0dW0Jcm93ZGF0YSA9IEV4ZWNGZXRjaFNs b3RIZWFwVHVwbGVEYXR1bShzbG90KTsKKyAJCVN0cmluZ0luZm8JcmVzdWx0OworIAorIAkJ cmVzdWx0ID0gbWFrZVN0cmluZ0luZm8oKTsKKyAJCWNvbXBvc2l0ZV90b19qc29uKHJvd2Rh dGEsIHJlc3VsdCwgZmFsc2UpOworIAorIAkJaWYgKGpzb25fcm93X2RlbGltX25lZWRlZCAm JgorIAkJCWNzdGF0ZS0+b3B0cy5mb3JjZV9yb3dfZGVsaW1pdGVyKQorIAkJeworIAkJCUNv cHlTZW5kQ2hhcihjc3RhdGUsICcsJyk7CisgCQl9CisgCQllbHNlIGlmIChjc3RhdGUtPm9w dHMuZm9yY2Vfcm93X2RlbGltaXRlcikKKyAJCXsKKyAJCQkvKiBmaXJzdCByb3cgbmVlZHMg bm8gZGVsaW1pdGVyICovCisgCQkJQ29weVNlbmRDaGFyKGNzdGF0ZSwgJyAnKTsKKyAJCQlq c29uX3Jvd19kZWxpbV9uZWVkZWQgPSB0cnVlOworIAkJfQorIAorIAkJQ29weVNlbmREYXRh KGNzdGF0ZSwgcmVzdWx0LT5kYXRhLCByZXN1bHQtPmxlbik7CisgCX0KICAKICAJQ29weVNl bmRFbmRPZlJvdyhjc3RhdGUpOwogIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcGFyc2Vy L2dyYW0ueSBiL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkKaW5kZXggZDYzMWFjOC4uMTZh YTEzMSAxMDA2NDQKKioqIGEvc3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueQotLS0gYi9zcmMv YmFja2VuZC9wYXJzZXIvZ3JhbS55CioqKioqKioqKioqKioqKiBjb3B5X29wdF9pdGVtOgoq KiogMzQwOCwzNDEzICoqKioKLS0tIDM0MDgsMzQxNyAtLS0tCiAgCQkJCXsKICAJCQkJCSQk ID0gbWFrZURlZkVsZW0oImZvcm1hdCIsIChOb2RlICopIG1ha2VTdHJpbmcoImNzdiIpLCBA MSk7CiAgCQkJCX0KKyAJCQl8IEpTT04KKyAJCQkJeworIAkJCQkJJCQgPSBtYWtlRGVmRWxl bSgiZm9ybWF0IiwgKE5vZGUgKikgbWFrZVN0cmluZygianNvbiIpLCBAMSk7CisgCQkJCX0K ICAJCQl8IEhFQURFUl9QCiAgCQkJCXsKICAJCQkJCSQkID0gbWFrZURlZkVsZW0oImhlYWRl ciIsIChOb2RlICopIG1ha2VCb29sZWFuKHRydWUpLCBAMSk7CioqKioqKioqKioqKioqKiBj b3B5X29wdF9pdGVtOgoqKiogMzQ0OCwzNDUzICoqKioKLS0tIDM0NTIsMzQ2NSAtLS0tCiAg CQkJCXsKICAJCQkJCSQkID0gbWFrZURlZkVsZW0oImVuY29kaW5nIiwgKE5vZGUgKikgbWFr ZVN0cmluZygkMiksIEAxKTsKICAJCQkJfQorIAkJCXwgRk9SQ0UgUk9XIERFTElNSVRFUgor IAkJCQl7CisgCQkJCQkkJCA9IG1ha2VEZWZFbGVtKCJmb3JjZV9yb3dfZGVsaW1pdGVyIiwg KE5vZGUgKikgbWFrZUJvb2xlYW4odHJ1ZSksIEAxKTsKKyAJCQkJfQorIAkJCXwgRk9SQ0Ug QVJSQVkKKyAJCQkJeworIAkJCQkJJCQgPSBtYWtlRGVmRWxlbSgiZm9yY2VfYXJyYXkiLCAo Tm9kZSAqKSBtYWtlQm9vbGVhbih0cnVlKSwgQDEpOworIAkJCQl9CiAgCQk7CiAgCiAgLyog VGhlIGZvbGxvd2luZyBleGlzdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIHZl cnkgb2xkIHZlcnNpb25zICovCioqKioqKioqKioqKioqKiBjb3B5X2dlbmVyaWNfb3B0X2Vs ZW06CioqKiAzNDkwLDM0OTUgKioqKgotLS0gMzUwMiwzNTExIC0tLS0KICAJCQkJewogIAkJ CQkJJCQgPSBtYWtlRGVmRWxlbSgkMSwgJDIsIEAxKTsKICAJCQkJfQorIAkJCXwgRk9STUFU X0xBIGNvcHlfZ2VuZXJpY19vcHRfYXJnCisgCQkJCXsKKyAJCQkJCSQkID0gbWFrZURlZkVs ZW0oImZvcm1hdCIsICQyLCBAMSk7CisgCQkJCX0KICAJCTsKICAKICBjb3B5X2dlbmVyaWNf b3B0X2FyZzoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uLmMgYi9z cmMvYmFja2VuZC91dGlscy9hZHQvanNvbi5jCmluZGV4IDcxYWU1M2YuLmNiNDMxMWUgMTAw NjQ0CioqKiBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uLmMKLS0tIGIvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2pzb24uYwoqKioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3QgSnNv bkFnZ1N0YXRlCioqKiA4Myw5MCAqKioqCiAgCUpzb25VbmlxdWVCdWlsZGVyU3RhdGUgdW5p cXVlX2NoZWNrOwogIH0gSnNvbkFnZ1N0YXRlOwogIAotIHN0YXRpYyB2b2lkIGNvbXBvc2l0 ZV90b19qc29uKERhdHVtIGNvbXBvc2l0ZSwgU3RyaW5nSW5mbyByZXN1bHQsCi0gCQkJCQkJ CSAgYm9vbCB1c2VfbGluZV9mZWVkcyk7CiAgc3RhdGljIHZvaWQgYXJyYXlfZGltX3RvX2pz b24oU3RyaW5nSW5mbyByZXN1bHQsIGludCBkaW0sIGludCBuZGltcywgaW50ICpkaW1zLAog IAkJCQkJCQkgIERhdHVtICp2YWxzLCBib29sICpudWxscywgaW50ICp2YWxjb3VudCwKICAJ CQkJCQkJICBKc29uVHlwZUNhdGVnb3J5IHRjYXRlZ29yeSwgT2lkIG91dGZ1bmNvaWQsCi0t LSA4Myw4OCAtLS0tCioqKioqKioqKioqKioqKiBhcnJheV90b19qc29uX2ludGVybmFsKERh dHVtIGFycmF5LCBTdHJpCioqKiA0OTAsNDk3ICoqKioKICAKICAvKgogICAqIFR1cm4gYSBj b21wb3NpdGUgLyByZWNvcmQgaW50byBKU09OLgogICAqLwohIHN0YXRpYyB2b2lkCiAgY29t cG9zaXRlX3RvX2pzb24oRGF0dW0gY29tcG9zaXRlLCBTdHJpbmdJbmZvIHJlc3VsdCwgYm9v bCB1c2VfbGluZV9mZWVkcykKICB7CiAgCUhlYXBUdXBsZUhlYWRlciB0ZDsKLS0tIDQ4OCw0 OTYgLS0tLQogIAogIC8qCiAgICogVHVybiBhIGNvbXBvc2l0ZSAvIHJlY29yZCBpbnRvIEpT T04uCisgICogRXhwb3J0ZWQgc28gQ09QWSBUTyBjYW4gdXNlIGl0LgogICAqLwohIHZvaWQK ICBjb21wb3NpdGVfdG9fanNvbihEYXR1bSBjb21wb3NpdGUsIFN0cmluZ0luZm8gcmVzdWx0 LCBib29sIHVzZV9saW5lX2ZlZWRzKQogIHsKICAJSGVhcFR1cGxlSGVhZGVyIHRkOwpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weS5oIGIvc3JjL2luY2x1ZGUvY29t bWFuZHMvY29weS5oCmluZGV4IGYyY2NhMGIuLjI2NjkxMGQgMTAwNjQ0CioqKiBhL3NyYy9p bmNsdWRlL2NvbW1hbmRzL2NvcHkuaAotLS0gYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5 LmgKKioqKioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0IENvcHlGb3JtYXRPcHRpb25zCioq KiA0Myw0OCAqKioqCi0tLSA0Myw0OSAtLS0tCiAgCWJvb2wJCWJpbmFyeTsJCQkvKiBiaW5h cnkgZm9ybWF0PyAqLwogIAlib29sCQlmcmVlemU7CQkJLyogZnJlZXplIHJvd3Mgb24gbG9h ZGluZz8gKi8KICAJYm9vbAkJY3N2X21vZGU7CQkvKiBDb21tYSBTZXBhcmF0ZWQgVmFsdWUg Zm9ybWF0PyAqLworIAlib29sCQlqc29uX21vZGU7CQkvKiBKU09OIGZvcm1hdD8gKi8KICAJ Q29weUhlYWRlckNob2ljZSBoZWFkZXJfbGluZTsJLyogaGVhZGVyIGxpbmU/ICovCiAgCWNo YXIJICAgKm51bGxfcHJpbnQ7CQkvKiBOVUxMIG1hcmtlciBzdHJpbmcgKHNlcnZlciBlbmNv ZGluZyEpICovCiAgCWludAkJCW51bGxfcHJpbnRfbGVuOyAvKiBsZW5ndGggb2Ygc2FtZSAq LwoqKioqKioqKioqKioqKiogdHlwZWRlZiBzdHJ1Y3QgQ29weUZvcm1hdE9wdGlvbnMKKioq IDYxLDY2ICoqKioKLS0tIDYyLDY5IC0tLS0KICAJTGlzdAkgICAqZm9yY2VfbnVsbDsJCS8q IGxpc3Qgb2YgY29sdW1uIG5hbWVzICovCiAgCWJvb2wJCWZvcmNlX251bGxfYWxsOyAvKiBG T1JDRV9OVUxMICo/ICovCiAgCWJvb2wJICAgKmZvcmNlX251bGxfZmxhZ3M7CS8qIHBlci1j b2x1bW4gQ1NWIEZOIGZsYWdzICovCisgCWJvb2wJCWZvcmNlX3Jvd19kZWxpbWl0ZXI7CS8q IHVzZSBjb21tYSBhcyBwZXItcm93IEpTT04gZGVsaW1pdGVyICovCisgCWJvb2wJCWZvcmNl X2FycmF5OwkvKiBKU09OIGFycmF5OyBpbXBsaWVzIGZvcmNlX3Jvd19kZWxpbWl0ZXIgKi8K ICAJYm9vbAkJY29udmVydF9zZWxlY3RpdmVseTsJLyogZG8gc2VsZWN0aXZlIGJpbmFyeSBj b252ZXJzaW9uPyAqLwogIAlMaXN0CSAgICpjb252ZXJ0X3NlbGVjdDsgLyogbGlzdCBvZiBj b2x1bW4gbmFtZXMgKGNhbiBiZSBOSUwpICovCiAgfSBDb3B5Rm9ybWF0T3B0aW9uczsKZGlm ZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL2pzb24uaCBiL3NyYy9pbmNsdWRlL3V0aWxz L2pzb24uaAppbmRleCBmMDdlODJjLi5iYWRjNWE2IDEwMDY0NAoqKiogYS9zcmMvaW5jbHVk ZS91dGlscy9qc29uLmgKLS0tIGIvc3JjL2luY2x1ZGUvdXRpbHMvanNvbi5oCioqKioqKioq KioqKioqKgoqKiogMTcsMjIgKioqKgotLS0gMTcsMjQgLS0tLQogICNpbmNsdWRlICJsaWIv c3RyaW5naW5mby5oIgogIAogIC8qIGZ1bmN0aW9ucyBpbiBqc29uLmMgKi8KKyBleHRlcm4g dm9pZCBjb21wb3NpdGVfdG9fanNvbihEYXR1bSBjb21wb3NpdGUsIFN0cmluZ0luZm8gcmVz dWx0LAorIAkJCQkJCQkgIGJvb2wgdXNlX2xpbmVfZmVlZHMpOwogIGV4dGVybiB2b2lkIGVz Y2FwZV9qc29uKFN0cmluZ0luZm8gYnVmLCBjb25zdCBjaGFyICpzdHIpOwogIGV4dGVybiBj aGFyICpKc29uRW5jb2RlRGF0ZVRpbWUoY2hhciAqYnVmLCBEYXR1bSB2YWx1ZSwgT2lkIHR5 cGlkLAogIAkJCQkJCQkJY29uc3QgaW50ICp0enApOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv Y29weS5vdXQKaW5kZXggYjQ4MzY1ZS4uMWE4ZGRlMiAxMDA2NDQKKioqIGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dAotLS0gYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2NvcHkub3V0CioqKioqKioqKioqKioqKiBjb3B5IGNvcHl0ZXN0MyB0byBzdGRvdXQg Y3N2IGhlYWRlcjsKKioqIDQyLDQ3ICoqKioKLS0tIDQyLDExNSAtLS0tCiAgYzEsImNvbCB3 aXRoICwgY29tbWEiLCJjb2wgd2l0aCAiIiBxdW90ZSIKICAxLGEsMQogIDIsYiwyCisgLS0t IHRlc3QgY29weWluZyBpbiBKU09OIG1vZGUgd2l0aCB2YXJpb3VzIHN0eWxlcworIGNvcHkg Y29weXRlc3QgdG8gc3Rkb3V0IGpzb247CisgeyJzdHlsZSI6IkRPUyIsInRlc3QiOiJhYmNc clxuZGVmIiwiZmlsbGVyIjoxfQorIHsic3R5bGUiOiJVbml4IiwidGVzdCI6ImFiY1xuZGVm IiwiZmlsbGVyIjoyfQorIHsic3R5bGUiOiJNYWMiLCJ0ZXN0IjoiYWJjXHJkZWYiLCJmaWxs ZXIiOjN9CisgeyJzdHlsZSI6ImVzY1xcYXBlIiwidGVzdCI6ImFcXHJcXFxyXFxcblxcbmIi LCJmaWxsZXIiOjR9CisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29uKTsK KyB7InN0eWxlIjoiRE9TIiwidGVzdCI6ImFiY1xyXG5kZWYiLCJmaWxsZXIiOjF9CisgeyJz dHlsZSI6IlVuaXgiLCJ0ZXN0IjoiYWJjXG5kZWYiLCJmaWxsZXIiOjJ9CisgeyJzdHlsZSI6 Ik1hYyIsInRlc3QiOiJhYmNccmRlZiIsImZpbGxlciI6M30KKyB7InN0eWxlIjoiZXNjXFxh cGUiLCJ0ZXN0IjoiYVxcclxcXHJcXFxuXFxuYiIsImZpbGxlciI6NH0KKyBjb3B5IGNvcHl0 ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpzb24sIGZvcmNlX2FycmF5KTsKKyBbCisgIHsic3R5 bGUiOiJET1MiLCJ0ZXN0IjoiYWJjXHJcbmRlZiIsImZpbGxlciI6MX0KKyAseyJzdHlsZSI6 IlVuaXgiLCJ0ZXN0IjoiYWJjXG5kZWYiLCJmaWxsZXIiOjJ9CisgLHsic3R5bGUiOiJNYWMi LCJ0ZXN0IjoiYWJjXHJkZWYiLCJmaWxsZXIiOjN9CisgLHsic3R5bGUiOiJlc2NcXGFwZSIs InRlc3QiOiJhXFxyXFxcclxcXG5cXG5iIiwiZmlsbGVyIjo0fQorIF0KKyBjb3B5IGNvcHl0 ZXN0IHRvIHN0ZG91dCAoZm9ybWF0IGpzb24sIGZvcmNlX3Jvd19kZWxpbWl0ZXIpOworICB7 InN0eWxlIjoiRE9TIiwidGVzdCI6ImFiY1xyXG5kZWYiLCJmaWxsZXIiOjF9CisgLHsic3R5 bGUiOiJVbml4IiwidGVzdCI6ImFiY1xuZGVmIiwiZmlsbGVyIjoyfQorICx7InN0eWxlIjoi TWFjIiwidGVzdCI6ImFiY1xyZGVmIiwiZmlsbGVyIjozfQorICx7InN0eWxlIjoiZXNjXFxh cGUiLCJ0ZXN0IjoiYVxcclxcXHJcXFxuXFxuYiIsImZpbGxlciI6NH0KKyAtLSBFcnJvcgor IGNvcHkgY29weXRlc3QgdG8gc3Rkb3V0CisgIChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkg dHJ1ZSwgZm9yY2Vfcm93X2RlbGltaXRlciBmYWxzZSk7CisgRVJST1I6ICBjYW5ub3Qgc3Bl Y2lmeSBGT1JDRV9ST1dfREVMSU1JVEVSIGZhbHNlIHdpdGggRk9SQ0VfQVJSQVkgdHJ1ZQor IC0tIEVycm9yCisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQKKyAgKGZvcm1hdCBqc29uLCBo ZWFkZXIpOworIEVSUk9SOiAgY2Fubm90IHNwZWNpZnkgSEVBREVSIGluIEpTT04gbW9kZQor IC0tIGVtYmVkZGVkIGVzY2FwZWQgY2hhcmFjdGVycworIGNyZWF0ZSB0ZW1wIHRhYmxlIGNv cHlqc29udGVzdCAoCisgICAgIGlkIGJpZ3NlcmlhbCwKKyAgICAgZjEgdGV4dCwKKyAgICAg ZjIgdGltZXN0YW1wdHopOworIGluc2VydCBpbnRvIGNvcHlqc29udGVzdAorICAgc2VsZWN0 IGcuaSwKKyAgICAgICAgICBDQVNFIFdIRU4gZy5pICUgMiA9IDAgVEhFTgorICAgICAgICAg ICAgJ2xpbmUgd2l0aCAnJyBpbiBpdDogJyB8fCBnLmk6OnRleHQKKyAgICAgICAgICBFTFNF CisgICAgICAgICAgICAnbGluZSB3aXRoICIgaW4gaXQ6ICcgfHwgZy5pOjp0ZXh0CisgICAg ICAgICAgRU5ELAorICAgICAgICAgICdNb24gRmViIDEwIDE3OjMyOjAxIDE5OTcgUFNUJwor ICAgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSw1KSBhcyBnKGkpOworIGluc2VydCBpbnRvIGNv cHlqc29udGVzdCAoZjEpIHZhbHVlcworIChFJ2FhYVwiYmJiJzo6dGV4dCksCisgKEUnYWFh XFxiYmInOjp0ZXh0KSwKKyAoRSdhYWFcL2JiYic6OnRleHQpLAorIChFJ2FhYVxiYmJiJzo6 dGV4dCksCisgKEUnYWFhXGZiYmInOjp0ZXh0KSwKKyAoRSdhYWFcbmJiYic6OnRleHQpLAor IChFJ2FhYVxyYmJiJzo6dGV4dCksCisgKEUnYWFhXHRiYmInOjp0ZXh0KTsKKyBjb3B5IGNv cHlqc29udGVzdCB0byBzdGRvdXQganNvbjsKKyB7ImlkIjoxLCJmMSI6ImxpbmUgd2l0aCBc IiBpbiBpdDogMSIsImYyIjoiMTk5Ny0wMi0xMFQxNzozMjowMS0wODowMCJ9CisgeyJpZCI6 MiwiZjEiOiJsaW5lIHdpdGggJyBpbiBpdDogMiIsImYyIjoiMTk5Ny0wMi0xMFQxNzozMjow MS0wODowMCJ9CisgeyJpZCI6MywiZjEiOiJsaW5lIHdpdGggXCIgaW4gaXQ6IDMiLCJmMiI6 IjE5OTctMDItMTBUMTc6MzI6MDEtMDg6MDAifQorIHsiaWQiOjQsImYxIjoibGluZSB3aXRo ICcgaW4gaXQ6IDQiLCJmMiI6IjE5OTctMDItMTBUMTc6MzI6MDEtMDg6MDAifQorIHsiaWQi OjUsImYxIjoibGluZSB3aXRoIFwiIGluIGl0OiA1IiwiZjIiOiIxOTk3LTAyLTEwVDE3OjMy OjAxLTA4OjAwIn0KKyB7ImlkIjoxLCJmMSI6ImFhYVwiYmJiIiwiZjIiOm51bGx9CisgeyJp ZCI6MiwiZjEiOiJhYWFcXGJiYiIsImYyIjpudWxsfQorIHsiaWQiOjMsImYxIjoiYWFhL2Ji YiIsImYyIjpudWxsfQorIHsiaWQiOjQsImYxIjoiYWFhXGJiYmIiLCJmMiI6bnVsbH0KKyB7 ImlkIjo1LCJmMSI6ImFhYVxmYmJiIiwiZjIiOm51bGx9CisgeyJpZCI6NiwiZjEiOiJhYWFc bmJiYiIsImYyIjpudWxsfQorIHsiaWQiOjcsImYxIjoiYWFhXHJiYmIiLCJmMiI6bnVsbH0K KyB7ImlkIjo4LCJmMSI6ImFhYVx0YmJiIiwiZjIiOm51bGx9CiAgY3JlYXRlIHRlbXAgdGFi bGUgY29weXRlc3Q0ICgKICAJYzEgaW50LAogIAkiY29sbmFtZSB3aXRoIHRhYjogCSIgdGV4 dCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb3B5LnNxbCBiL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsCmluZGV4IDQzZDJlOTAuLmFhYzRjY2QgMTAwNjQ0 CioqKiBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsCi0tLSBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2NvcHkuc3FsCioqKioqKioqKioqKioqKiB0aGlzIGlzIGp1c3QgYSBsaW5l IGZ1bGwgb2YganVuayB0aGF0IHdvCioqKiA1NCw1OSAqKioqCi0tLSA1NCwxMDQgLS0tLQog IAogIGNvcHkgY29weXRlc3QzIHRvIHN0ZG91dCBjc3YgaGVhZGVyOwogIAorIC0tLSB0ZXN0 IGNvcHlpbmcgaW4gSlNPTiBtb2RlIHdpdGggdmFyaW91cyBzdHlsZXMKKyBjb3B5IGNvcHl0 ZXN0IHRvIHN0ZG91dCBqc29uOworIAorIGNvcHkgY29weXRlc3QgdG8gc3Rkb3V0IChmb3Jt YXQganNvbik7CisgCisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29uLCBm b3JjZV9hcnJheSk7CisgCisgY29weSBjb3B5dGVzdCB0byBzdGRvdXQgKGZvcm1hdCBqc29u LCBmb3JjZV9yb3dfZGVsaW1pdGVyKTsKKyAKKyAtLSBFcnJvcgorIGNvcHkgY29weXRlc3Qg dG8gc3Rkb3V0CisgIChmb3JtYXQganNvbiwgZm9yY2VfYXJyYXkgdHJ1ZSwgZm9yY2Vfcm93 X2RlbGltaXRlciBmYWxzZSk7CisgCisgLS0gRXJyb3IKKyBjb3B5IGNvcHl0ZXN0IHRvIHN0 ZG91dAorICAoZm9ybWF0IGpzb24sIGhlYWRlcik7CisgCisgLS0gZW1iZWRkZWQgZXNjYXBl ZCBjaGFyYWN0ZXJzCisgY3JlYXRlIHRlbXAgdGFibGUgY29weWpzb250ZXN0ICgKKyAgICAg aWQgYmlnc2VyaWFsLAorICAgICBmMSB0ZXh0LAorICAgICBmMiB0aW1lc3RhbXB0eik7Cisg CisgaW5zZXJ0IGludG8gY29weWpzb250ZXN0CisgICBzZWxlY3QgZy5pLAorICAgICAgICAg IENBU0UgV0hFTiBnLmkgJSAyID0gMCBUSEVOCisgICAgICAgICAgICAnbGluZSB3aXRoICcn IGluIGl0OiAnIHx8IGcuaTo6dGV4dAorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgICds aW5lIHdpdGggIiBpbiBpdDogJyB8fCBnLmk6OnRleHQKKyAgICAgICAgICBFTkQsCisgICAg ICAgICAgJ01vbiBGZWIgMTAgMTc6MzI6MDEgMTk5NyBQU1QnCisgICBmcm9tIGdlbmVyYXRl X3NlcmllcygxLDUpIGFzIGcoaSk7CisgCisgaW5zZXJ0IGludG8gY29weWpzb250ZXN0IChm MSkgdmFsdWVzCisgKEUnYWFhXCJiYmInOjp0ZXh0KSwKKyAoRSdhYWFcXGJiYic6OnRleHQp LAorIChFJ2FhYVwvYmJiJzo6dGV4dCksCisgKEUnYWFhXGJiYmInOjp0ZXh0KSwKKyAoRSdh YWFcZmJiYic6OnRleHQpLAorIChFJ2FhYVxuYmJiJzo6dGV4dCksCisgKEUnYWFhXHJiYmIn Ojp0ZXh0KSwKKyAoRSdhYWFcdGJiYic6OnRleHQpOworIAorIGNvcHkgY29weWpzb250ZXN0 IHRvIHN0ZG91dCBqc29uOworIAogIGNyZWF0ZSB0ZW1wIHRhYmxlIGNvcHl0ZXN0NCAoCiAg CWMxIGludCwKICAJImNvbG5hbWUgd2l0aCB0YWI6IAkiIHRleHQpOwo= --------------Z00JC9Zl5AchNryIz9t0FARv--