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 1r99Fb-00EZC0-T6 for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Dec 2023 19:32:36 +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 1r99FZ-009Apy-RD for pgsql-hackers@arkaria.postgresql.org; Fri, 01 Dec 2023 19:32:33 +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.94.2) (envelope-from ) id 1r99FY-009Apn-VF for pgsql-hackers@lists.postgresql.org; Fri, 01 Dec 2023 19:32:33 +0000 Received: from mail-il1-x131.google.com ([2607:f8b0:4864:20::131]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1r99FV-008Jxx-EZ for pgsql-hackers@postgresql.org; Fri, 01 Dec 2023 19:32:31 +0000 Received: by mail-il1-x131.google.com with SMTP id e9e14a558f8ab-35c63f4b1f9so8245705ab.3 for ; Fri, 01 Dec 2023 11:32:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joeconway.com; s=google; t=1701459148; x=1702063948; 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=LZWmrVXvMwvruKpSCcib6PQL9SBBEWV5Liekfheng7c=; b=rf0w3sJw//X13dcRVCuYeAP3qUhma81W8c44L1VQNmb4Udyn+eKlqXlxsLDbLVS0Ub oc/EOyQ6fhHdWytIawZwnoGelDNqDiSrjdjgmaDnPTkLYPI/cMQLrjTEUl2N/4sCZeWq HNHx3KKOUGuOdpTaxAAm2M83ZQ4nT5Xo0fU5cxIQLkRlpShlsANaupKBrPli1PI17LyU LLoi+CBQrn0A6F0NwA2GpEENenMZ7gH7cfhTO5VLoRp8domaZ8xv/tX8LwWdMCcxSBJl iUsVTRGSTXSl56EMUJsXyTKFSWYg7KzdWLyB6X303QnEFrHZKIivG1qLaWY97tE26L4u 7xcg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701459148; x=1702063948; 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=LZWmrVXvMwvruKpSCcib6PQL9SBBEWV5Liekfheng7c=; b=HmEWhH34+FRn5c/NWbsUFSpbKHw6hNpFjgMDNzmmKXiUBQClpDSL0xDrRi2Rg0jl+l BpoP/whgPq//p0f5TvywxxGIw7ng8m7Ss+N4Cnyxq3SDisU78QGIdzFEwUsEJ9Nm0NZV zn1MUox617lY2vf3P10kiR9ZBV1xpCaZhiYUVsJKlDmpUmQASVOKAxKnoameC68EQOL9 U3VCgwuPUPR3fFOOqHDpVbTXMsCKiwWqwWE7kdFgPRt4Wtp5JBJgy8IJNa63gRYgAyCC 1bODCER+P4xKlW5dK7oWRCsujwxedJP/naJfC5xnHmTzY+tKxrZCkDJIKdabUlv+Y9ah LBAw== X-Gm-Message-State: AOJu0YxHYjCkPIjyRXiz3jb6BdfWrsF7cjQiYxglAKwXJCfpXyUHVf6j 3ZLQjYZWCM/sge97aGLpW4IhIuDL5IN8YWS/S78= X-Google-Smtp-Source: AGHT+IEC2ETI39Lz2dK9vzTWbKE0vCiEWmHLNQYKLt3ShNf0TuaGB/ipgXSe2Hha2a/YVZepEAOP5g== X-Received: by 2002:a0d:df8c:0:b0:5cf:ca4d:83e4 with SMTP id i134-20020a0ddf8c000000b005cfca4d83e4mr9340ywe.9.1701458937389; Fri, 01 Dec 2023 11:28:57 -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 e204-20020a8169d5000000b005cc8b377fe9sm211378ywc.121.2023.12.01.11.28.55 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 01 Dec 2023 11:28:55 -0800 (PST) Content-Type: multipart/mixed; boundary="------------E4UFsSc8t0EOC9YU2c318yDM" Message-ID: <24e3ee88-ec1e-421b-89ae-8a47ee0d2df1@joeconway.com> Date: Fri, 1 Dec 2023 14:28:55 -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 References: <3853387.1701096982@sss.pgh.pa.us> <3a98decf-3fe3-4b49-9b68-fda01338872c@sedlakovi.org> 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. --------------E4UFsSc8t0EOC9YU2c318yDM Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 11/29/23 10:32, Davin Shearer wrote: > Thanks for the responses everyone. > > I worked around the issue using the `psql -tc` method as Filip described. > > I think it would be great to support writing JSON using COPY TO at > some point so I can emit JSON to files using a PostgreSQL function directly. > > -Davin > > On Tue, Nov 28, 2023 at 2:36 AM Filip Sedlák > wrote: > > This would be a very special case for COPY. It applies only to a single > column of JSON values. The original problem can be solved with psql > --tuples-only as David wrote earlier. > > > $ psql -tc 'select json_agg(row_to_json(t)) >               from (select * from public.tbl_json_test) t;' > >   [{"id":1,"t_test":"here's a \"string\""}] > > > Special-casing any encoding/escaping scheme leads to bugs and harder > parsing. (moved to hackers) I did a quick PoC patch (attached) -- if there interest and no hard objections I would like to get it up to speed for the January commitfest. Currently the patch lacks documentation and regression test support. Questions: ---------- 1. Is supporting JSON array format sufficient, or does it need to support some other options? How flexible does the support scheme need to be? 2. This only supports COPY TO and we would undoubtedly want to support COPY FROM for JSON as well, but is that required from the start? Thanks for any feedback. -- Joe Conway PostgreSQL Contributors Team RDS Open Source Databases Amazon Web Services: https://aws.amazon.com --------------E4UFsSc8t0EOC9YU2c318yDM Content-Type: text/x-patch; charset=UTF-8; name="copyto_json.000.diff" Content-Disposition: attachment; filename="copyto_json.000.diff" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHkuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHkuYwppbmRleCBjZmFkNDdiLi5iYzFmNjg0IDEwMDY0NAoqKiogYS9z cmMvYmFja2VuZC9jb21tYW5kcy9jb3B5LmMKLS0tIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMv Y29weS5jCioqKioqKioqKioqKioqKiBQcm9jZXNzQ29weU9wdGlvbnMoUGFyc2VTdGF0ZSAq cHN0YXRlLAoqKiogNDQzLDQ0OCAqKioqCi0tLSA0NDMsNDUwIC0tLS0KICAJCQkJIC8qIGRl ZmF1bHQgZm9ybWF0ICovIDsKICAJCQllbHNlIGlmIChzdHJjbXAoZm10LCAiY3N2IikgPT0g MCkKICAJCQkJb3B0c19vdXQtPmNzdl9tb2RlID0gdHJ1ZTsKKyAJCQllbHNlIGlmIChzdHJj bXAoZm10LCAianNvbiIpID09IDApCisgCQkJCW9wdHNfb3V0LT5qc29uX21vZGUgPSB0cnVl OwogIAkJCWVsc2UgaWYgKHN0cmNtcChmbXQsICJiaW5hcnkiKSA9PSAwKQogIAkJCQlvcHRz X291dC0+YmluYXJ5ID0gdHJ1ZTsKICAJCQllbHNlCioqKioqKioqKioqKioqKiBQcm9jZXNz Q29weU9wdGlvbnMoUGFyc2VTdGF0ZSAqcHN0YXRlLAoqKiogNjY3LDY3MiAqKioqCi0tLSA2 NjksNjc5IC0tLS0KICAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAogIAkJCQkgZXJybXNnKCJjYW5ub3Qgc3BlY2lmeSBIRUFERVIgaW4gQklOQVJZIG1v ZGUiKSkpOwogIAorIAlpZiAob3B0c19vdXQtPmpzb25fbW9kZSAmJiBvcHRzX291dC0+aGVh ZGVyX2xpbmUpCisgCQllcmVwb3J0KEVSUk9SLAorIAkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCisgCQkJCSBlcnJtc2coImNhbm5vdCBzcGVjaWZ5IEhF QURFUiBpbiBKU09OIG1vZGUiKSkpOworIAogIAkvKiBDaGVjayBxdW90ZSAqLwogIAlpZiAo IW9wdHNfb3V0LT5jc3ZfbW9kZSAmJiBvcHRzX291dC0+cXVvdGUgIT0gTlVMTCkKICAJCWVy ZXBvcnQoRVJST1IsCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5dG8u YyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCmluZGV4IGM2NmEwNDcuLmY2ZWU3 NzEgMTAwNjQ0CioqKiBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCi0tLSBiL3Ny Yy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCioqKioqKioqKioqKioqKgoqKiogMzcsNDIg KioqKgotLS0gMzcsNDMgLS0tLQogICNpbmNsdWRlICJyZXdyaXRlL3Jld3JpdGVIYW5kbGVy LmgiCiAgI2luY2x1ZGUgInN0b3JhZ2UvZmQuaCIKICAjaW5jbHVkZSAidGNvcC90Y29wcHJv dC5oIgorICNpbmNsdWRlICJ1dGlscy9qc29uLmgiCiAgI2luY2x1ZGUgInV0aWxzL2xzeXNj YWNoZS5oIgogICNpbmNsdWRlICJ1dGlscy9tZW11dGlscy5oIgogICNpbmNsdWRlICJ1dGls cy9wYXJ0Y2FjaGUuaCIKKioqKioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0CioqKiAxMTIs MTE3ICoqKioKLS0tIDExMywxMjAgLS0tLQogIC8qIE5PVEU6IHRoZXJlJ3MgYSBjb3B5IG9m IHRoaXMgaW4gY29weWZyb21wYXJzZS5jICovCiAgc3RhdGljIGNvbnN0IGNoYXIgQmluYXJ5 U2lnbmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAiOwogIAorIC8qIG5lZWQgZGVs aW1pdGVyIHRvIHN0YXJ0IG5leHQganNvbiBhcnJheSBlbGVtZW50ICovCisgc3RhdGljIGJv b2wganNvbl9yb3dfZGVsaW1fbmVlZGVkID0gZmFsc2U7CiAgCiAgLyogbm9uLWV4cG9ydCBm dW5jdGlvbiBwcm90b3R5cGVzICovCiAgc3RhdGljIHZvaWQgRW5kQ29weShDb3B5VG9TdGF0 ZSBjc3RhdGUpOwoqKioqKioqKioqKioqKiogRG9Db3B5VG8oQ29weVRvU3RhdGUgY3N0YXRl KQoqKiogODQ1LDg1MCAqKioqCi0tLSA4NDgsODYxIC0tLS0KICAKICAJCQlDb3B5U2VuZEVu ZE9mUm93KGNzdGF0ZSk7CiAgCQl9CisgCisgCQkvKiBpZiBhIEpTT04gaGFzIGJlZW4gcmVx dWVzdGVkIHNlbmQgdGhlIG9wZW5pbmcgYnJhY2tldCAqLworIAkJaWYgKGNzdGF0ZS0+b3B0 cy5qc29uX21vZGUpCisgCQl7CisgCQkJQ29weVNlbmRDaGFyKGNzdGF0ZSwgJ1snKTsKKyAJ CQlDb3B5U2VuZEVuZE9mUm93KGNzdGF0ZSk7CisgCQkJanNvbl9yb3dfZGVsaW1fbmVlZGVk ID0gZmFsc2U7CisgCQl9CiAgCX0KICAKICAJaWYgKGNzdGF0ZS0+cmVsKQoqKioqKioqKioq KioqKiogRG9Db3B5VG8oQ29weVRvU3RhdGUgY3N0YXRlKQoqKiogODkyLDg5NyAqKioqCi0t LSA5MDMsOTE1IC0tLS0KICAJCUNvcHlTZW5kRW5kT2ZSb3coY3N0YXRlKTsKICAJfQogIAor IAkvKiBpZiBhIEpTT04gaGFzIGJlZW4gcmVxdWVzdGVkIHNlbmQgdGhlIGNsb3NpbmcgYnJh Y2tldCAqLworIAlpZiAoY3N0YXRlLT5vcHRzLmpzb25fbW9kZSkKKyAJeworIAkJQ29weVNl bmRDaGFyKGNzdGF0ZSwgJ10nKTsKKyAJCUNvcHlTZW5kRW5kT2ZSb3coY3N0YXRlKTsKKyAJ fQorIAogIAlNZW1vcnlDb250ZXh0RGVsZXRlKGNzdGF0ZS0+cm93Y29udGV4dCk7CiAgCiAg CWlmIChmZV9jb3B5KQoqKioqKioqKioqKioqKiogRG9Db3B5VG8oQ29weVRvU3RhdGUgY3N0 YXRlKQoqKiogOTA2LDkxNiAqKioqCiAgc3RhdGljIHZvaWQKICBDb3B5T25lUm93VG8oQ29w eVRvU3RhdGUgY3N0YXRlLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCkKICB7Ci0gCWJvb2wJCW5l ZWRfZGVsaW0gPSBmYWxzZTsKLSAJRm1nckluZm8gICAqb3V0X2Z1bmN0aW9ucyA9IGNzdGF0 ZS0+b3V0X2Z1bmN0aW9uczsKICAJTWVtb3J5Q29udGV4dCBvbGRjb250ZXh0OwotIAlMaXN0 Q2VsbCAgICpjdXI7Ci0gCWNoYXIJICAgKnN0cmluZzsKICAKICAJTWVtb3J5Q29udGV4dFJl c2V0KGNzdGF0ZS0+cm93Y29udGV4dCk7CiAgCW9sZGNvbnRleHQgPSBNZW1vcnlDb250ZXh0 U3dpdGNoVG8oY3N0YXRlLT5yb3djb250ZXh0KTsKLS0tIDkyNCw5MzAgLS0tLQoqKioqKioq KioqKioqKiogQ29weU9uZVJvd1RvKENvcHlUb1N0YXRlIGNzdGF0ZSwgVHVwbGVUYQoqKiog OTIxLDk3NCAqKioqCiAgCQlDb3B5U2VuZEludDE2KGNzdGF0ZSwgbGlzdF9sZW5ndGgoY3N0 YXRlLT5hdHRudW1saXN0KSk7CiAgCX0KICAKISAJLyogTWFrZSBzdXJlIHRoZSB0dXBsZSBp cyBmdWxseSBkZWNvbnN0cnVjdGVkICovCiEgCXNsb3RfZ2V0YWxsYXR0cnMoc2xvdCk7CiEg CiEgCWZvcmVhY2goY3VyLCBjc3RhdGUtPmF0dG51bWxpc3QpCiAgCXsKISAJCWludAkJCWF0 dG51bSA9IGxmaXJzdF9pbnQoY3VyKTsKISAJCURhdHVtCQl2YWx1ZSA9IHNsb3QtPnR0c192 YWx1ZXNbYXR0bnVtIC0gMV07CiEgCQlib29sCQlpc251bGwgPSBzbG90LT50dHNfaXNudWxs W2F0dG51bSAtIDFdOwogIAohIAkJaWYgKCFjc3RhdGUtPm9wdHMuYmluYXJ5KQohIAkJewoh IAkJCWlmIChuZWVkX2RlbGltKQohIAkJCQlDb3B5U2VuZENoYXIoY3N0YXRlLCBjc3RhdGUt Pm9wdHMuZGVsaW1bMF0pOwohIAkJCW5lZWRfZGVsaW0gPSB0cnVlOwohIAkJfQogIAohIAkJ aWYgKGlzbnVsbCkKISAJCXsKISAJCQlpZiAoIWNzdGF0ZS0+b3B0cy5iaW5hcnkpCiEgCQkJ CUNvcHlTZW5kU3RyaW5nKGNzdGF0ZSwgY3N0YXRlLT5vcHRzLm51bGxfcHJpbnRfY2xpZW50 KTsKISAJCQllbHNlCiEgCQkJCUNvcHlTZW5kSW50MzIoY3N0YXRlLCAtMSk7CiEgCQl9CiEg CQllbHNlCiAgCQl7CiAgCQkJaWYgKCFjc3RhdGUtPm9wdHMuYmluYXJ5KQogIAkJCXsKISAJ CQkJc3RyaW5nID0gT3V0cHV0RnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rpb25zW2F0dG51bSAt IDFdLAohIAkJCQkJCQkJCQkJdmFsdWUpOwohIAkJCQlpZiAoY3N0YXRlLT5vcHRzLmNzdl9t b2RlKQohIAkJCQkJQ29weUF0dHJpYnV0ZU91dENTVihjc3RhdGUsIHN0cmluZywKISAJCQkJ CQkJCQkJY3N0YXRlLT5vcHRzLmZvcmNlX3F1b3RlX2ZsYWdzW2F0dG51bSAtIDFdLAohIAkJ CQkJCQkJCQlsaXN0X2xlbmd0aChjc3RhdGUtPmF0dG51bWxpc3QpID09IDEpOwogIAkJCQll bHNlCiEgCQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4dChjc3RhdGUsIHN0cmluZyk7CiAgCQkJ fQogIAkJCWVsc2UKICAJCQl7CiEgCQkJCWJ5dGVhCSAgICpvdXRwdXRieXRlczsKICAKISAJ CQkJb3V0cHV0Ynl0ZXMgPSBTZW5kRnVuY3Rpb25DYWxsKCZvdXRfZnVuY3Rpb25zW2F0dG51 bSAtIDFdLAohIAkJCQkJCQkJCQkJICAgdmFsdWUpOwohIAkJCQlDb3B5U2VuZEludDMyKGNz dGF0ZSwgVkFSU0laRShvdXRwdXRieXRlcykgLSBWQVJIRFJTWik7CiEgCQkJCUNvcHlTZW5k RGF0YShjc3RhdGUsIFZBUkRBVEEob3V0cHV0Ynl0ZXMpLAohIAkJCQkJCQkgVkFSU0laRShv dXRwdXRieXRlcykgLSBWQVJIRFJTWik7CiAgCQkJfQogIAkJfQogIAl9CiAgCiAgCUNvcHlT ZW5kRW5kT2ZSb3coY3N0YXRlKTsKICAKLS0tIDkzNSwxMDE1IC0tLS0KICAJCUNvcHlTZW5k SW50MTYoY3N0YXRlLCBsaXN0X2xlbmd0aChjc3RhdGUtPmF0dG51bWxpc3QpKTsKICAJfQog IAohIAlpZiAoIWNzdGF0ZS0+b3B0cy5qc29uX21vZGUpCiAgCXsKISAJCWJvb2wJCW5lZWRf ZGVsaW0gPSBmYWxzZTsKISAJCUZtZ3JJbmZvICAgKm91dF9mdW5jdGlvbnMgPSBjc3RhdGUt Pm91dF9mdW5jdGlvbnM7CiEgCQlMaXN0Q2VsbCAgICpjdXI7CiEgCQljaGFyCSAgICpzdHJp bmc7CiAgCiEgCQkvKiBNYWtlIHN1cmUgdGhlIHR1cGxlIGlzIGZ1bGx5IGRlY29uc3RydWN0 ZWQgKi8KISAJCXNsb3RfZ2V0YWxsYXR0cnMoc2xvdCk7CiAgCiEgCQlmb3JlYWNoKGN1ciwg Y3N0YXRlLT5hdHRudW1saXN0KQogIAkJeworIAkJCWludAkJCWF0dG51bSA9IGxmaXJzdF9p bnQoY3VyKTsKKyAJCQlEYXR1bQkJdmFsdWUgPSBzbG90LT50dHNfdmFsdWVzW2F0dG51bSAt IDFdOworIAkJCWJvb2wJCWlzbnVsbCA9IHNsb3QtPnR0c19pc251bGxbYXR0bnVtIC0gMV07 CisgCiAgCQkJaWYgKCFjc3RhdGUtPm9wdHMuYmluYXJ5KQogIAkJCXsKISAJCQkJaWYgKG5l ZWRfZGVsaW0pCiEgCQkJCQlDb3B5U2VuZENoYXIoY3N0YXRlLCBjc3RhdGUtPm9wdHMuZGVs aW1bMF0pOwohIAkJCQluZWVkX2RlbGltID0gdHJ1ZTsKISAJCQl9CiEgCiEgCQkJaWYgKGlz bnVsbCkKISAJCQl7CiEgCQkJCWlmICghY3N0YXRlLT5vcHRzLmJpbmFyeSkKISAJCQkJCUNv cHlTZW5kU3RyaW5nKGNzdGF0ZSwgY3N0YXRlLT5vcHRzLm51bGxfcHJpbnRfY2xpZW50KTsK ICAJCQkJZWxzZQohIAkJCQkJQ29weVNlbmRJbnQzMihjc3RhdGUsIC0xKTsKICAJCQl9CiAg CQkJZWxzZQogIAkJCXsKISAJCQkJaWYgKCFjc3RhdGUtPm9wdHMuYmluYXJ5KQohIAkJCQl7 CiEgCQkJCQlzdHJpbmcgPSBPdXRwdXRGdW5jdGlvbkNhbGwoJm91dF9mdW5jdGlvbnNbYXR0 bnVtIC0gMV0sCiEgCQkJCQkJCQkJCQkJdmFsdWUpOwohIAkJCQkJaWYgKGNzdGF0ZS0+b3B0 cy5jc3ZfbW9kZSkKISAJCQkJCQlDb3B5QXR0cmlidXRlT3V0Q1NWKGNzdGF0ZSwgc3RyaW5n LAohIAkJCQkJCQkJCQkJY3N0YXRlLT5vcHRzLmZvcmNlX3F1b3RlX2ZsYWdzW2F0dG51bSAt IDFdLAohIAkJCQkJCQkJCQkJbGlzdF9sZW5ndGgoY3N0YXRlLT5hdHRudW1saXN0KSA9PSAx KTsKISAJCQkJCWVsc2UKISAJCQkJCQlDb3B5QXR0cmlidXRlT3V0VGV4dChjc3RhdGUsIHN0 cmluZyk7CiEgCQkJCX0KISAJCQkJZWxzZQohIAkJCQl7CiEgCQkJCQlieXRlYQkgICAqb3V0 cHV0Ynl0ZXM7CiAgCiEgCQkJCQlvdXRwdXRieXRlcyA9IFNlbmRGdW5jdGlvbkNhbGwoJm91 dF9mdW5jdGlvbnNbYXR0bnVtIC0gMV0sCiEgCQkJCQkJCQkJCQkJICAgdmFsdWUpOwohIAkJ CQkJQ29weVNlbmRJbnQzMihjc3RhdGUsIFZBUlNJWkUob3V0cHV0Ynl0ZXMpIC0gVkFSSERS U1opOwohIAkJCQkJQ29weVNlbmREYXRhKGNzdGF0ZSwgVkFSREFUQShvdXRwdXRieXRlcyks CiEgCQkJCQkJCQkgVkFSU0laRShvdXRwdXRieXRlcykgLSBWQVJIRFJTWik7CiEgCQkJCX0K ICAJCQl9CiAgCQl9CiAgCX0KKyAJZWxzZQorIAl7CisgCQlEYXR1bQlyb3dkYXRhID0gRXhl Y0ZldGNoU2xvdEhlYXBUdXBsZURhdHVtKHNsb3QpOworIAkJU3RyaW5nSW5mbwlyZXN1bHQ7 CisgCisgCQlyZXN1bHQgPSBtYWtlU3RyaW5nSW5mbygpOworIAkJY29tcG9zaXRlX3RvX2pz b24ocm93ZGF0YSwgcmVzdWx0LCBmYWxzZSk7CisgCisgCQlpZiAoanNvbl9yb3dfZGVsaW1f bmVlZGVkKQorIAkJCUNvcHlTZW5kQ2hhcihjc3RhdGUsICcsJyk7CisgCQllbHNlCisgCQl7 CisgCQkJLyogZmlyc3Qgcm93IG5lZWRzIG5vIGRlbGltaXRlciAqLworIAkJCUNvcHlTZW5k Q2hhcihjc3RhdGUsICcgJyk7CisgCQkJanNvbl9yb3dfZGVsaW1fbmVlZGVkID0gdHJ1ZTsK KyAJCX0KKyAKKyAJCUNvcHlBdHRyaWJ1dGVPdXRUZXh0KGNzdGF0ZSwgcmVzdWx0LT5kYXRh KTsKKyAJfQogIAogIAlDb3B5U2VuZEVuZE9mUm93KGNzdGF0ZSk7CiAgCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbi5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2pzb24uYwppbmRleCA3MWFlNTNmLi5jYjQzMTFlIDEwMDY0NAoqKiogYS9zcmMvYmFja2Vu ZC91dGlscy9hZHQvanNvbi5jCi0tLSBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29uLmMK KioqKioqKioqKioqKioqIHR5cGVkZWYgc3RydWN0IEpzb25BZ2dTdGF0ZQoqKiogODMsOTAg KioqKgogIAlKc29uVW5pcXVlQnVpbGRlclN0YXRlIHVuaXF1ZV9jaGVjazsKICB9IEpzb25B Z2dTdGF0ZTsKICAKLSBzdGF0aWMgdm9pZCBjb21wb3NpdGVfdG9fanNvbihEYXR1bSBjb21w b3NpdGUsIFN0cmluZ0luZm8gcmVzdWx0LAotIAkJCQkJCQkgIGJvb2wgdXNlX2xpbmVfZmVl ZHMpOwogIHN0YXRpYyB2b2lkIGFycmF5X2RpbV90b19qc29uKFN0cmluZ0luZm8gcmVzdWx0 LCBpbnQgZGltLCBpbnQgbmRpbXMsIGludCAqZGltcywKICAJCQkJCQkJICBEYXR1bSAqdmFs cywgYm9vbCAqbnVsbHMsIGludCAqdmFsY291bnQsCiAgCQkJCQkJCSAgSnNvblR5cGVDYXRl Z29yeSB0Y2F0ZWdvcnksIE9pZCBvdXRmdW5jb2lkLAotLS0gODMsODggLS0tLQoqKioqKioq KioqKioqKiogYXJyYXlfdG9fanNvbl9pbnRlcm5hbChEYXR1bSBhcnJheSwgU3RyaQoqKiog NDkwLDQ5NyAqKioqCiAgCiAgLyoKICAgKiBUdXJuIGEgY29tcG9zaXRlIC8gcmVjb3JkIGlu dG8gSlNPTi4KICAgKi8KISBzdGF0aWMgdm9pZAogIGNvbXBvc2l0ZV90b19qc29uKERhdHVt IGNvbXBvc2l0ZSwgU3RyaW5nSW5mbyByZXN1bHQsIGJvb2wgdXNlX2xpbmVfZmVlZHMpCiAg ewogIAlIZWFwVHVwbGVIZWFkZXIgdGQ7Ci0tLSA0ODgsNDk2IC0tLS0KICAKICAvKgogICAq IFR1cm4gYSBjb21wb3NpdGUgLyByZWNvcmQgaW50byBKU09OLgorICAqIEV4cG9ydGVkIHNv IENPUFkgVE8gY2FuIHVzZSBpdC4KICAgKi8KISB2b2lkCiAgY29tcG9zaXRlX3RvX2pzb24o RGF0dW0gY29tcG9zaXRlLCBTdHJpbmdJbmZvIHJlc3VsdCwgYm9vbCB1c2VfbGluZV9mZWVk cykKICB7CiAgCUhlYXBUdXBsZUhlYWRlciB0ZDsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L2NvbW1hbmRzL2NvcHkuaCBiL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHkuaAppbmRleCBm MmNjYTBiLi5lNjZiZDAxIDEwMDY0NAoqKiogYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5 LmgKLS0tIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvY29weS5oCioqKioqKioqKioqKioqKiB0 eXBlZGVmIHN0cnVjdCBDb3B5Rm9ybWF0T3B0aW9ucwoqKiogNDMsNDggKioqKgotLS0gNDMs NDkgLS0tLQogIAlib29sCQliaW5hcnk7CQkJLyogYmluYXJ5IGZvcm1hdD8gKi8KICAJYm9v bAkJZnJlZXplOwkJCS8qIGZyZWV6ZSByb3dzIG9uIGxvYWRpbmc/ICovCiAgCWJvb2wJCWNz dl9tb2RlOwkJLyogQ29tbWEgU2VwYXJhdGVkIFZhbHVlIGZvcm1hdD8gKi8KKyAJYm9vbAkJ anNvbl9tb2RlOwkJLyogSlNPTiBmb3JtYXQ/ICovCiAgCUNvcHlIZWFkZXJDaG9pY2UgaGVh ZGVyX2xpbmU7CS8qIGhlYWRlciBsaW5lPyAqLwogIAljaGFyCSAgICpudWxsX3ByaW50OwkJ LyogTlVMTCBtYXJrZXIgc3RyaW5nIChzZXJ2ZXIgZW5jb2RpbmchKSAqLwogIAlpbnQJCQlu dWxsX3ByaW50X2xlbjsgLyogbGVuZ3RoIG9mIHNhbWUgKi8KZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL3V0aWxzL2pzb24uaCBiL3NyYy9pbmNsdWRlL3V0aWxzL2pzb24uaAppbmRleCBm MDdlODJjLi5iYWRjNWE2IDEwMDY0NAoqKiogYS9zcmMvaW5jbHVkZS91dGlscy9qc29uLmgK LS0tIGIvc3JjL2luY2x1ZGUvdXRpbHMvanNvbi5oCioqKioqKioqKioqKioqKgoqKiogMTcs MjIgKioqKgotLS0gMTcsMjQgLS0tLQogICNpbmNsdWRlICJsaWIvc3RyaW5naW5mby5oIgog IAogIC8qIGZ1bmN0aW9ucyBpbiBqc29uLmMgKi8KKyBleHRlcm4gdm9pZCBjb21wb3NpdGVf dG9fanNvbihEYXR1bSBjb21wb3NpdGUsIFN0cmluZ0luZm8gcmVzdWx0LAorIAkJCQkJCQkg IGJvb2wgdXNlX2xpbmVfZmVlZHMpOwogIGV4dGVybiB2b2lkIGVzY2FwZV9qc29uKFN0cmlu Z0luZm8gYnVmLCBjb25zdCBjaGFyICpzdHIpOwogIGV4dGVybiBjaGFyICpKc29uRW5jb2Rl RGF0ZVRpbWUoY2hhciAqYnVmLCBEYXR1bSB2YWx1ZSwgT2lkIHR5cGlkLAogIAkJCQkJCQkJ Y29uc3QgaW50ICp0enApOwo= --------------E4UFsSc8t0EOC9YU2c318yDM--