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 1rsj9f-008sLH-Ix for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Apr 2024 12:58:52 +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 1rsj9e-00FKfo-MC for pgsql-hackers@arkaria.postgresql.org; Fri, 05 Apr 2024 12:58:50 +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 1rsj9e-00FKfg-4M for pgsql-hackers@lists.postgresql.org; Fri, 05 Apr 2024 12:58:50 +0000 Received: from dverite2024.planet-service.net ([185.16.44.252] helo=mail.verite.pro) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rsj9a-000kGX-OL for pgsql-hackers@postgresql.org; Fri, 05 Apr 2024 12:58:48 +0000 Received: by mail.verite.pro (Postfix, from userid 1000) id 36C222C0CC7; Fri, 5 Apr 2024 14:58:44 +0200 (CEST) MIME-Version: 1.0 Subject: Re: Fixing backslash dot for COPY FROM...CSV From: "Daniel Verite" To: "Tom Lane" Cc: "Robert Haas" ,pgsql-hackers@postgresql.org In-Reply-To: <1739536.1712087048@sss.pgh.pa.us> Date: Fri, 05 Apr 2024 14:58:39 +0200 Message-Id: <918e339c-c253-4366-847b-96f926ba46a0@manitou-mail.org> X-Mailer: Manitou v1.7.3 Content-type: multipart/mixed; boundary="----------=_1712321924-47309-1" 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... ------------=_1712321924-47309-1 Content-Type: text/plain; charset="iso-8859-15" Content-Disposition: inline Content-Transfer-Encoding: quoted-printable Tom Lane wrote: > I've looked over this patch and I generally agree that this is a > reasonable solution. Thanks for reviewing this! > I'm also wondering why the patch adds a test for > "PQprotocolVersion(conn) >=3D 3" in handleCopyIn.=20 I've removed this in the attached update. > I concur with Robert's doubts about some of the doc changes though. > In particular, since we're not changing the behavior for non-CSV > mode, we shouldn't remove any statements that apply to non-CSV mode. I don't quite understand the issues with the doc changes. Let me detail the changes. The first change is under=20 CSV Format so it does no concern non-CSV modes. --- a/doc/src/sgml/ref/copy.sgml +++ b/doc/src/sgml/ref/copy.sgml @@ -761,11 +761,7 @@ COPY count format, \., the end-of-data marker, could also appear as a data value. To avoid any misinterpretation, a \. data value appearing as a lone entry on a line is automatically - quoted on output, and on input, if quoted, is not interpreted as the - end-of-data marker. If you are loading a file created by another - application that has a single unquoted column and might have a - value of \., you might need to quote that value in the - input file. + quoted on output. The part about quoting output is kept because the code still does that. About this bit:=20=20 "and on input, if quoted, is not interpreted as the end-of-data marker." So the patch removes that part. The reason is \. is now not interpreted as EOD in both cases, quoted or unquoted, conforming to spec. Previously, what the reader should have understood by "if quoted, ..." is that it implies "if not quoted, then .\ will be interpreted as EOD even though that behavior does not conform to the CSV spec". If we documented the new behavior, it would be something like: when quoted, it works as expected, and when unquoted, it works as expected too. Isn't it simpler not to say anything? About the next sentence: "If you are loading a file created by another application that has a single unquoted column and might have a value of \., you might need to quote that value in the input file." It's removed as well because it's not longer necessary to do that. The other hunk is in psql doc: --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -1119,10 +1119,6 @@ INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g destination, because all data must pass through the client/server connection. For large amounts of data the SQL command might be preferable. - Also, because of this pass-through method, \copy - ... from in CSV mode will erroneously - treat a \. data value alone on a line as an - end-of-input marker. That behavior no longer happens, so this gets removed as well. Best regards, --=20 Daniel V=E9rit=E9 https://postgresql.verite.pro/ Twitter: @DanielVerite ------------=_1712321924-47309-1 Content-Type: text-x-patch; name="v4-0001-Support-backslash-dot-on-a-line-by-itself-as-vali.patch" Content-Disposition: attachment; filename="v4-0001-Support-backslash-dot-on-a-line-by-itself-as-vali.patch" Content-Transfer-Encoding: base64 RnJvbSA1YTE2YjgxZjEwZTQ3ZmUxYWMzODQyYWJkMzRlOGJlZjdlNjM5ZTI2 IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiA9P1VURi04P3E/RGFu aWVsPTIwVj1DMz1BOXJpdD1DMz1BOT89IDxkYW5pZWxAbWFuaXRvdS1tYWls Lm9yZz4KRGF0ZTogRnJpLCA1IEFwciAyMDI0IDE0OjIyOjQ5ICswMjAwClN1 YmplY3Q6IFtQQVRDSCB2NF0gU3VwcG9ydCBiYWNrc2xhc2gtZG90IG9uIGEg bGluZSBieSBpdHNlbGYgYXMgdmFsaWQgZGF0YSBpbgogQ09QWSBGUk9NLi4u Q1NWCgotLS0KIGRvYy9zcmMvc2dtbC9yZWYvY29weS5zZ21sICAgICAgICAg ICB8ICA2ICstLQogZG9jL3NyYy9zZ21sL3JlZi9wc3FsLXJlZi5zZ21sICAg ICAgIHwgIDQgLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFy c2UuYyB8IDU3ICsrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0KIHNyYy9i aW4vcHNxbC9jb3B5LmMgICAgICAgICAgICAgICAgICB8IDMwICsrKysrKysr KystLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dCAg IHwgMTggKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9jb3B5LnNx bCAgICAgICAgfCAxMiArKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgNjUgaW5z ZXJ0aW9ucygrKSwgNjIgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9j L3NyYy9zZ21sL3JlZi9jb3B5LnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVmL2Nv cHkuc2dtbAppbmRleCAzM2NlN2M0ZWE2Li5hNjNmMDczYzFiIDEwMDY0NAot LS0gYS9kb2Mvc3JjL3NnbWwvcmVmL2NvcHkuc2dtbAorKysgYi9kb2Mvc3Jj L3NnbWwvcmVmL2NvcHkuc2dtbApAQCAtODE0LDExICs4MTQsNyBAQCBDT1BZ IDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb3VudDwvcmVwbGFj ZWFibGU+CiAgICAgZm9ybWF0LCA8bGl0ZXJhbD5cLjwvbGl0ZXJhbD4sIHRo ZSBlbmQtb2YtZGF0YSBtYXJrZXIsIGNvdWxkIGFsc28gYXBwZWFyCiAgICAg YXMgYSBkYXRhIHZhbHVlLiAgVG8gYXZvaWQgYW55IG1pc2ludGVycHJldGF0 aW9uLCBhIDxsaXRlcmFsPlwuPC9saXRlcmFsPgogICAgIGRhdGEgdmFsdWUg YXBwZWFyaW5nIGFzIGEgbG9uZSBlbnRyeSBvbiBhIGxpbmUgaXMgYXV0b21h dGljYWxseQotICAgIHF1b3RlZCBvbiBvdXRwdXQsIGFuZCBvbiBpbnB1dCwg aWYgcXVvdGVkLCBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgdGhlCi0gICAgZW5k LW9mLWRhdGEgbWFya2VyLiAgSWYgeW91IGFyZSBsb2FkaW5nIGEgZmlsZSBj cmVhdGVkIGJ5IGFub3RoZXIKLSAgICBhcHBsaWNhdGlvbiB0aGF0IGhhcyBh IHNpbmdsZSB1bnF1b3RlZCBjb2x1bW4gYW5kIG1pZ2h0IGhhdmUgYQotICAg IHZhbHVlIG9mIDxsaXRlcmFsPlwuPC9saXRlcmFsPiwgeW91IG1pZ2h0IG5l ZWQgdG8gcXVvdGUgdGhhdCB2YWx1ZSBpbiB0aGUKLSAgICBpbnB1dCBmaWxl LgorICAgIHF1b3RlZCBvbiBvdXRwdXQuCiAgICA8L3BhcmE+CiAKICAgIDxu b3RlPgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3JlZi9wc3FsLXJlZi5z Z21sIGIvZG9jL3NyYy9zZ21sL3JlZi9wc3FsLXJlZi5zZ21sCmluZGV4IGNj N2Q3OTcxNTkuLmQ5NGUzY2FjZmMgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dt bC9yZWYvcHNxbC1yZWYuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3Bz cWwtcmVmLnNnbWwKQEAgLTExMTksMTAgKzExMTksNiBAQCBJTlNFUlQgSU5U TyB0YmwxIFZBTFVFUyAoJDEsICQyKSBcYmluZCAnZmlyc3QgdmFsdWUnICdz ZWNvbmQgdmFsdWUnIFxnCiAgICAgICAgIGRlc3RpbmF0aW9uLCBiZWNhdXNl IGFsbCBkYXRhIG11c3QgcGFzcyB0aHJvdWdoIHRoZSBjbGllbnQvc2VydmVy CiAgICAgICAgIGNvbm5lY3Rpb24uICBGb3IgbGFyZ2UgYW1vdW50cyBvZiBk YXRhIHRoZSA8YWNyb255bT5TUUw8L2Fjcm9ueW0+CiAgICAgICAgIGNvbW1h bmQgbWlnaHQgYmUgcHJlZmVyYWJsZS4KLSAgICAgICAgQWxzbywgYmVjYXVz ZSBvZiB0aGlzIHBhc3MtdGhyb3VnaCBtZXRob2QsIDxsaXRlcmFsPlxjb3B5 Ci0gICAgICAgIC4uLiBmcm9tPC9saXRlcmFsPiBpbiA8YWNyb255bT5DU1Y8 L2Fjcm9ueW0+IG1vZGUgd2lsbCBlcnJvbmVvdXNseQotICAgICAgICB0cmVh dCBhIDxsaXRlcmFsPlwuPC9saXRlcmFsPiBkYXRhIHZhbHVlIGFsb25lIG9u IGEgbGluZSBhcyBhbgotICAgICAgICBlbmQtb2YtaW5wdXQgbWFya2VyLgog ICAgICAgICA8L3BhcmE+CiAgICAgICAgIDwvdGlwPgogCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgYi9zcmMv YmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKaW5kZXggN2RkZDI3 ZjVjNi4uMmM2Y2U1ZTRmOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29t bWFuZHMvY29weWZyb21wYXJzZS5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHlmcm9tcGFyc2UuYwpAQCAtMTM2LDE0ICsxMzYsNiBAQCBpZiAo MSkgXAogCX0gXAogfSBlbHNlICgodm9pZCkgMCkKIAotLyogVW5kbyBhbnkg cmVhZC1haGVhZCBhbmQganVtcCBvdXQgb2YgdGhlIGJsb2NrLiAqLwotI2Rl ZmluZSBOT19FTkRfT0ZfQ09QWV9HT1RPIFwKLWlmICgxKSBcCi17IFwKLQlp bnB1dF9idWZfcHRyID0gcHJldl9yYXdfcHRyICsgMTsgXAotCWdvdG8gbm90 X2VuZF9vZl9jb3B5OyBcCi19IGVsc2UgKCh2b2lkKSAwKQotCiAvKiBOT1RF OiB0aGVyZSdzIGEgY29weSBvZiB0aGlzIGluIGNvcHl0by5jICovCiBzdGF0 aWMgY29uc3QgY2hhciBCaW5hcnlTaWduYXR1cmVbMTFdID0gIlBHQ09QWVxu XDM3N1xyXG5cMCI7CiAKQEAgLTExODIsNyArMTE3NCw2IEBAIENvcHlSZWFk TGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUpCiAJYm9vbAkJcmVzdWx0 ID0gZmFsc2U7CiAKIAkvKiBDU1YgdmFyaWFibGVzICovCi0JYm9vbAkJZmly c3RfY2hhcl9pbl9saW5lID0gdHJ1ZTsKIAlib29sCQlpbl9xdW90ZSA9IGZh bHNlLAogCQkJCWxhc3Rfd2FzX2VzYyA9IGZhbHNlOwogCWNoYXIJCXF1b3Rl YyA9ICdcMCc7CkBAIC0xMzgwLDEwICsxMzcxLDkgQEAgQ29weVJlYWRMaW5l VGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAkJfQogCiAJCS8qCi0JCSAq IEluIENTViBtb2RlLCB3ZSBvbmx5IHJlY29nbml6ZSBcLiBhbG9uZSBvbiBh IGxpbmUuICBUaGlzIGlzIGJlY2F1c2UKLQkJICogXC4gaXMgYSB2YWxpZCBD U1YgZGF0YSB2YWx1ZS4KKwkJICogSW4gQ1NWIG1vZGUsIGJhY2tzbGFzaCBp cyBhIG5vcm1hbCBjaGFyYWN0ZXIuCiAJCSAqLwotCQlpZiAoYyA9PSAnXFwn ICYmICghY3N0YXRlLT5vcHRzLmNzdl9tb2RlIHx8IGZpcnN0X2NoYXJfaW5f bGluZSkpCisJCWlmIChjID09ICdcXCcgJiYgIWNzdGF0ZS0+b3B0cy5jc3Zf bW9kZSkKIAkJewogCQkJY2hhcgkJYzI7CiAKQEAgLTE0MTYsMjEgKzE0MDYs MTUgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSkK IAogCQkJCQlpZiAoYzIgPT0gJ1xuJykKIAkJCQkJewotCQkJCQkJaWYgKCFj c3RhdGUtPm9wdHMuY3N2X21vZGUpCi0JCQkJCQkJZXJlcG9ydChFUlJPUiwK LQkJCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JN QVQpLAotCQkJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkgbWFya2VyIGRv ZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUgc3R5bGUiKSkpOwotCQkJ CQkJZWxzZQotCQkJCQkJCU5PX0VORF9PRl9DT1BZX0dPVE87CisJCQkJCQll cmVwb3J0KEVSUk9SLAorCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9D T1BZX0ZJTEVfRk9STUFUKSwKKwkJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNv cHkgbWFya2VyIGRvZXMgbm90IG1hdGNoIHByZXZpb3VzIG5ld2xpbmUgc3R5 bGUiKSkpOwogCQkJCQl9CiAJCQkJCWVsc2UgaWYgKGMyICE9ICdccicpCiAJ CQkJCXsKLQkJCQkJCWlmICghY3N0YXRlLT5vcHRzLmNzdl9tb2RlKQotCQkJ CQkJCWVyZXBvcnQoRVJST1IsCi0JCQkJCQkJCQkoZXJyY29kZShFUlJDT0RF X0JBRF9DT1BZX0ZJTEVfRk9STUFUKSwKLQkJCQkJCQkJCSBlcnJtc2coImVu ZC1vZi1jb3B5IG1hcmtlciBjb3JydXB0IikpKTsKLQkJCQkJCWVsc2UKLQkJ CQkJCQlOT19FTkRfT0ZfQ09QWV9HT1RPOworCQkJCQkJZXJlcG9ydChFUlJP UiwKKwkJCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9CQURfQ09QWV9GSUxFX0ZP Uk1BVCksCisJCQkJCQkJCSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBj b3JydXB0IikpKTsKIAkJCQkJfQogCQkJCX0KIApAQCAtMTQ0MSwxMiArMTQy NSw5IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUp CiAKIAkJCQlpZiAoYzIgIT0gJ1xyJyAmJiBjMiAhPSAnXG4nKQogCQkJCXsK LQkJCQkJaWYgKCFjc3RhdGUtPm9wdHMuY3N2X21vZGUpCi0JCQkJCQllcmVw b3J0KEVSUk9SLAotCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0JBRF9DT1BZ X0ZJTEVfRk9STUFUKSwKLQkJCQkJCQkJIGVycm1zZygiZW5kLW9mLWNvcHkg bWFya2VyIGNvcnJ1cHQiKSkpOwotCQkJCQllbHNlCi0JCQkJCQlOT19FTkRf T0ZfQ09QWV9HT1RPOworCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCShl cnJjb2RlKEVSUkNPREVfQkFEX0NPUFlfRklMRV9GT1JNQVQpLAorCQkJCQkJ CSBlcnJtc2coImVuZC1vZi1jb3B5IG1hcmtlciBjb3JydXB0IikpKTsKIAkJ CQl9CiAKIAkJCQlpZiAoKGNzdGF0ZS0+ZW9sX3R5cGUgPT0gRU9MX05MICYm IGMyICE9ICdcbicpIHx8CkBAIC0xNDcwLDcgKzE0NTEsNyBAQCBDb3B5UmVh ZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlKQogCQkJCXJlc3VsdCA9 IHRydWU7CS8qIHJlcG9ydCBFT0YgKi8KIAkJCQlicmVhazsKIAkJCX0KLQkJ CWVsc2UgaWYgKCFjc3RhdGUtPm9wdHMuY3N2X21vZGUpCisJCQllbHNlCiAJ CQl7CiAJCQkJLyoKIAkJCQkgKiBJZiB3ZSBhcmUgaGVyZSwgaXQgbWVhbnMg d2UgZm91bmQgYSBiYWNrc2xhc2ggZm9sbG93ZWQgYnkKQEAgLTE0NzgsMjMg KzE0NTksMTEgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNz dGF0ZSkKIAkJCQkgKiBhZnRlciBhIGJhY2tzbGFzaCBpcyBzcGVjaWFsLCBz byB3ZSBza2lwIG92ZXIgdGhhdCBzZWNvbmQKIAkJCQkgKiBjaGFyYWN0ZXIg dG9vLiAgSWYgd2UgZGlkbid0IGRvIHRoYXQgXFwuIHdvdWxkIGJlCiAJCQkJ ICogY29uc2lkZXJlZCBhbiBlb2Ytb2YgY29weSwgd2hpbGUgaW4gbm9uLUNT ViBtb2RlIGl0IGlzIGEKLQkJCQkgKiBsaXRlcmFsIGJhY2tzbGFzaCBmb2xs b3dlZCBieSBhIHBlcmlvZC4gIEluIENTViBtb2RlLAotCQkJCSAqIGJhY2tz bGFzaGVzIGFyZSBub3Qgc3BlY2lhbCwgc28gd2Ugd2FudCB0byBwcm9jZXNz IHRoZQotCQkJCSAqIGNoYXJhY3RlciBhZnRlciB0aGUgYmFja3NsYXNoIGp1 c3QgbGlrZSBhIG5vcm1hbCBjaGFyYWN0ZXIsCi0JCQkJICogc28gd2UgZG9u J3QgaW5jcmVtZW50IGluIHRob3NlIGNhc2VzLgorCQkJCSAqIGxpdGVyYWwg YmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgcGVyaW9kLgogCQkJCSAqLwogCQkJ CWlucHV0X2J1Zl9wdHIrKzsKIAkJCX0KIAkJfQotCi0JCS8qCi0JCSAqIFRo aXMgbGFiZWwgaXMgZm9yIENTViBjYXNlcyB3aGVyZSBcLiBhcHBlYXJzIGF0 IHRoZSBzdGFydCBvZiBhCi0JCSAqIGxpbmUsIGJ1dCB0aGVyZSBpcyBtb3Jl IHRleHQgYWZ0ZXIgaXQsIG1lYW5pbmcgaXQgd2FzIGEgZGF0YSB2YWx1ZS4K LQkJICogV2UgYXJlIG1vcmUgc3RyaWN0IGZvciBcLiBpbiBDU1YgbW9kZSBi ZWNhdXNlIFwuIGNvdWxkIGJlIGEgZGF0YQotCQkgKiB2YWx1ZSwgd2hpbGUg aW4gbm9uLUNTViBtb2RlLCBcLiBjYW5ub3QgYmUgYSBkYXRhIHZhbHVlLgot CQkgKi8KLW5vdF9lbmRfb2ZfY29weToKLQkJZmlyc3RfY2hhcl9pbl9saW5l ID0gZmFsc2U7CiAJfQkJCQkJCQkvKiBlbmQgb2Ygb3V0ZXIgbG9vcCAqLwog CiAJLyoKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcHNxbC9jb3B5LmMgYi9zcmMv YmluL3BzcWwvY29weS5jCmluZGV4IDk2MWFlMzI2OTQuLmEzOTgxOGIxOTMg MTAwNjQ0Ci0tLSBhL3NyYy9iaW4vcHNxbC9jb3B5LmMKKysrIGIvc3JjL2Jp bi9wc3FsL2NvcHkuYwpAQCAtNjIwLDIwICs2MjAsMzIgQEAgaGFuZGxlQ29w eUluKFBHY29ubiAqY29ubiwgRklMRSAqY29weXN0cmVhbSwgYm9vbCBpc2Jp bmFyeSwgUEdyZXN1bHQgKipyZXMpCiAJCQkJLyogY3VycmVudCBsaW5lIGlz IGRvbmU/ICovCiAJCQkJaWYgKGJ1ZltidWZsZW4gLSAxXSA9PSAnXG4nKQog CQkJCXsKLQkJCQkJLyogY2hlY2sgZm9yIEVPRiBtYXJrZXIsIGJ1dCBub3Qg b24gYSBwYXJ0aWFsIGxpbmUgKi8KLQkJCQkJaWYgKGF0X2xpbmVfYmVnaW4p CisJCQkJCS8qCisJCQkJCSAqIFdoZW4gYXQgdGhlIGJlZ2lubmluZyBvZiB0 aGUgbGluZSwgY2hlY2sgZm9yIEVPRiBtYXJrZXIuCisJCQkJCSAqIElmIHRo ZSBtYXJrZXIgaXMgZm91bmQgYW5kIHRoZSBkYXRhIGlzIGlubGluZWQsCisJ CQkJCSAqIHdlIG11c3Qgc3RvcCBhdCB0aGlzIHBvaW50LiAgSWYgbm90LCB0 aGUgXC4gbGluZSBjYW4gYmUKKwkJCQkJICogc2VudCB0byB0aGUgc2VydmVy LCBhbmQgd2UgbGV0IGl0IGRlY2lkZSB3aGV0aGVyCisJCQkJCSAqIGl0J3Mg YW4gRU9GIG9yIG5vdCBkZXBlbmRpbmcgb24gdGhlIGZvcm1hdDogaW4KKwkJ CQkJICogYmFzaWMgVEVYVCwgXC4gaXMgZ29pbmcgdG8gYmUgaW50ZXJwcmV0 ZWQgYXMgYW4gRU9GLCBpbgorCQkJCQkgKiBDU1YsIGl0IHdpbGwgbm90Lgor CQkJCQkgKi8KKwkJCQkJaWYgKGF0X2xpbmVfYmVnaW4gJiYgY29weXN0cmVh bSA9PSBwc2V0LmN1cl9jbWRfc291cmNlKQogCQkJCQl7Ci0JCQkJCQkvKgot CQkJCQkJICogVGhpcyBjb2RlIGVycm9uZW91c2x5IGFzc3VtZXMgJ1wuJyBv biBhIGxpbmUgYWxvbmUKLQkJCQkJCSAqIGluc2lkZSBhIHF1b3RlZCBDU1Yg c3RyaW5nIHRlcm1pbmF0ZXMgdGhlIFxjb3B5LgotCQkJCQkJICogaHR0cHM6 Ly93d3cucG9zdGdyZXNxbC5vcmcvbWVzc2FnZS1pZC9FMVRkTlZRLTAwMDFq dS1HT0B3cmlnbGV5cy5wb3N0Z3Jlc3FsLm9yZwotCQkJCQkJICoKLQkJCQkJ CSAqIGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvYmZj ZDU3ZTQtOGYyMy00YzNlLWE1ZGItMjU3MWQwOTIwOGUyQGJldGEuZmFzdG1h aWwuY29tCi0JCQkJCQkgKi8KIAkJCQkJCWlmICgobGluZWxlbiA9PSAzICYm IG1lbWNtcChmZ3Jlc3VsdCwgIlxcLlxuIiwgMykgPT0gMCkgfHwKIAkJCQkJ CQkobGluZWxlbiA9PSA0ICYmIG1lbWNtcChmZ3Jlc3VsdCwgIlxcLlxyXG4i LCA0KSA9PSAwKSkKIAkJCQkJCXsKIAkJCQkJCQljb3B5ZG9uZSA9IHRydWU7 CisJCQkJCQkJLyoKKwkJCQkJCQkgKiBSZW1vdmUgdGhlIEVPRiBtYXJrZXIg ZnJvbSB0aGUgZGF0YSBzZW50LgorCQkJCQkJCSAqIEluIHRoZSBjYXNlIG9m IENTViwgdGhlIEVPRiBtYXJrZXIgbXVzdCBiZQorCQkJCQkJCSAqIHJlbW92 ZWQsIG90aGVyd2lzZSBpdCB3b3VsZCBiZSBpbnRlcnByZXRlZCBieQorCQkJ CQkJCSAqIHRoZSBzZXJ2ZXIgYXMgdmFsaWQgZGF0YS4KKwkJCQkJCQkgKi8K KwkJCQkJCQlpZiAoY29weXN0cmVhbSA9PSBwc2V0LmN1cl9jbWRfc291cmNl KQorCQkJCQkJCXsKKwkJCQkJCQkJKmZncmVzdWx0PSdcMCc7CisJCQkJCQkJ CWJ1ZmxlbiAtPSBsaW5lbGVuOworCQkJCQkJCX0KIAkJCQkJCX0KIAkJCQkJ fQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2Nv cHkub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb3B5Lm91dApp bmRleCBiNDgzNjVlYzk4Li42NDVlODQ5YmJkIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvcHkub3V0CisrKyBiL3NyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvY29weS5vdXQKQEAgLTMyLDYgKzMyLDI0IEBA IHNlbGVjdCAqIGZyb20gY29weXRlc3QgZXhjZXB0IHNlbGVjdCAqIGZyb20g Y29weXRlc3QyOwogLS0tLS0tLSstLS0tLS0rLS0tLS0tLS0KICgwIHJvd3Mp CiAKKy0tLSB0ZXN0IHVucXVvdGVkIFwuIGFzIGRhdGEgaW5zaWRlIENTVgor LS0gZG8gbm90IHVzZSBjb3B5IG91dCB0byBleHBvcnQgdGhlIGRhdGEsIGFz IGl0IHdvdWxkIHF1b3RlIFwuCitcbyA6ZmlsZW5hbWUKK1xxZWNobyBsaW5l MQorXHFlY2hvICdcXC4nCitccWVjaG8gbGluZTIKK1xvCistLSBnZXQgdGhl IGRhdGEgYmFjayBpbiB3aXRoIGNvcHkKK3RydW5jYXRlIGNvcHl0ZXN0MjsK K2NvcHkgY29weXRlc3QyKHRlc3QpIGZyb20gOidmaWxlbmFtZScgY3N2Owor c2VsZWN0IHRlc3QgZnJvbSBjb3B5dGVzdDIgb3JkZXIgYnkgdGVzdCBjb2xs YXRlICJDIjsKKyB0ZXN0ICAKKy0tLS0tLS0KKyBcLgorIGxpbmUxCisgbGlu ZTIKKygzIHJvd3MpCisKIC0tIHRlc3QgaGVhZGVyIGxpbmUgZmVhdHVyZQog Y3JlYXRlIHRlbXAgdGFibGUgY29weXRlc3QzICgKIAljMSBpbnQsCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb3B5LnNxbCBiL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsCmluZGV4IDQzZDJlOTA2ZGQuLjY4 YTU4NzQwY2IgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2Nv cHkuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvcHkuc3FsCkBA IC0zOCw2ICszOCwxOCBAQCBjb3B5IGNvcHl0ZXN0MiBmcm9tIDonZmlsZW5h bWUnIGNzdiBxdW90ZSAnJycnIGVzY2FwZSBFJ1xcJzsKIAogc2VsZWN0ICog ZnJvbSBjb3B5dGVzdCBleGNlcHQgc2VsZWN0ICogZnJvbSBjb3B5dGVzdDI7 CiAKKy0tLSB0ZXN0IHVucXVvdGVkIFwuIGFzIGRhdGEgaW5zaWRlIENTVgor LS0gZG8gbm90IHVzZSBjb3B5IG91dCB0byBleHBvcnQgdGhlIGRhdGEsIGFz IGl0IHdvdWxkIHF1b3RlIFwuCitcbyA6ZmlsZW5hbWUKK1xxZWNobyBsaW5l MQorXHFlY2hvICdcXC4nCitccWVjaG8gbGluZTIKK1xvCistLSBnZXQgdGhl IGRhdGEgYmFjayBpbiB3aXRoIGNvcHkKK3RydW5jYXRlIGNvcHl0ZXN0MjsK K2NvcHkgY29weXRlc3QyKHRlc3QpIGZyb20gOidmaWxlbmFtZScgY3N2Owor c2VsZWN0IHRlc3QgZnJvbSBjb3B5dGVzdDIgb3JkZXIgYnkgdGVzdCBjb2xs YXRlICJDIjsKKwogCiAtLSB0ZXN0IGhlYWRlciBsaW5lIGZlYXR1cmUKIAot LSAKMi4zNC4xCgo= ------------=_1712321924-47309-1--