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 1sXTUC-004Ebn-V7 for pgsql-hackers@arkaria.postgresql.org; Fri, 26 Jul 2024 22:32:29 +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 1sXTUB-000iSO-7V for pgsql-hackers@arkaria.postgresql.org; Fri, 26 Jul 2024 22:32:27 +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 1sXTUA-000iSG-NY for pgsql-hackers@lists.postgresql.org; Fri, 26 Jul 2024 22:32:26 +0000 Received: from mail-pg1-x529.google.com ([2607:f8b0:4864:20::529]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sXTU6-001eMx-EH for pgsql-hackers@postgresql.org; Fri, 26 Jul 2024 22:32:25 +0000 Received: by mail-pg1-x529.google.com with SMTP id 41be03b00d2f7-7aa7703cf08so1128260a12.2 for ; Fri, 26 Jul 2024 15:32:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=illuminatedcomputing-com.20230601.gappssmtp.com; s=20230601; t=1722033140; x=1722637940; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=YF0Rial805YxJ538qBwu+qQe8yYMnt7vsehsNIlT29E=; b=0W+/4Qh0tqncau1kw+P3Sbaa0vxwNyBX7Qm8Hx5jmaD/pLsHz2vUzpf2PVxcsx5YLb Hv0/BjJWEQgVpD8odpuqV5DT0wfN2h8wb1UuWF83c4LHUTz58mMwOuvAJtJrrvfJ42Mz SM1X2/cp7erw4LVUyY+dlyx07zMEHR/dHyPlD3yKlKA/yQqWLB7qZ2C2NwoRHJLVLbKc t5hIBakShe+HfEem47ldbjZB8mTIIT9VR6+vXa4w8iA55eLa1O5mNJav+e0NtG33AEOe JE6oGwJdjV2ffdj9gj6goyntbQIKcp8ptaSxWjQpP00IlqqT0z0Kx+JJJgRDP1Rr40Aq RM0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722033140; x=1722637940; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YF0Rial805YxJ538qBwu+qQe8yYMnt7vsehsNIlT29E=; b=pJnUtMrTjbm/KlcF/YjOg63hpy5rjxMgurXcQ7cqP1/306fjkHg8LWcPUd0K0EU2zf LrSJVvI9DOjWyMqp3IG+af/kCCCqz9YYcVwZBE30ltZjnVtSADUpR+U9Hn5NtlOenE40 4ObN53ZHkFxeN3maI/XQnU0iWIsBHr381C4JYj22kAevlkNHqFDbcG8OHMEKWqspUegn alItQsgwwsIAlPvjThPIG6AyuR+sbXNP/kaKbwkSdQMXNXAyTRdr4+MBt3uhwRNFRIi2 vyvNV6IfE4a5+KDVtiatK9bI7OaxtwIF2qk+qTPwxtebmFUTbxHgrxkPf+F8/0Fdi5Yd 23jw== X-Gm-Message-State: AOJu0YzjnAJwySL+MUM//qvvivuLiMrI9pkUNce7koazTq/pj2G5l57H prCJBKEQb/FGRzgB0JLBf4eV0c2BS1Yk6YszKAxv+WjIPWlcMTv8oKjyfdBI3TAC1rYH+ggP5By AphJK32H+N6iLnANf3CEOTwPMQ2ALxorBKAHGmw== X-Google-Smtp-Source: AGHT+IGlre2pqyIVKo1CmLX0hWq3TnEFMkRXe5OXk2x5fntIVqCSXDi29ILbQZ7VZZW/pDndqPE4Lw6naZjvfijVOE8= X-Received: by 2002:a17:90b:885:b0:2c9:719f:b04b with SMTP id 98e67ed59e1d1-2cf7e5c1859mr992809a91.29.1722033139914; Fri, 26 Jul 2024 15:32:19 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Paul A Jungwirth Date: Fri, 26 Jul 2024 15:32:08 -0700 Message-ID: Subject: Re: Support LIKE with nondeterministic collations To: Peter Eisentraut Cc: pgsql-hackers , Daniel Verite Content-Type: multipart/mixed; boundary="00000000000098cf0e061e2e15ca" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000098cf0e061e2e15ca Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Jun 27, 2024 at 11:31=E2=80=AFPM Peter Eisentraut wrote: > Here is an updated patch for this. I took a look at this. I added some tests and found a few that give the wrong result (I believe). The new tests are included in the attached patch, along with the results I expect. Here are the failures: -- inner %% matches b then zero: SELECT U&'cb\0061\0308' LIKE U&'c%%\00E4' COLLATE ignore_accents; ?column? ---------- - t + f (1 row) -- trailing _ matches two codepoints that form one char: SELECT U&'cb\0061\0308' LIKE U&'cb_' COLLATE ignore_accents; ?column? ---------- - t + f (1 row) -- leading % matches zero: SELECT U&'\0061\0308bc' LIKE U&'%\00E4bc' COLLATE ignore_accents; ?column? ---------- - t + f (1 row) -- leading % matches zero (with later %): SELECT U&'\0061\0308bc' LIKE U&'%\00E4%c' COLLATE ignore_accents; ?column? ---------- - t + f (1 row) I think the 1st, 3rd, and 4th failures are all from % not backtracking to match zero chars. The 2nd failure I'm not sure about. Maybe my expectation is wrong, but then why does the same test pass with __ leading not trailing? Surely they should be consistent. > I have added some more documentation based on the discussions, including > some examples taken directly from the emails here. This looks good to me. > One thing I have been struggling with a bit is the correct use of > LIKE_FALSE versus LIKE_ABORT in the MatchText() code. I have made some > small tweaks about this in this version that I think are more correct, > but it could use another look. Maybe also some more tests to verify > this one way or the other. I haven't looked at this yet. Yours, --=20 Paul ~{:-) pj@illuminatedcomputing.com --00000000000098cf0e061e2e15ca Content-Type: application/octet-stream; name="v3-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Disposition: attachment; filename="v3-0001-Support-LIKE-with-nondeterministic-collations.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lz39v51j0 RnJvbSBiNDIxYzY1ZmQ1MzkxZTlmMjc3NGZlY2Q1NTI5MzU4YzYxMDExNmJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQZXRlciBFaXNlbnRyYXV0IDxwZXRlckBlaXNlbnRyYXV0Lm9y Zz4KRGF0ZTogRnJpLCAyOCBKdW4gMjAyNCAwNjo1NTo0NSArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djNdIFN1cHBvcnQgTElLRSB3aXRoIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9ucwpNSU1FLVZl cnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgKQ29udGVu dC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhpcyBhbGxvd3MgZm9yIGV4YW1wbGUgdXNpbmcg TElLRSB3aXRoIGNhc2UtaW5zZW5zaXRpdmUgY29sbGF0aW9ucy4KVGhlcmUgd2FzIHByZXZpb3Vz bHkgbm8gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgdGhpcywgc28gaXQgd2FzIG1ldAp3aXRo IGEgbm90LXN1cHBvcnRlZCBlcnJvci4gIFRoaXMgYWRkcyB0aGUgaW50ZXJuYWwgaW1wbGVtZW50 YXRpb24gYW5kCnJlbW92ZXMgdGhlIGVycm9yLgoKVW5saWtlIHdpdGggZGV0ZXJtaW5pc3RpYyBj b2xsYXRpb25zLCB0aGUgTElLRSBtYXRjaGluZyBjYW5ub3QgZ28KY2hhcmFjdGVyIGJ5IGNoYXJh Y3RlciBidXQgaGFzIHRvIGdvIHN1YnN0cmluZyBieSBzdWJzdHJpbmcuICBGb3IKZXhhbXBsZSwg aWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgTElLRSAnZm9vJWJhcicsIHdlIGNhbid0IHN0YXJ0 IGJ5Cmxvb2tpbmcgZm9yIGFuICdmJywgdGhlbiBhbiAnbycsIGJ1dCBpbnN0ZWFkIHdpdGggaGF2 ZSB0byBmaW5kCnNvbWV0aGluZyB0aGF0IG1hdGNoZXMgJ2ZvbycuICBUaGlzIGlzIGJlY2F1c2Ug dGhlIGNvbGxhdGlvbiBjb3VsZApjb25zaWRlciBzdWJzdHJpbmdzIG9mIGRpZmZlcmVudCBsZW5n dGhzIHRvIGJlIGVxdWFsLiAgVGhpcyBpcyBhbGwKaW50ZXJuYWwgdG8gTWF0Y2hUZXh0KCkgaW4g bGlrZV9tYXRjaC5jLgoKVGhlIGNoYW5nZXMgaW4gR2VuZXJpY01hdGNoVGV4dCgpIGluIGxpa2Uu YyBqdXN0IHBhc3MgdGhyb3VnaCB0aGUKbG9jYWxlIGluZm9ybWF0aW9uIHRvIE1hdGNoVGV4dCgp LCB3aGljaCB3YXMgcHJldmlvdXNseSBub3QgbmVlZGVkLgpUaGlzIG1hdGNoZXMgZXhhY3RseSBH ZW5lcmljX1RleHRfSUNfbGlrZSgpIGJlbG93LgoKTm90ZSB0aGF0IElMSUtFIGlzIG5vdCBhZmZl Y3RlZC4gIEl0J3MgdW5jbGVhciB3aGV0aGVyIElMSUtFIG1ha2VzCnNlbnNlIHVuZGVyIG5vbmRl dGVybWluaXN0aWMgY29sbGF0aW9ucy4KClRoaXMgYWxzbyB1cGRhdGVzIG1hdGNoX3BhdHRlcm5f cHJlZml4KCkgaW4gbGlrZV9zdXBwb3J0LmMgdG8gc3VwcG9ydApvcHRpbWl6aW5nIHRoZSBjYXNl IG9mIGFuIGV4YWN0IHBhdHRlcm4gd2l0aCBub25kZXRlcm1pbmlzdGljCmNvbGxhdGlvbnMuICBU aGlzIHdhcyBhbHJlYWR5IGFsbHVkZWQgdG8gaW4gdGhlIHByZXZpb3VzIGNvZGUuCgooaW5jbHVk ZXMgZG9jdW1lbnRhdGlvbiBleGFtcGxlcyBmcm9tIERhbmllbCBWw6lyaXTDqSkKCkRpc2N1c3Np b246IGh0dHBzOi8vd3d3LnBvc3RncmVzcWwub3JnL21lc3NhZ2UtaWQvZmxhdC83MDBkMmU4Ni1i Zjc1LTQ2MDctOWNmMi1mNWI3ODAyZjZlODhAZWlzZW50cmF1dC5vcmcKLS0tCiBkb2Mvc3JjL3Nn bWwvY2hhcnNldC5zZ21sICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIGRvYy9zcmMvc2dt bC9mdW5jLnNnbWwgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MSArKysrLQogc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2xpa2UuYyAgICAgICAgICAgICAgICAgIHwgIDMwICsrLQogc3JjL2JhY2tl bmQvdXRpbHMvYWR0L2xpa2VfbWF0Y2guYyAgICAgICAgICAgIHwgMTE4ICsrKysrKysrKysrKwog c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2Vfc3VwcG9ydC5jICAgICAgICAgIHwgIDI5ICsrLQog Li4uL3JlZ3Jlc3MvZXhwZWN0ZWQvY29sbGF0ZS5pY3UudXRmOC5vdXQgICAgIHwgMTc5ICsrKysr KysrKysrKysrKysrLQogc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRmOC5zcWwg ICAgIHwgIDUxICsrKystCiA3IGZpbGVzIGNoYW5nZWQsIDQxOCBpbnNlcnRpb25zKCspLCA0MiBk ZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvY2hhcnNldC5zZ21sIGIvZG9j L3NyYy9zZ21sL2NoYXJzZXQuc2dtbAppbmRleCA4MzRjYjMwYzg1YS4uNTMzYjNhZjkwNDUgMTAw NjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jaGFyc2V0LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2No YXJzZXQuc2dtbApAQCAtMTE5Nyw3ICsxMTk3LDcgQEAgQ1JFQVRFIENPTExBVElPTiBpZ25vcmVf YWNjZW50cyAocHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICd1bmQtdS1rcy1sZXZlbDEta2MtdHIK ICAgICAgdG8gYSBwZXJmb3JtYW5jZSBwZW5hbHR5LiAgTm90ZSwgaW4gcGFydGljdWxhciwgdGhh dCBCLXRyZWUgY2Fubm90IHVzZQogICAgICBkZWR1cGxpY2F0aW9uIHdpdGggaW5kZXhlcyB0aGF0 IHVzZSBhIG5vbmRldGVybWluaXN0aWMgY29sbGF0aW9uLiAgQWxzbywKICAgICAgY2VydGFpbiBv cGVyYXRpb25zIGFyZSBub3QgcG9zc2libGUgd2l0aCBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlv bnMsCi0gICAgIHN1Y2ggYXMgcGF0dGVybiBtYXRjaGluZyBvcGVyYXRpb25zLiAgVGhlcmVmb3Jl LCB0aGV5IHNob3VsZCBiZSB1c2VkCisgICAgIHN1Y2ggYXMgc29tZSBwYXR0ZXJuIG1hdGNoaW5n IG9wZXJhdGlvbnMuICBUaGVyZWZvcmUsIHRoZXkgc2hvdWxkIGJlIHVzZWQKICAgICAgb25seSBp biBjYXNlcyB3aGVyZSB0aGV5IGFyZSBzcGVjaWZpY2FsbHkgd2FudGVkLgogICAgIDwvcGFyYT4K IApkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5j LnNnbWwKaW5kZXggYjY2OWFiN2Y5NzcuLjU0YjdiMWM4MzcyIDEwMDY0NAotLS0gYS9kb2Mvc3Jj L3NnbWwvZnVuYy5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKQEAgLTUzODAsOSAr NTM4MCwxMCBAQCBjYXN0KC00NCBhcyBiaXQoMTIpKSAgICAgICAgICAgPGxpbmVhbm5vdGF0aW9u PjExMTExMTAxMDEwMDwvbGluZWFubm90YXRpb24+CiAgICA8L2NhdXRpb24+CiAKICAgIDxwYXJh PgotICAgIFRoZSBwYXR0ZXJuIG1hdGNoaW5nIG9wZXJhdG9ycyBvZiBhbGwgdGhyZWUga2luZHMg ZG8gbm90IHN1cHBvcnQKLSAgICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMuICBJZiByZXF1 aXJlZCwgYXBwbHkgYSBkaWZmZXJlbnQgY29sbGF0aW9uIHRvCi0gICAgdGhlIGV4cHJlc3Npb24g dG8gd29yayBhcm91bmQgdGhpcyBsaW1pdGF0aW9uLgorICAgIDxmdW5jdGlvbj5TSU1JTEFSIFRP PC9mdW5jdGlvbj4gYW5kIDxhY3JvbnltPlBPU0lYPC9hY3JvbnltPi1zdHlsZSByZWd1bGFyCisg ICAgZXhwcmVzc2lvbnMgZG8gbm90IHN1cHBvcnQgbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25z LiAgSWYgcmVxdWlyZWQsIHVzZQorICAgIDxmdW5jdGlvbj5MSUtFPC9mdW5jdGlvbj4gb3IgYXBw bHkgYSBkaWZmZXJlbnQgY29sbGF0aW9uIHRvIHRoZSBleHByZXNzaW9uCisgICAgdG8gd29yayBh cm91bmQgdGhpcyBsaW1pdGF0aW9uLgogICAgPC9wYXJhPgogCiAgIDxzZWN0MiBpZD0iZnVuY3Rp b25zLWxpa2UiPgpAQCAtNTQyOCw2ICs1NDI5LDQ1IEBAIGNhc3QoLTQ0IGFzIGJpdCgxMikpICAg ICAgICAgICA8bGluZWFubm90YXRpb24+MTExMTExMDEwMTAwPC9saW5lYW5ub3RhdGlvbj4KIDwv cHJvZ3JhbWxpc3Rpbmc+CiAgICA8L3BhcmE+CiAKKyAgIDxwYXJhPgorICAgIDxmdW5jdGlvbj5M SUtFPC9mdW5jdGlvbj4gcGF0dGVybiBtYXRjaGluZyBzdXBwb3J0cyBub25kZXRlcm1pbmlzdGlj CisgICAgY29sbGF0aW9ucyAoc2VlIDx4cmVmIGxpbmtlbmQ9ImNvbGxhdGlvbi1ub25kZXRlcm1p bmlzdGljIi8+KSwgc3VjaCBhcworICAgIGNhc2UtaW5zZW5zaXRpdmUgY29sbGF0aW9ucyBvciBj b2xsYXRpb25zIHRoYXQsIHNheSwgaWdub3JlIHB1bmN0dWF0aW9uLgorICAgIFNvIHdpdGggYSBj YXNlLWluc2Vuc2l0aXZlIGNvbGxhdGlvbiwgb25lIGNvdWxkIGhhdmU6Cis8cHJvZ3JhbWxpc3Rp bmc+CisnQWJDJyBMSUtFICdhYmMnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSAgICA8bGluZWFu bm90YXRpb24+dHJ1ZTwvbGluZWFubm90YXRpb24+CisnQWJDJyBMSUtFICdhJScgQ09MTEFURSBj YXNlX2luc2Vuc2l0aXZlICAgICA8bGluZWFubm90YXRpb24+dHJ1ZTwvbGluZWFubm90YXRpb24+ Cis8L3Byb2dyYW1saXN0aW5nPgorICAgIFdpdGggY29sbGF0aW9ucyB0aGF0IGlnbm9yZSBjZXJ0 YWluIGNoYXJhY3RlcnMgb3IgaW4gZ2VuZXJhbCB0aGF0IGNvbnNpZGVyCisgICAgc3RyaW5ncyBv ZiBkaWZmZXJlbnQgbGVuZ3RocyBlcXVhbCwgdGhlIHNlbWFudGljcyBjYW4gYmVjb21lIGEgYml0 IG1vcmUKKyAgICBjb21wbGljYXRlZC4gIENvbnNpZGVyIHRoZXNlIGV4YW1wbGVzOgorPHByb2dy YW1saXN0aW5nPgorJy5mb28uJyBMSUtFICdmb28nIENPTExBVEUgaWduX3B1bmN0ICAgIDxsaW5l YW5ub3RhdGlvbj50cnVlPC9saW5lYW5ub3RhdGlvbj4KKycuZm9vLicgTElLRSAnZl9vJyBDT0xM QVRFIGlnbl9wdW5jdCAgICA8bGluZWFubm90YXRpb24+dHJ1ZTwvbGluZWFubm90YXRpb24+Cisn LmZvby4nIExJS0UgJ19vbycgQ09MTEFURSBpZ25fcHVuY3QgICAgPGxpbmVhbm5vdGF0aW9uPmZh bHNlPC9saW5lYW5ub3RhdGlvbj4KKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgVGhlIHdheSB0aGUg bWF0Y2hpbmcgd29ya3MgaXMgdGhhdCB0aGUgcGF0dGVybiBpcyBwYXJ0aXRpb25lZCBpbnRvCisg ICAgc2VxdWVuY2VzIG9mIHdpbGRjYXJkcyBhbmQgbm9uLXdpbGRjYXJkIHN0cmluZ3MuICBGb3Ig ZXhhbXBsZSwgdGhlIHBhdHRlcm4KKyAgICA8bGl0ZXJhbD5mX288L2xpdGVyYWw+IGlzIHBhcnRp dGlvbmVkIGludG8gPGxpdGVyYWw+ZiwgXywgbzwvbGl0ZXJhbD4sIHRoZQorICAgIHBhdHRlcm4g PGxpdGVyYWw+X29vPC9saXRlcmFsPiBpcyBwYXJ0aXRpb25lZCBpbnRvIDxsaXRlcmFsPl8sCisg ICAgb288L2xpdGVyYWw+LiAgVGhlIGlucHV0IHN0cmluZyBtYXRjaGVzIHRoZSBwYXR0ZXJuIGlm IGl0IGNhbiBiZQorICAgIHBhcnRpdGlvbmVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgd2lsZGNh cmRzIG1hdGNoIG9uZSBjaGFyYWN0ZXIgb3IgYW55CisgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMg cmVzcGVjdGl2ZWx5IGFuZCB0aGUgbm9uLXdpbGRjYXJkIHBhcnRpdGlvbnMgYXJlCisgICAgZXF1 YWwgdW5kZXIgdGhlIGFwcGxpY2FibGUgY29sbGF0aW9uLiAgU28gZm9yIGV4YW1wbGUsIDxsaXRl cmFsPicuZm9vLicKKyAgICBMSUtFICdmX28nIENPTExBVEUgaWduX3B1bmN0PC9saXRlcmFsPiBp cyB0cnVlIGJlY2F1c2Ugb25lIGNhbiBwYXJ0aXRpb24KKyAgICA8bGl0ZXJhbD4uZm9vLjwvbGl0 ZXJhbD4gaW50byA8bGl0ZXJhbD4uZiwgbywgby48L2xpdGVyYWw+LCBhbmQgdGhlbgorICAgIDxs aXRlcmFsPicuZicgPSAnZicgQ09MTEFURSBpZ25fcHVuY3Q8L2xpdGVyYWw+LCA8bGl0ZXJhbD4n byc8L2xpdGVyYWw+CisgICAgbWF0Y2hlcyB0aGUgPGxpdGVyYWw+XzwvbGl0ZXJhbD4gd2lsZGNh cmQsIGFuZCA8bGl0ZXJhbD4nby4nID0gJ28nIENPTExBVEUKKyAgICBpZ25fcHVuY3Q8L2xpdGVy YWw+LiAgQnV0IDxsaXRlcmFsPicuZm9vLicgTElLRSAnX29vJyBDT0xMQVRFCisgICAgaWduX3B1 bmN0PC9saXRlcmFsPiBpcyBmYWxzZSBiZWNhdXNlIDxsaXRlcmFsPi5mb28uPC9saXRlcmFsPiBj YW5ub3QgYmUKKyAgICBwYXJ0aXRpb25lZCBpbiBhIHdheSB0aGF0IHRoZSBmaXJzdCBjaGFyYWN0 ZXIgaXMgYW55IGNoYXJhY3RlciBhbmQgdGhlCisgICAgcmVzdCBvZiB0aGUgc3RyaW5nIGNvbXBh cmVzIGVxdWFsIHRvIDxsaXRlcmFsPm9vPC9saXRlcmFsPi4gIChOb3RlIHRoYXQKKyAgICB0aGUg c2luZ2xlLWNoYXJhY3RlciB3aWxkY2FyZCBhbHdheXMgbWF0Y2hlcyBleGFjdGx5IG9uZSBjaGFy YWN0ZXIsCisgICAgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbGxhdGlvbi4gIFNvIGluIHRoaXMgZXhh bXBsZSwgdGhlCisgICAgPGxpdGVyYWw+XzwvbGl0ZXJhbD4gd291bGQgbWF0Y2ggPGxpdGVyYWw+ LjwvbGl0ZXJhbD4sIGJ1dCB0aGVuIHRoZSByZXN0CisgICAgb2YgdGhlIGlucHV0IHN0cmluZyB3 b24ndCBtYXRjaCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybi4pCisgICA8L3BhcmE+CisKICAgIDxw YXJhPgogICAgIDxmdW5jdGlvbj5MSUtFPC9mdW5jdGlvbj4gcGF0dGVybiBtYXRjaGluZyBhbHdh eXMgY292ZXJzIHRoZSBlbnRpcmUKICAgICBzdHJpbmcuICBUaGVyZWZvcmUsIGlmIGl0J3MgZGVz aXJlZCB0byBtYXRjaCBhIHNlcXVlbmNlIGFueXdoZXJlIHdpdGhpbgpAQCAtNTQ2OSw4ICs1NTA5 LDkgQEAgY2FzdCgtNDQgYXMgYml0KDEyKSkgICAgICAgICAgIDxsaW5lYW5ub3RhdGlvbj4xMTEx MTEwMTAxMDA8L2xpbmVhbm5vdGF0aW9uPgogCiAgICA8cGFyYT4KICAgICBUaGUga2V5IHdvcmQg PHRva2VuPklMSUtFPC90b2tlbj4gY2FuIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgIDx0b2tlbj5M SUtFPC90b2tlbj4gdG8gbWFrZSB0aGUgbWF0Y2ggY2FzZS1pbnNlbnNpdGl2ZSBhY2NvcmRpbmcK LSAgICB0byB0aGUgYWN0aXZlIGxvY2FsZS4gIFRoaXMgaXMgbm90IGluIHRoZSA8YWNyb255bT5T UUw8L2Fjcm9ueW0+IHN0YW5kYXJkIGJ1dCBpcyBhCisgICAgPHRva2VuPkxJS0U8L3Rva2VuPiB0 byBtYWtlIHRoZSBtYXRjaCBjYXNlLWluc2Vuc2l0aXZlIGFjY29yZGluZyB0byB0aGUKKyAgICBh Y3RpdmUgbG9jYWxlLiAgKEJ1dCB0aGlzIGRvZXMgbm90IHN1cHBvcnQgbm9uZGV0ZXJtaW5pc3Rp YyBjb2xsYXRpb25zLikKKyAgICBUaGlzIGlzIG5vdCBpbiB0aGUgPGFjcm9ueW0+U1FMPC9hY3Jv bnltPiBzdGFuZGFyZCBidXQgaXMgYQogICAgIDxwcm9kdWN0bmFtZT5Qb3N0Z3JlU1FMPC9wcm9k dWN0bmFtZT4gZXh0ZW5zaW9uLgogICAgPC9wYXJhPgogCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC91dGlscy9hZHQvbGlrZS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2UuYwppbmRleCA1 N2VhZDY2YjVhYS4uYmJiZTZjMDlkMTggMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9saWtlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2xpa2UuYwpAQCAtMTQ5LDIyICsx NDksMzIgQEAgU0JfbG93ZXJfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHBnX2xvY2FsZV90IGxvY2Fs ZSwgYm9vbCBsb2NhbGVfaXNfYykKIHN0YXRpYyBpbmxpbmUgaW50CiBHZW5lcmljTWF0Y2hUZXh0 KGNvbnN0IGNoYXIgKnMsIGludCBzbGVuLCBjb25zdCBjaGFyICpwLCBpbnQgcGxlbiwgT2lkIGNv bGxhdGlvbikKIHsKLQlpZiAoY29sbGF0aW9uICYmICFsY19jdHlwZV9pc19jKGNvbGxhdGlvbikp Ci0JewotCQlwZ19sb2NhbGVfdCBsb2NhbGUgPSBwZ19uZXdsb2NhbGVfZnJvbV9jb2xsYXRpb24o Y29sbGF0aW9uKTsKKwlwZ19sb2NhbGVfdCBsb2NhbGUgPSAwOworCWJvb2wJCWxvY2FsZV9pc19j ID0gZmFsc2U7CiAKLQkJaWYgKCFwZ19sb2NhbGVfZGV0ZXJtaW5pc3RpYyhsb2NhbGUpKQotCQkJ ZXJlcG9ydChFUlJPUiwKLQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JU RUQpLAotCQkJCQkgZXJybXNnKCJub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBz dXBwb3J0ZWQgZm9yIExJS0UiKSkpOworCWlmICghT2lkSXNWYWxpZChjb2xsYXRpb24pKQorCXsK KwkJLyoKKwkJICogVGhpcyB0eXBpY2FsbHkgbWVhbnMgdGhhdCB0aGUgcGFyc2VyIGNvdWxkIG5v dCByZXNvbHZlIGEgY29uZmxpY3QKKwkJICogb2YgaW1wbGljaXQgY29sbGF0aW9ucywgc28gcmVw b3J0IGl0IHRoYXQgd2F5LgorCQkgKi8KKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShF UlJDT0RFX0lOREVURVJNSU5BVEVfQ09MTEFUSU9OKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3Qg ZGV0ZXJtaW5lIHdoaWNoIGNvbGxhdGlvbiB0byB1c2UgZm9yIExJS0UiKSwKKwkJCQkgZXJyaGlu dCgiVXNlIHRoZSBDT0xMQVRFIGNsYXVzZSB0byBzZXQgdGhlIGNvbGxhdGlvbiBleHBsaWNpdGx5 LiIpKSk7CiAJfQogCisJaWYgKGxjX2N0eXBlX2lzX2MoY29sbGF0aW9uKSkKKwkJbG9jYWxlX2lz X2MgPSB0cnVlOworCWVsc2UKKwkJbG9jYWxlID0gcGdfbmV3bG9jYWxlX2Zyb21fY29sbGF0aW9u KGNvbGxhdGlvbik7CisKIAlpZiAocGdfZGF0YWJhc2VfZW5jb2RpbmdfbWF4X2xlbmd0aCgpID09 IDEpCi0JCXJldHVybiBTQl9NYXRjaFRleHQocywgc2xlbiwgcCwgcGxlbiwgMCwgdHJ1ZSk7CisJ CXJldHVybiBTQl9NYXRjaFRleHQocywgc2xlbiwgcCwgcGxlbiwgbG9jYWxlLCBsb2NhbGVfaXNf Yyk7CiAJZWxzZSBpZiAoR2V0RGF0YWJhc2VFbmNvZGluZygpID09IFBHX1VURjgpCi0JCXJldHVy biBVVEY4X01hdGNoVGV4dChzLCBzbGVuLCBwLCBwbGVuLCAwLCB0cnVlKTsKKwkJcmV0dXJuIFVU RjhfTWF0Y2hUZXh0KHMsIHNsZW4sIHAsIHBsZW4sIGxvY2FsZSwgbG9jYWxlX2lzX2MpOwogCWVs c2UKLQkJcmV0dXJuIE1CX01hdGNoVGV4dChzLCBzbGVuLCBwLCBwbGVuLCAwLCB0cnVlKTsKKwkJ cmV0dXJuIE1CX01hdGNoVGV4dChzLCBzbGVuLCBwLCBwbGVuLCBsb2NhbGUsIGxvY2FsZV9pc19j KTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxz L2FkdC9saWtlX21hdGNoLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9tYXRjaC5jCmlu ZGV4IGYyOTkwZWRmZjdlLi4wNzUxYjMyOWI4ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L2xpa2VfbWF0Y2guYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbGlrZV9tYXRj aC5jCkBAIC0xOTgsNiArMTk4LDEyNCBAQCBNYXRjaFRleHQoY29uc3QgY2hhciAqdCwgaW50IHRs ZW4sIGNvbnN0IGNoYXIgKnAsIGludCBwbGVuLAogCQkJTmV4dEJ5dGUocCwgcGxlbik7CiAJCQlj b250aW51ZTsKIAkJfQorCQllbHNlIGlmIChsb2NhbGUgJiYgIWxvY2FsZS0+ZGV0ZXJtaW5pc3Rp YykKKwkJeworCQkJLyoKKwkJCSAqIEZvciBub25kZXRlcm1pbmlzdGljIGxvY2FsZXMsIHdlIGZp bmQgdGhlIG5leHQgc3Vic3RyaW5nIG9mIHRoZQorCQkJICogcGF0dGVybiB0aGF0IGRvZXMgbm90 IGNvbnRhaW4gd2lsZGNhcmRzIGFuZCB0cnkgdG8gZmluZCBhCisJCQkgKiBtYXRjaGluZyBzdWJz dHJpbmcgaW4gdGhlIHRleHQuICBDcnVjaWFsbHksIHdlIGNhbm5vdCBkbyB0aGlzCisJCQkgKiBj aGFyYWN0ZXIgYnkgY2hhcmFjdGVyLCBhcyBpbiB0aGUgbm9ybWFsIGNhc2UsIGJ1dCBtdXN0IGRv IGl0CisJCQkgKiBzdWJzdHJpbmcgYnkgc3Vic3RyaW5nLCBwYXJ0aXRpb25lZCBieSB0aGUgd2ls ZGNhcmQgY2hhcmFjdGVycy4KKwkJCSAqLworCQkJY29uc3QgY2hhciAqcDE7CisJCQlzaXplX3QJ CXAxbGVuOworCQkJY29uc3QgY2hhciAqdDE7CisJCQlzaXplX3QJCXQxbGVuOworCQkJYm9vbAkJ Zm91bmRfZXNjYXBlOworCQkJY29uc3QgY2hhciAqc3VicGF0OworCQkJc2l6ZV90CQlzdWJwYXRs ZW47CisJCQljaGFyCSAgICpidWYgPSBOVUxMOworCisJCQkvKgorCQkJICogRGV0ZXJtaW5lIG5l eHQgc3Vic3RyaW5nIG9mIHBhdHRlcm4gd2l0aG91dCB3aWxkY2FyZHMuICBwIGlzCisJCQkgKiB0 aGUgc3RhcnQgb2YgdGhlIHN1YnBhdHRlcm4sIHAxIGlzIG9uZSBwYXN0IHRoZSBsYXN0IGJ5dGUu IEFsc28KKwkJCSAqIHRyYWNrIGlmIHdlIGZvdW5kIGFuIGVzY2FwZSBjaGFyYWN0ZXIuCisJCQkg Ki8KKwkJCXAxID0gcDsKKwkJCXAxbGVuID0gcGxlbjsKKwkJCWZvdW5kX2VzY2FwZSA9IGZhbHNl OworCQkJd2hpbGUgKHAxbGVuID4gMCkKKwkJCXsKKwkJCQlpZiAoKnAxID09ICdcXCcpCisJCQkJ eworCQkJCQlmb3VuZF9lc2NhcGUgPSB0cnVlOworCQkJCQlOZXh0Qnl0ZShwMSwgcDFsZW4pOwor CQkJCX0KKwkJCQllbHNlIGlmICgqcDEgPT0gJ18nIHx8ICpwMSA9PSAnJScpCisJCQkJCWJyZWFr OworCQkJCU5leHRCeXRlKHAxLCBwMWxlbik7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB3ZSBm b3VuZCBhbiBlc2NhcGUgY2hhcmFjdGVyLCB0aGVuIG1ha2UgYW4gdW5lc2NhcGVkIGNvcHkgb2YK KwkJCSAqIHRoZSBzdWJwYXR0ZXJuLgorCQkJICovCisJCQlpZiAoZm91bmRfZXNjYXBlKQorCQkJ eworCQkJCWNoYXIJICAgKmI7CisKKwkJCQliID0gYnVmID0gcGFsbG9jKHAxIC0gcCk7CisJCQkJ Zm9yIChjb25zdCBjaGFyICpjID0gcDsgYyA8IHAxOyBjKyspCisJCQkJeworCQkJCQlpZiAoKmMg PT0gJ1xcJykKKwkJCQkJCTsKKwkJCQkJZWxzZQorCQkJCQkJKihiKyspID0gKmM7CisJCQkJfQor CisJCQkJc3VicGF0ID0gYnVmOworCQkJCXN1YnBhdGxlbiA9IGIgLSBidWY7CisJCQl9CisJCQll bHNlCisJCQl7CisJCQkJc3VicGF0ID0gcDsKKwkJCQlzdWJwYXRsZW4gPSBwMSAtIHA7CisJCQl9 CisKKwkJCS8qCisJCQkgKiBOb3cgYnVpbGQgYSBzdWJzdHJpbmcgb2YgdGhlIHRleHQgYW5kIHRy eSB0byBtYXRjaCBpdCBhZ2FpbnN0CisJCQkgKiB0aGUgc3VicGF0dGVybi4gIHQgaXMgdGhlIHN0 YXJ0IG9mIHRoZSB0ZXh0LCB0MSBpcyBvbmUgcGFzdCB0aGUKKwkJCSAqIGxhc3QgYnl0ZS4gIFdl IHN0YXJ0IHdpdGggYSB6ZXJvLWxlbmd0aCBzdHJpbmcuCisJCQkgKi8KKwkJCXQxID0gdDsKKwkJ CXQxbGVuID0gdGxlbjsKKwkJCWZvciAoOzspCisJCQl7CisJCQkJaW50CQkJY21wOworCisJCQkJ Y21wID0gcGdfc3RybmNvbGwoc3VicGF0LCBzdWJwYXRsZW4sIHQsICh0MSAtIHQpLCBsb2NhbGUp OworCisJCQkJLyoKKwkJCQkgKiBJZiB3ZSBmb3VuZCBhIG1hdGNoLCB3ZSBoYXZlIHRvIHRlc3Qg aWYgdGhlIHJlc3Qgb2YgcGF0dGVybgorCQkJCSAqIGNhbiBtYXRjaCBhZ2FpbnN0IHRoZSByZXN0 IG9mIHRoZSBzdHJpbmcuICBPdGhlcndpc2Ugd2UKKwkJCQkgKiBoYXZlIHRvIGNvbnRpbnVlIGhl cmUgdHJ5IG1hdGNoaW5nIHdpdGggYSBsb25nZXIgc3Vic3RyaW5nLgorCQkJCSAqIChUaGlzIGlz IHNpbWlsYXIgdG8gdGhlIHJlY3Vyc2lvbiBmb3IgdGhlICclJyB3aWxkY2FyZAorCQkJCSAqIGFi b3ZlLikKKwkJCQkgKgorCQkJCSAqIE5vdGUgdGhhdCB3ZSBjYW4ndCBqdXN0IHdpbmQgZm9yd2Fy ZCBwIGFuZCB0IGFuZCBjb250aW51ZQorCQkJCSAqIHdpdGggdGhlIG1haW4gbG9vcC4gIFRoaXMg d291bGQgZmFpbCBmb3IgZXhhbXBsZSB3aXRoCisJCQkJICoKKwkJCQkgKiBVJidcMDA2MVwwMzA4 YmMnIExJS0UgVSYnXDAwRTRfYycgQ09MTEFURSBpZ25vcmVfYWNjZW50cworCQkJCSAqCisJCQkJ ICogWW91J2QgZmluZCB0aGF0IHQ9XDAwNjEgbWF0Y2hlcyBwPVwwMEU0LCBidXQgdGhlbiB0aGUg cmVzdAorCQkJCSAqIHdvbid0IG1hdGNoOyBidXQgdD1cMDA2MVwwMzA4IGFsc28gbWF0Y2hlcyBw PVwwMEU0LCBhbmQKKwkJCQkgKiB0aGVuIHRoZSByZXN0IHdpbGwgbWF0Y2guCisJCQkJICovCisJ CQkJaWYgKGNtcCA9PSAwKQorCQkJCXsKKwkJCQkJaW50CQkJbWF0Y2hlZCA9IE1hdGNoVGV4dCh0 MSwgdDFsZW4sIHAxLCBwMWxlbiwgbG9jYWxlLCBsb2NhbGVfaXNfYyk7CisKKwkJCQkJaWYgKG1h dGNoZWQgPT0gTElLRV9UUlVFKQorCQkJCQl7CisJCQkJCQlpZiAoYnVmKQorCQkJCQkJCXBmcmVl KGJ1Zik7CisJCQkJCQlyZXR1cm4gbWF0Y2hlZDsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qCisJ CQkJICogRGlkbid0IG1hdGNoLiAgSWYgd2UgdXNlZCB1cCB0aGUgd2hvbGUgdGV4dCwgdGhlbiB0 aGUgbWF0Y2gKKwkJCQkgKiBmYWlscy4gIE90aGVyd2lzZSwgdHJ5IGFnYWluIHdpdGggYSBsb25n ZXIgc3Vic3RyaW5nLgorCQkJCSAqLworCQkJCWlmICh0MWxlbiA9PSAwKQorCQkJCQlyZXR1cm4g TElLRV9GQUxTRTsKKwkJCQllbHNlCisJCQkJCU5leHRDaGFyKHQxLCB0MWxlbik7CisJCQl9CisJ CQlpZiAoYnVmKQorCQkJCXBmcmVlKGJ1Zik7CisJCQljb250aW51ZTsKKwkJfQogCQllbHNlIGlm IChHRVRDSEFSKCpwKSAhPSBHRVRDSEFSKCp0KSkKIAkJewogCQkJLyogbm9uLXdpbGRjYXJkIHBh dHRlcm4gY2hhciBmYWlscyB0byBtYXRjaCB0ZXh0IGNoYXIgKi8KZGlmZiAtLWdpdCBhL3NyYy9i YWNrZW5kL3V0aWxzL2FkdC9saWtlX3N1cHBvcnQuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9s aWtlX3N1cHBvcnQuYwppbmRleCAyNjM1MDUwODYxZi4uM2M2OTFhNWNjOTUgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9saWtlX3N1cHBvcnQuYworKysgYi9zcmMvYmFja2VuZC91 dGlscy9hZHQvbGlrZV9zdXBwb3J0LmMKQEAgLTI3MiwyMiArMjcyLDYgQEAgbWF0Y2hfcGF0dGVy bl9wcmVmaXgoTm9kZSAqbGVmdG9wLAogCQlyZXR1cm4gTklMOwogCXBhdHQgPSAoQ29uc3QgKikg cmlnaHRvcDsKIAotCS8qCi0JICogTm90IHN1cHBvcnRlZCBpZiB0aGUgZXhwcmVzc2lvbiBjb2xs YXRpb24gaXMgbm9uZGV0ZXJtaW5pc3RpYy4gIFRoZQotCSAqIG9wdGltaXplZCBlcXVhbGl0eSBv ciBwcmVmaXggdGVzdHMgdXNlIGJ5dGV3aXNlIGNvbXBhcmlzb25zLCB3aGljaCBpcwotCSAqIG5v dCBjb25zaXN0ZW50IHdpdGggbm9uZGV0ZXJtaW5pc3RpYyBjb2xsYXRpb25zLiAgVGhlIGFjdHVh bAotCSAqIHBhdHRlcm4tbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zIHdpbGwgbGF0 ZXIgZXJyb3Igb3V0IHRoYXQKLQkgKiBwYXR0ZXJuLW1hdGNoaW5nIGlzIG5vdCBzdXBwb3J0ZWQg d2l0aCBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMuIChXZQotCSAqIGNvdWxkIGFsc28gZXJy b3Igb3V0IGhlcmUsIGJ1dCBieSBkb2luZyBpdCBsYXRlciB3ZSBnZXQgbW9yZSBwcmVjaXNlCi0J ICogZXJyb3IgbWVzc2FnZXMuKSAgKEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IGF0 IGxlYXN0Ci0JICogUGF0dGVybl9QcmVmaXhfRXhhY3QsIGJ1dCBubyBwb2ludCBhcyBsb25nIGFz IHRoZSBhY3R1YWwKLQkgKiBwYXR0ZXJuLW1hdGNoaW5nIGltcGxlbWVudGF0aW9ucyBkb24ndCBz dXBwb3J0IGl0LikKLQkgKgotCSAqIGV4cHJfY29sbCBpcyBub3Qgc2V0IGZvciBhIG5vbi1jb2xs YXRpb24tYXdhcmUgZGF0YSB0eXBlIHN1Y2ggYXMgYnl0ZWEuCi0JICovCi0JaWYgKGV4cHJfY29s bCAmJiAhZ2V0X2NvbGxhdGlvbl9pc2RldGVybWluaXN0aWMoZXhwcl9jb2xsKSkKLQkJcmV0dXJu IE5JTDsKLQogCS8qCiAJICogVHJ5IHRvIGV4dHJhY3QgYSBmaXhlZCBwcmVmaXggZnJvbSB0aGUg cGF0dGVybi4KIAkgKi8KQEAgLTQwNCw2ICszODgsOCBAQCBtYXRjaF9wYXR0ZXJuX3ByZWZpeChO b2RlICpsZWZ0b3AsCiAJewogCQlpZiAoIW9wX2luX29wZmFtaWx5KGVxb3ByLCBvcGZhbWlseSkp CiAJCQlyZXR1cm4gTklMOworCQlpZiAoaW5kZXhjb2xsYXRpb24gIT0gZXhwcl9jb2xsKQorCQkJ cmV0dXJuIE5JTDsKIAkJZXhwciA9IG1ha2Vfb3BjbGF1c2UoZXFvcHIsIEJPT0xPSUQsIGZhbHNl LAogCQkJCQkJCSAoRXhwciAqKSBsZWZ0b3AsIChFeHByICopIHByZWZpeCwKIAkJCQkJCQkgSW52 YWxpZE9pZCwgaW5kZXhjb2xsYXRpb24pOwpAQCAtNDExLDYgKzM5NywxNyBAQCBtYXRjaF9wYXR0 ZXJuX3ByZWZpeChOb2RlICpsZWZ0b3AsCiAJCXJldHVybiByZXN1bHQ7CiAJfQogCisJLyoKKwkg KiBBbnl0aGluZyBvdGhlciB0aGFuIFBhdHRlcm5fUHJlZml4X0V4YWN0IGlzIG5vdCBzdXBwb3J0 ZWQgaWYgdGhlCisJICogZXhwcmVzc2lvbiBjb2xsYXRpb24gaXMgbm9uZGV0ZXJtaW5pc3RpYy4g IFRoZSBvcHRpbWl6ZWQgZXF1YWxpdHkgb3IKKwkgKiBwcmVmaXggdGVzdHMgdXNlIGJ5dGV3aXNl IGNvbXBhcmlzb25zLCB3aGljaCBpcyBub3QgY29uc2lzdGVudCB3aXRoCisJICogbm9uZGV0ZXJt aW5pc3RpYyBjb2xsYXRpb25zLgorCSAqCisJICogZXhwcl9jb2xsIGlzIG5vdCBzZXQgZm9yIGEg bm9uLWNvbGxhdGlvbi1hd2FyZSBkYXRhIHR5cGUgc3VjaCBhcyBieXRlYS4KKwkgKi8KKwlpZiAo ZXhwcl9jb2xsICYmICFnZXRfY29sbGF0aW9uX2lzZGV0ZXJtaW5pc3RpYyhleHByX2NvbGwpKQor CQlyZXR1cm4gTklMOworCiAJLyoKIAkgKiBPdGhlcndpc2UsIHdlIGhhdmUgYSBub25lbXB0eSBy ZXF1aXJlZCBwcmVmaXggb2YgdGhlIHZhbHVlcy4gIFNvbWUKIAkgKiBvcGNsYXNzZXMgc3VwcG9y dCBwcmVmaXggY2hlY2tzIGRpcmVjdGx5LCBvdGhlcndpc2Ugd2UnbGwgdHJ5IHRvCmRpZmYgLS1n aXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2NvbGxhdGUuaWN1LnV0Zjgub3V0IGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xsYXRlLmljdS51dGY4Lm91dAppbmRleCA3ZDU5ZmI0 NDMxNi4uN2ZkNjMzMTJkZGUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv Y29sbGF0ZS5pY3UudXRmOC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9jb2xs YXRlLmljdS51dGY4Lm91dApAQCAtMTI3Miw2ICsxMjcyLDMwIEBAIENSRUFURSBDT0xMQVRJT04g Y3Rlc3RfZGV0IChwcm92aWRlciA9IGljdSwgbG9jYWxlID0gJycsIGRldGVybWluaXN0aWMgPSB0 cnVlKTsKIE5PVElDRTogIHVzaW5nIHN0YW5kYXJkIGZvcm0gInVuZCIgZm9yIElDVSBsb2NhbGUg IiIKIENSRUFURSBDT0xMQVRJT04gY3Rlc3Rfbm9uZGV0IChwcm92aWRlciA9IGljdSwgbG9jYWxl ID0gJycsIGRldGVybWluaXN0aWMgPSBmYWxzZSk7CiBOT1RJQ0U6ICB1c2luZyBzdGFuZGFyZCBm b3JtICJ1bmQiIGZvciBJQ1UgbG9jYWxlICIiCitTRUxFQ1QgJ2FiYycgTElLRSAnYWJjJyBDT0xM QVRFIGN0ZXN0X2RldDsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NF TEVDVCAnYWJjJyBMSUtFICdhXGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKKyA/Y29sdW1uPyAKKy0t LS0tLS0tLS0KKyB0CisoMSByb3cpCisKK1NFTEVDVCAnYWJjJyBMSUtFICdhYmMnIENPTExBVEUg Y3Rlc3Rfbm9uZGV0OworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworU0VM RUNUICdhYmMnIExJS0UgJ2FcYmMnIENPTExBVEUgY3Rlc3Rfbm9uZGV0OworID9jb2x1bW4/IAor LS0tLS0tLS0tLQorIHQKKygxIHJvdykKKwogQ1JFQVRFIFRBQkxFIHRlc3Q2IChhIGludCwgYiB0 ZXh0KTsKIC0tIHNhbWUgc3RyaW5nIGluIGRpZmZlcmVudCBub3JtYWwgZm9ybXMKIElOU0VSVCBJ TlRPIHRlc3Q2IFZBTFVFUyAoMSwgVSYnXDAwRTRiYycpOwpAQCAtMTI5Niw2ICsxMzIwLDE5IEBA IFNFTEVDVCAqIEZST00gdGVzdDYgV0hFUkUgYiA9ICfDpGJjJyBDT0xMQVRFIGN0ZXN0X25vbmRl dDsKICAyIHwgYcyIYmMKICgyIHJvd3MpCiAKK1NFTEVDVCAqIEZST00gdGVzdDYgV0hFUkUgYiBM SUtFICfDpGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKKyBhIHwgIGIgIAorLS0tKy0tLS0tCisgMSB8 IMOkYmMKKygxIHJvdykKKworU0VMRUNUICogRlJPTSB0ZXN0NiBXSEVSRSBiIExJS0UgJ8OkYmMn IENPTExBVEUgY3Rlc3Rfbm9uZGV0OworIGEgfCAgYiAgCistLS0rLS0tLS0KKyAxIHwgw6RiYwor IDIgfCBhzIhiYworKDIgcm93cykKKwogLS0gc2FtZSB3aXRoIGFycmF5cwogQ1JFQVRFIFRBQkxF IHRlc3Q2YSAoYSBpbnQsIGIgdGV4dFtdKTsKIElOU0VSVCBJTlRPIHRlc3Q2YSBWQUxVRVMgKDEs IEFSUkFZW1UmJ1wwMEU0YmMnXSk7CkBAIC0xNTEyLDcgKzE1NDksMTIgQEAgU0VMRUNUIHggRlJP TSB0ZXN0M2NpIFdIRVJFIHggPD4gJ2FiYyc7CiAoMiByb3dzKQogCiBTRUxFQ1QgeCBGUk9NIHRl c3QzY2kgV0hFUkUgeCBMSUtFICdhJSc7Ci1FUlJPUjogIG5vbmRldGVybWluaXN0aWMgY29sbGF0 aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgTElLRQorICB4ICAKKy0tLS0tCisgYWJjCisgQUJD CisoMiByb3dzKQorCiBTRUxFQ1QgeCBGUk9NIHRlc3QzY2kgV0hFUkUgeCBJTElLRSAnYSUnOwog RVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9y IElMSUtFCiBTRUxFQ1QgeCBGUk9NIHRlc3QzY2kgV0hFUkUgeCBTSU1JTEFSIFRPICdhJSc7CkBA IC0xNjMwLDcgKzE2NzIsMTIgQEAgU0VMRUNUIHggRlJPTSB0ZXN0M2JwY2kgV0hFUkUgeCA8PiAn YWJjJzsKICgyIHJvd3MpCiAKIFNFTEVDVCB4IEZST00gdGVzdDNicGNpIFdIRVJFIHggTElLRSAn YSUnOwotRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0 ZWQgZm9yIExJS0UKKyAgeCAgCistLS0tLQorIGFiYworIEFCQworKDIgcm93cykKKwogU0VMRUNU IHggRlJPTSB0ZXN0M2JwY2kgV0hFUkUgeCBJTElLRSAnYSUnOwogRVJST1I6ICBub25kZXRlcm1p bmlzdGljIGNvbGxhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIElMSUtFCiBTRUxFQ1QgeCBG Uk9NIHRlc3QzYnBjaSBXSEVSRSB4IFNJTUlMQVIgVE8gJ2ElJzsKQEAgLTE3MjcsNyArMTc3NCw3 IEBAIFNFTEVDVCBzdHJpbmdfdG9fYXJyYXkoJ0FCQ0RFRkdISSc6OmNoYXIoOSkgQ09MTEFURSBj YXNlX2luc2Vuc2l0aXZlLCBOVUxMLCAnYicpCiAtLSBUaGlzIHRlc3RzIHRoZSBpc3N1ZSBkZXNj cmliZWQgaW4gbWF0Y2hfcGF0dGVybl9wcmVmaXgoKS4gIEluIHRoZQogLS0gYWJzZW5jZSBvZiB0 aGF0IGNoZWNrLCB0aGUgY2FzZV9pbnNlbnNpdGl2ZSB0ZXN0cyBiZWxvdyB3b3VsZAogLS0gcmV0 dXJuIG5vIHJvd3Mgd2hlcmUgdGhleSBzaG91bGQgbG9naWNhbGx5IHJldHVybiBvbmUuCi1DUkVB VEUgVEFCTEUgdGVzdDRjICh4IHRleHQgQ09MTEFURSAiQyIpOworQ1JFQVRFIFRBQkxFIHRlc3Q0 YyAoeCB0ZXh0IENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZSk7CiBJTlNFUlQgSU5UTyB0ZXN0NGMg VkFMVUVTICgnYWJjJyk7CiBDUkVBVEUgSU5ERVggT04gdGVzdDRjICh4KTsKIFNFVCBlbmFibGVf c2Vxc2NhbiA9IG9mZjsKQEAgLTE3NDEsMTAgKzE3ODgsMTggQEAgU0VMRUNUIHggRlJPTSB0ZXN0 NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xMQVRFIGNhc2Vfc2Vuc2l0aXZlOyAgLS0gb2ssIG5v IHJvd3MKIC0tLQogKDAgcm93cykKIAotU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtF ICdBQkMnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0tIGVycm9yCi1FUlJPUjogIG5vbmRl dGVybWluaXN0aWMgY29sbGF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgTElLRQotU0VMRUNU IHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRp dmU7ICAtLSBlcnJvcgotRVJST1I6ICBub25kZXRlcm1pbmlzdGljIGNvbGxhdGlvbnMgYXJlIG5v dCBzdXBwb3J0ZWQgZm9yIExJS0UKK1NFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAn QUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7ICAtLSBvaworICB4ICAKKy0tLS0tCisgYWJj CisoMSByb3cpCisKK1NFTEVDVCB4IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJScgQ09M TEFURSBjYXNlX2luc2Vuc2l0aXZlOyAgLS0gb2sKKyAgeCAgCistLS0tLQorIGFiYworKDEgcm93 KQorCiBSRVNFVCBlbmFibGVfc2Vxc2NhbjsKIC0tIFVuaWNvZGUgc3BlY2lhbCBjYXNlOiBkaWZm ZXJlbnQgdmFyaWFudHMgb2YgR3JlZWsgbG93ZXIgY2FzZSBzaWdtYS4KIC0tIEEgbmFpdmUgaW1w bGVtZW50YXRpb24gbGlrZSBjaXRleHQgdGhhdCBqdXN0IGRvZXMgbG93ZXIoeCkgPQpAQCAtMTgz OCw2ICsxODkzLDExNiBAQCBTRUxFQ1QgKiBGUk9NIHRlc3Q0IFdIRVJFIGIgPSAnQ290ZScgQ09M TEFURSBjYXNlX2luc2Vuc2l0aXZlOwogIDEgfCBjb3RlCiAoMSByb3cpCiAKKy0tIFRoaXMgaXMg YSB0cmlja3kgb25lLiAgQSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBmaXJzdCB0ZXN0Cist LSBcMDBFNCBtYXRjaGVzIFwwMDYxLCB3aGljaCBpcyB0cnVlIHVuZGVyIGlnbm9yZV9hY2NlbnRz LCBidXQgdGhlbgorLS0gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB3b24ndCBtYXRjaCBhbnltb3Jl LiAgVGhlcmVmb3JlLCB0aGUKKy0tIGFsZ29yaXRobSBoYXMgdG8gdGVzdCB3aGV0aGVyIHRoZSBy ZXN0IG9mIHRoZSBzdHJpbmcgbWF0Y2hlcywgYW5kCistLSBpZiBub3QgdHJ5IG1hdGNoaW5nIFww MEU0IGFnYWluc3QgYSBsb25nZXIgc3Vic3RyaW5nIGxpa2UKKy0tIFwwMDYxXDAzMDgsIHdoaWNo IHdpbGwgdGhlbiB3b3JrIG91dC4KK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYnXDAw RTRfYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0 CisoMSByb3cpCisKKy0tIGFuZCBpbiByZXZlcnNlOgorU0VMRUNUIFUmJ1wwMEU0YmMnIExJS0Ug VSYnXDAwNjFcMDMwOF9jJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/IAorLS0t LS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gaW5uZXIgJSBtYXRjaGVzIGI6CitTRUxFQ1QgVSYn XDAwNjFcMDMwOGJjJyBMSUtFIFUmJ1wwMEU0JWMnIENPTExBVEUgaWdub3JlX2FjY2VudHM7Cisg P2NvbHVtbj8gCistLS0tLS0tLS0tCisgdAorKDEgcm93KQorCistLSBpbm5lciAlJSBtYXRjaGVz IGIgdGhlbiB6ZXJvOgorU0VMRUNUIFUmJ1wwMDYxXDAzMDhiYycgTElLRSBVJidcMDBFNCUlYycg Q09MTEFURSBpZ25vcmVfYWNjZW50czsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0KKyB0CisoMSBy b3cpCisKKy0tIGlubmVyICUlIG1hdGNoZXMgYiB0aGVuIHplcm86CitTRUxFQ1QgVSYnY2JcMDA2 MVwwMzA4JyBMSUtFIFUmJ2MlJVwwMEU0JyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1 bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gdHJhaWxpbmcgXyBtYXRjaGVzIHR3 byBjb2RlcG9pbnRzIHRoYXQgZm9ybSBvbmUgY2hhcjoKK1NFTEVDVCBVJidjYlwwMDYxXDAzMDgn IExJS0UgVSYnY2JfJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/IAorLS0tLS0t LS0tLQorIHQKKygxIHJvdykKKworLS0gdHJhaWxpbmcgX18gbWF0Y2hlcyB0d28gY29kZXBvaW50 cyB0aGF0IGZvcm0gb25lIGNoYXI6CitTRUxFQ1QgVSYnY2JcMDA2MVwwMzA4JyBMSUtFIFUmJ2Ni X18nIENPTExBVEUgaWdub3JlX2FjY2VudHM7CisgP2NvbHVtbj8gCistLS0tLS0tLS0tCisgdAor KDEgcm93KQorCistLSBsZWFkaW5nICUgbWF0Y2hlcyB6ZXJvOgorU0VMRUNUIFUmJ1wwMDYxXDAz MDhiYycgTElLRSBVJiclXDAwRTRiYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKyA/Y29sdW1u PyAKKy0tLS0tLS0tLS0KKyB0CisoMSByb3cpCisKKy0tIGxlYWRpbmcgJSBtYXRjaGVzIHplcm8g KHdpdGggbGF0ZXIgJSk6CitTRUxFQ1QgVSYnXDAwNjFcMDMwOGJjJyBMSUtFIFUmJyVcMDBFNCVj JyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygx IHJvdykKKworLS0gdHJhaWxpbmcgJSBtYXRjaGVzIHplcm86CitTRUxFQ1QgVSYnXDAwNjFcMDMw OGJjJyBMSUtFIFUmJ1wwMEU0YmMlJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/ IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gdHJhaWxpbmcgJSBtYXRjaGVzIHplcm8g KHdpdGggcHJldmlvdXMgJSk6CitTRUxFQ1QgVSYnXDAwNjFcMDMwOGJjJyBMSUtFIFUmJ1wwMEU0 JWMlJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQK KygxIHJvdykKKworLS0gXyBtYXRjaGVzIHR3byBjb2RlcG9pbnRzIHRoYXQgZm9ybSBvbmUgY2hh cjoKK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYnX2JjJyBDT0xMQVRFIGlnbm9yZV9h Y2NlbnRzOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworLS0gX18gbWF0 Y2hlcyB0d28gY29kZXBvaW50cyB0aGF0IGZvcm0gb25lIGNoYXI6CitTRUxFQ1QgVSYnXDAwNjFc MDMwOGJjJyBMSUtFIFUmJ19fYmMnIENPTExBVEUgaWdub3JlX2FjY2VudHM7CisgP2NvbHVtbj8g CistLS0tLS0tLS0tCisgdAorKDEgcm93KQorCistLSBfIG1hdGNoZXMgb25lIGNvZGVwb2ludCB0 aGF0IGZvcm1zIGhhbGYgYSBjaGFyOgorU0VMRUNUIFUmJ1wwMDYxXDAzMDhiYycgTElLRSBVJidf XDAzMDhiYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKyA/Y29sdW1uPyAKKy0tLS0tLS0tLS0K KyB0CisoMSByb3cpCisKKy0tIGRvZXNuJ3QgbWF0Y2ggYmVjYXVzZSBcMDBlNCBkb2Vzbid0IG1h dGNoIG9ubHkgXDAzMDgKK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYnX1wwMGU0YmMn IENPTExBVEUgaWdub3JlX2FjY2VudHM7CisgP2NvbHVtbj8gCistLS0tLS0tLS0tCisgZgorKDEg cm93KQorCiAtLSBmb3JlaWduIGtleXMgKHNob3VsZCB1c2UgY29sbGF0aW9uIG9mIHByaW1hcnkg a2V5KQogLS0gUEsgaXMgY2FzZS1zZW5zaXRpdmUsIEZLIGlzIGNhc2UtaW5zZW5zaXRpdmUKIENS RUFURSBUQUJMRSB0ZXN0MTBwayAoeCB0ZXh0IENPTExBVEUgY2FzZV9zZW5zaXRpdmUgUFJJTUFS WSBLRVkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvY29sbGF0ZS5pY3UudXRm OC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9jb2xsYXRlLmljdS51dGY4LnNxbAppbmRleCA4 MGYyOGE5N2Q3OC4uOWI5NjZmNDcwNzMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2NvbGxhdGUuaWN1LnV0Zjguc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2NvbGxhdGUu aWN1LnV0Zjguc3FsCkBAIC01MTQsNiArNTE0LDEyIEBAIENSRUFURSBDT0xMQVRJT04gdGVzdGNv bGxfcnVsZXN4IChwcm92aWRlciA9IGljdSwgbG9jYWxlID0gJycsIHJ1bGVzID0gJyEhd3Jvbmch CiBDUkVBVEUgQ09MTEFUSU9OIGN0ZXN0X2RldCAocHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICcn LCBkZXRlcm1pbmlzdGljID0gdHJ1ZSk7CiBDUkVBVEUgQ09MTEFUSU9OIGN0ZXN0X25vbmRldCAo cHJvdmlkZXIgPSBpY3UsIGxvY2FsZSA9ICcnLCBkZXRlcm1pbmlzdGljID0gZmFsc2UpOwogCitT RUxFQ1QgJ2FiYycgTElLRSAnYWJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKK1NFTEVDVCAnYWJjJyBM SUtFICdhXGJjJyBDT0xMQVRFIGN0ZXN0X2RldDsKKworU0VMRUNUICdhYmMnIExJS0UgJ2FiYycg Q09MTEFURSBjdGVzdF9ub25kZXQ7CitTRUxFQ1QgJ2FiYycgTElLRSAnYVxiYycgQ09MTEFURSBj dGVzdF9ub25kZXQ7CisKIENSRUFURSBUQUJMRSB0ZXN0NiAoYSBpbnQsIGIgdGV4dCk7CiAtLSBz YW1lIHN0cmluZyBpbiBkaWZmZXJlbnQgbm9ybWFsIGZvcm1zCiBJTlNFUlQgSU5UTyB0ZXN0NiBW QUxVRVMgKDEsIFUmJ1wwMEU0YmMnKTsKQEAgLTUyMiw2ICs1MjgsOSBAQCBTRUxFQ1QgKiBGUk9N IHRlc3Q2OwogU0VMRUNUICogRlJPTSB0ZXN0NiBXSEVSRSBiID0gJ8OkYmMnIENPTExBVEUgY3Rl c3RfZGV0OwogU0VMRUNUICogRlJPTSB0ZXN0NiBXSEVSRSBiID0gJ8OkYmMnIENPTExBVEUgY3Rl c3Rfbm9uZGV0OwogCitTRUxFQ1QgKiBGUk9NIHRlc3Q2IFdIRVJFIGIgTElLRSAnw6RiYycgQ09M TEFURSBjdGVzdF9kZXQ7CitTRUxFQ1QgKiBGUk9NIHRlc3Q2IFdIRVJFIGIgTElLRSAnw6RiYycg Q09MTEFURSBjdGVzdF9ub25kZXQ7CisKIC0tIHNhbWUgd2l0aCBhcnJheXMKIENSRUFURSBUQUJM RSB0ZXN0NmEgKGEgaW50LCBiIHRleHRbXSk7CiBJTlNFUlQgSU5UTyB0ZXN0NmEgVkFMVUVTICgx LCBBUlJBWVtVJidcMDBFNGJjJ10pOwpAQCAtNjM3LDE0ICs2NDYsMTQgQEAgU0VMRUNUIHN0cmlu Z190b19hcnJheSgnQUJDREVGR0hJJzo6Y2hhcig5KSBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmUs IE5VTEwsICdiJykKIC0tIFRoaXMgdGVzdHMgdGhlIGlzc3VlIGRlc2NyaWJlZCBpbiBtYXRjaF9w YXR0ZXJuX3ByZWZpeCgpLiAgSW4gdGhlCiAtLSBhYnNlbmNlIG9mIHRoYXQgY2hlY2ssIHRoZSBj YXNlX2luc2Vuc2l0aXZlIHRlc3RzIGJlbG93IHdvdWxkCiAtLSByZXR1cm4gbm8gcm93cyB3aGVy ZSB0aGV5IHNob3VsZCBsb2dpY2FsbHkgcmV0dXJuIG9uZS4KLUNSRUFURSBUQUJMRSB0ZXN0NGMg KHggdGV4dCBDT0xMQVRFICJDIik7CitDUkVBVEUgVEFCTEUgdGVzdDRjICh4IHRleHQgQ09MTEFU RSBjYXNlX2luc2Vuc2l0aXZlKTsKIElOU0VSVCBJTlRPIHRlc3Q0YyBWQUxVRVMgKCdhYmMnKTsK IENSRUFURSBJTkRFWCBPTiB0ZXN0NGMgKHgpOwogU0VUIGVuYWJsZV9zZXFzY2FuID0gb2ZmOwog U0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMnIENPTExBVEUgY2FzZV9zZW5z aXRpdmU7ICAtLSBvaywgbm8gcm93cwogU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtF ICdBQkMlJyBDT0xMQVRFIGNhc2Vfc2Vuc2l0aXZlOyAgLS0gb2ssIG5vIHJvd3MKLVNFTEVDVCB4 IEZST00gdGVzdDRjIFdIRVJFIHggTElLRSAnQUJDJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7 ICAtLSBlcnJvcgotU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hFUkUgeCBMSUtFICdBQkMlJyBDT0xM QVRFIGNhc2VfaW5zZW5zaXRpdmU7ICAtLSBlcnJvcgorU0VMRUNUIHggRlJPTSB0ZXN0NGMgV0hF UkUgeCBMSUtFICdBQkMnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2ZTsgIC0tIG9rCitTRUxFQ1Qg eCBGUk9NIHRlc3Q0YyBXSEVSRSB4IExJS0UgJ0FCQyUnIENPTExBVEUgY2FzZV9pbnNlbnNpdGl2 ZTsgIC0tIG9rCiBSRVNFVCBlbmFibGVfc2Vxc2NhbjsKIAogLS0gVW5pY29kZSBzcGVjaWFsIGNh c2U6IGRpZmZlcmVudCB2YXJpYW50cyBvZiBHcmVlayBsb3dlciBjYXNlIHNpZ21hLgpAQCAtNjg3 LDYgKzY5Niw0MiBAQCBTRUxFQ1QgKiBGUk9NIHRlc3Q0IFdIRVJFIGIgPSAnY290ZScgQ09MTEFU RSBpZ25vcmVfYWNjZW50czsKIFNFTEVDVCAqIEZST00gdGVzdDQgV0hFUkUgYiA9ICdDb3RlJyBD T0xMQVRFIGlnbm9yZV9hY2NlbnRzOyAgLS0gc3RpbGwgY2FzZS1zZW5zaXRpdmUKIFNFTEVDVCAq IEZST00gdGVzdDQgV0hFUkUgYiA9ICdDb3RlJyBDT0xMQVRFIGNhc2VfaW5zZW5zaXRpdmU7CiAK Ky0tIFRoaXMgaXMgYSB0cmlja3kgb25lLiAgQSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCBm aXJzdCB0ZXN0CistLSBcMDBFNCBtYXRjaGVzIFwwMDYxLCB3aGljaCBpcyB0cnVlIHVuZGVyIGln bm9yZV9hY2NlbnRzLCBidXQgdGhlbgorLS0gdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyB3b24ndCBt YXRjaCBhbnltb3JlLiAgVGhlcmVmb3JlLCB0aGUKKy0tIGFsZ29yaXRobSBoYXMgdG8gdGVzdCB3 aGV0aGVyIHRoZSByZXN0IG9mIHRoZSBzdHJpbmcgbWF0Y2hlcywgYW5kCistLSBpZiBub3QgdHJ5 IG1hdGNoaW5nIFwwMEU0IGFnYWluc3QgYSBsb25nZXIgc3Vic3RyaW5nIGxpa2UKKy0tIFwwMDYx XDAzMDgsIHdoaWNoIHdpbGwgdGhlbiB3b3JrIG91dC4KK1NFTEVDVCBVJidcMDA2MVwwMzA4YmMn IExJS0UgVSYnXDAwRTRfYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKy0tIGFuZCBpbiByZXZl cnNlOgorU0VMRUNUIFUmJ1wwMEU0YmMnIExJS0UgVSYnXDAwNjFcMDMwOF9jJyBDT0xMQVRFIGln bm9yZV9hY2NlbnRzOworLS0gaW5uZXIgJSBtYXRjaGVzIGI6CitTRUxFQ1QgVSYnXDAwNjFcMDMw OGJjJyBMSUtFIFUmJ1wwMEU0JWMnIENPTExBVEUgaWdub3JlX2FjY2VudHM7CistLSBpbm5lciAl JSBtYXRjaGVzIGIgdGhlbiB6ZXJvOgorU0VMRUNUIFUmJ1wwMDYxXDAzMDhiYycgTElLRSBVJidc MDBFNCUlYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKy0tIGlubmVyICUlIG1hdGNoZXMgYiB0 aGVuIHplcm86CitTRUxFQ1QgVSYnY2JcMDA2MVwwMzA4JyBMSUtFIFUmJ2MlJVwwMEU0JyBDT0xM QVRFIGlnbm9yZV9hY2NlbnRzOworLS0gdHJhaWxpbmcgXyBtYXRjaGVzIHR3byBjb2RlcG9pbnRz IHRoYXQgZm9ybSBvbmUgY2hhcjoKK1NFTEVDVCBVJidjYlwwMDYxXDAzMDgnIExJS0UgVSYnY2Jf JyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworLS0gdHJhaWxpbmcgX18gbWF0Y2hlcyB0d28gY29k ZXBvaW50cyB0aGF0IGZvcm0gb25lIGNoYXI6CitTRUxFQ1QgVSYnY2JcMDA2MVwwMzA4JyBMSUtF IFUmJ2NiX18nIENPTExBVEUgaWdub3JlX2FjY2VudHM7CistLSBsZWFkaW5nICUgbWF0Y2hlcyB6 ZXJvOgorU0VMRUNUIFUmJ1wwMDYxXDAzMDhiYycgTElLRSBVJiclXDAwRTRiYycgQ09MTEFURSBp Z25vcmVfYWNjZW50czsKKy0tIGxlYWRpbmcgJSBtYXRjaGVzIHplcm8gKHdpdGggbGF0ZXIgJSk6 CitTRUxFQ1QgVSYnXDAwNjFcMDMwOGJjJyBMSUtFIFUmJyVcMDBFNCVjJyBDT0xMQVRFIGlnbm9y ZV9hY2NlbnRzOworLS0gdHJhaWxpbmcgJSBtYXRjaGVzIHplcm86CitTRUxFQ1QgVSYnXDAwNjFc MDMwOGJjJyBMSUtFIFUmJ1wwMEU0YmMlJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworLS0gdHJh aWxpbmcgJSBtYXRjaGVzIHplcm8gKHdpdGggcHJldmlvdXMgJSk6CitTRUxFQ1QgVSYnXDAwNjFc MDMwOGJjJyBMSUtFIFUmJ1wwMEU0JWMlJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworLS0gXyBt YXRjaGVzIHR3byBjb2RlcG9pbnRzIHRoYXQgZm9ybSBvbmUgY2hhcjoKK1NFTEVDVCBVJidcMDA2 MVwwMzA4YmMnIExJS0UgVSYnX2JjJyBDT0xMQVRFIGlnbm9yZV9hY2NlbnRzOworLS0gX18gbWF0 Y2hlcyB0d28gY29kZXBvaW50cyB0aGF0IGZvcm0gb25lIGNoYXI6CitTRUxFQ1QgVSYnXDAwNjFc MDMwOGJjJyBMSUtFIFUmJ19fYmMnIENPTExBVEUgaWdub3JlX2FjY2VudHM7CistLSBfIG1hdGNo ZXMgb25lIGNvZGVwb2ludCB0aGF0IGZvcm1zIGhhbGYgYSBjaGFyOgorU0VMRUNUIFUmJ1wwMDYx XDAzMDhiYycgTElLRSBVJidfXDAzMDhiYycgQ09MTEFURSBpZ25vcmVfYWNjZW50czsKKy0tIGRv ZXNuJ3QgbWF0Y2ggYmVjYXVzZSBcMDBlNCBkb2Vzbid0IG1hdGNoIG9ubHkgXDAzMDgKK1NFTEVD VCBVJidcMDA2MVwwMzA4YmMnIExJS0UgVSYnX1wwMGU0YmMnIENPTExBVEUgaWdub3JlX2FjY2Vu dHM7CisKIC0tIGZvcmVpZ24ga2V5cyAoc2hvdWxkIHVzZSBjb2xsYXRpb24gb2YgcHJpbWFyeSBr ZXkpCiAKIC0tIFBLIGlzIGNhc2Utc2Vuc2l0aXZlLCBGSyBpcyBjYXNlLWluc2Vuc2l0aXZlCi0t IAoyLjQ1LjAKCg== --00000000000098cf0e061e2e15ca--