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.96) (envelope-from ) id 1vmVEi-00CoUv-1a for pgsql-hackers@arkaria.postgresql.org; Sun, 01 Feb 2026 11:03:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vmVEe-009kYz-1E for pgsql-hackers@arkaria.postgresql.org; Sun, 01 Feb 2026 11:03:21 +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.96) (envelope-from ) id 1vmVEd-009kYr-24 for pgsql-hackers@lists.postgresql.org; Sun, 01 Feb 2026 11:03:20 +0000 Received: from mail-ej1-x62a.google.com ([2a00:1450:4864:20::62a]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vmVEc-000000001Y6-0m2B for pgsql-hackers@lists.postgresql.org; Sun, 01 Feb 2026 11:03:19 +0000 Received: by mail-ej1-x62a.google.com with SMTP id a640c23a62f3a-b79f8f7ea43so555813066b.2 for ; Sun, 01 Feb 2026 03:03:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1769943794; cv=none; d=google.com; s=arc-20240605; b=WK9evm+/cqXhX35G/alx2StF1aOimtoYIWKWTPTLchL4x4IHSfATQ5GsBS1G7TJ4jn 1uq8KBzZBcb834Nt5h4ojG3PG8AdBV0h2xAm+pmtgkBwFPjj3pUW7jYYTDolmilXrLik jFtBm08aWLcBKm+D5X/icDVX9NX/tpVOxy+wHztVu9cpYfSodgOCUMfNtnoEzLvipkdN jNKedM/Zo+uWgRZGglsmU9EUUtWWFusKTF1en4YIfXLVJzD6RPTPvnI6tUKbz1k8neJX 1WQ/h5g7ol41KgWuUwUn7GkO2ps/X7wtF985KNPU1+TBEq0bPOw34Ik4p6hAC8eAYJ0v fqIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :dkim-signature; bh=ZGaS5LRBZ2OH6zIrSDr0BgxuY0qXRwoZq7zgmH/PAyM=; fh=INmoGzi/9RcfXkJIyH08+eUpO5T5H8O0wKgOH2JfW3Y=; b=OJbZkBZcf6/aKIS6NcfZ5G0kBYJCwKeoZgr+qJLqv2maOv5wWdN02+OVEQ4UGLDFgg HLXhEdXsTo0uUnkN2DSuCKGumUo9+yQ+Gvnnh4StPYYjqzW2Z2SXk1tEbS5ngPuAPqtA Nih2eyFNnhNt+WYAsveedGR2mSSD2S/U7JFyV8gs3FBRumEi6qMGNNTghS1esv+MQL2h nDjioJPAnf7sBUk5btfp5WJt5cJNzcK6ctNeWRbXmyY82fdkcdJdlSLT4v/tErXBKwMj 1064lem/mWwSXdCIL0PrI0S14BXsy0dvHhX4Tr8Z7ElvD96utDtJqLUJqwCcN8TYhSDa sGEg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769943794; x=1770548594; darn=lists.postgresql.org; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=ZGaS5LRBZ2OH6zIrSDr0BgxuY0qXRwoZq7zgmH/PAyM=; b=nHJzH6XBk+CPTaknstwXiCOGX9S4e3pU/SzANYHqNm9CwQeqFqJaJplLHdWGNwET2T r37lorJ/o/m6/3002CV8AvIjOM39C6hsRN5hHkXsi3J4ocHD2wpQsUcLar/VQOBGU1QW jBPAu/H/ckuVazq/ljzWviY/4U7AW4LlzOZRx56o+ss5NBUb4soEGYz24gVvsVlm9MuE hNPUT8MgzAZCGXH2Qg0LqshdtY5sykeU3KkyLKASff5yKa9inasdHUmmcKIEfKBnnAuQ Kopl92586MP1jba6WCOSlhVvDEAVPwuoWNnTtWXvDq/iH/aqxjOWFNDZy7uxWYrQp4L5 zQtw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769943794; x=1770548594; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZGaS5LRBZ2OH6zIrSDr0BgxuY0qXRwoZq7zgmH/PAyM=; b=oHrVwSg0+FpWoRu5FQgrLXU89eXRr0xxhi7PCVax7qaLeLzt7Hdx8aKfEzg4A6+bd6 LOfQ5pjfBqQxAmivrid+vvS185ffOBcQ98EWFOYm1VSXOKm7I85JyLtdNOOHXLt77iKe 1GM67Dxtdjb/GWWckc401nCzJQeL+oUiLvqXjKAB1fvq0MAZbXSQ/Rt1hURftwytLHHT z2g1KrQpAdZxH5yE3NlVqMvszrpk+4WYasoykYdsMlRv/VJgbvWozbQ642j5aSy5ZM0j dSBn5VpNm9sfoT3Gwo8EKyzb/0ZzNjRuHpmSHZUvSISJwqjDbjy/sKBjK1NZ/2NNlPEU bmuw== X-Gm-Message-State: AOJu0Yx+PO9lRahBv2oLEyqM4L4IB59ZenMJSvZ3JPlzTk8jHwYRHm1Z lTkJS2Td6XtlnbZCBHpQvw3IMbqD3xX+WG8mYYVFpaCCnfmriD3QSmUoqlUSRgVMxVEXrvHrkB8 G+nrzTRZAARVz9mm4cmElOMXZ7DjvK4UBFg== X-Gm-Gg: AZuq6aLr8KzGwkdbBtADcKEx7ChNVBIfTISS2FkC0grbsK6WV+nH3AytSy8b5re9F+u s/9BuwgEqbUe/CYVV+ZQMECCD8CZiKnREvU3CQyBTetcv7XGc0baRc4JzEm1GAbvIw7uPBO7w2x PoZzzSEl1x/WW/pYIDf8QwdCTAxwGojA+A12tOdLgQGKraSF3UHWNYXBbelUH9jSKjOiFxDC24+ uVWIC6KrsTAr6MSgy5hQM0PQ3h2fVwWy94Vitr2A7alsJRx2HJq6KKMvgvKgu80MvavOMh6I9YR 2FKaZ02I/q1V7FXS4YyD8pq3Ng/7/JxJj8ZrgVomQTk/nOlC3penaIAVgLtLwU2y2L4EoRnYHPS MCW2MHw== X-Received: by 2002:a17:906:6a29:b0:b87:1be6:c707 with SMTP id a640c23a62f3a-b8dff58586cmr476681266b.17.1769943794273; Sun, 01 Feb 2026 03:03:14 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Florents Tselai Date: Sun, 1 Feb 2026 13:02:37 +0200 X-Gm-Features: AZwV_QjH55L-1F_dCGr_SjRzV9kd-Yjhyuac_K35V0AzLnRlB8fk6u40YiYL00c Message-ID: Subject: Re: Patch: Add tsmatch JSONPath operator for granular Full Text Search To: pgsql-hackers Content-Type: multipart/mixed; boundary="000000000000219d400649c1270f" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000219d400649c1270f Content-Type: multipart/alternative; boundary="000000000000219d3f0649c1270d" --000000000000219d3f0649c1270d Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai wrote: > Hi, > > in real-life I work a lot with json & fts search, here's a feature I've > always wished I had, > but never tackle it. Until yesterday that is. > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice" && @= .body > tsmatch "performance")'); > > This patch introduces a tsmatch boolean operator to the JSONPath engine. > By integrating FTS natively into path expressions, > this operator allows for high-precision filtering of nested JSONB > structures=E2=80=94 > solving issues with structural ambiguity and query complexity. > > Currently, users must choose between two suboptimal paths for FTS-ing > nested JSON: > - Imprecise Global Indexing > jsonb_to_tsvector aggregates text into a flat vector. > This ignores JSON boundaries, leading to false positives when the same ke= y > (e.g., "body") > appears in different contexts (e.g., a "Product Description" vs. a > "Customer Review"). > > - Complex SQL Workarounds > Achieving 100% precision requires unnesting the document via > jsonb_array_elements and LATERAL joins. > This leads to verbose SQL and high memory overhead from generating > intermediate heap tuples. > > One of the most significant advantages of tsmatch is its ability to > participate in multi-condition predicates > within the same JSON object - something jsonb_to_tsvector cannot do. > > SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice" && @= .body > tsmatch "performance")'); > > In a flat vector, the association between "Alice" and "performance" is > lost. > tsmatch preserves this link by evaluating the FTS predicate in-place > during path traversal. > > While the SQL/JSON standard (ISO/IEC 9075-2) does not explicitly define a= n > FTS operator, > tsmatch is architecturally modeled after the standard-defined like_regex. > > The implementation follows the like_regex precedent: > it is a non-indexable predicate that relies on GIN path-matching for > pruning and heap re-checks for precision. > Caching is scoped to the JsonPathExecContext, > ensuring 'compile-once' efficiency per execution without violating the > stability requirements of prepared statements. > > This initial implementation uses plainto_tsquery. > However, the grammar is designed to support a "mode" flag (similar to > like_regex flags) > in future iterations to toggle between to_tsquery, websearch_to_tsquery, > and phraseto_tsquery. > Here's a v2, that implements the tsqparser clause So this should now work too select jsonb_path_query_array('["fast car", "slow car", "fast and furious"]', '$[*] ? (@ tsmatch "fast car" tsqparser "w") --000000000000219d3f0649c1270d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable



On Mon, Jan 26, 2026 at 7:22=E2=80=AFPM Florents Tselai <florents.tselai@gma= il.com> wrote:
Hi,

in r= eal-life I work a lot with json & fts search, here's a feature I= 9;ve always wished I had,
but never tackle it. Until yesterday that is.

<= /div>
S= ELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D "Alice= " && @.body tsmatch "performance")');
<= div style=3D"color:rgb(0,0,0);font-family:Helvetica;font-size:12px">
Thi= s patch introduces a tsmatch boolean operator to the JSONPath engine.
=
By int= egrating FTS natively into path expressions,
this operator allows for high-p= recision filtering of nested JSONB structures=E2=80=94
solving issues with s= tructural ambiguity and query complexity.

Currently, users mu= st choose between two suboptimal paths for FTS-ing nested JSON:
- Imprec= ise Global Indexing
jsonb_to_tsvector aggregates text into a flat vector.
Thi= s ignores JSON boundaries, leading to false positives when the same key (e.= g., "body")
appears in different contexts (e.g., a "Product D= escription" vs. a "Customer Review").

- Complex SQL Worka= rounds
Achieving 100% precision requires unnesting the document via jsonb_ar= ray_elements and LATERAL joins.
This leads to verbose SQL and high memory ov= erhead from generating intermediate heap tuples.

One of the most signifi= cant advantages of tsmatch is its ability to participate in multi-condition= predicates
within the same JSON object - something jsonb_to_tsvector cannot= do.

SELECT jsonb_path_query(doc, '$.comments[*] ? (@.user =3D=3D &q= uot;Alice" && @.body tsmatch "performance")');
In a flat vector, the association between "Alice" and "per= formance" is lost.
tsmatch preserves this link by evaluating the FTS pr= edicate in-place during path traversal.

While the SQL/JSON standard (ISO= /IEC 9075-2) does not explicitly define an FTS operator,
tsmatch is architec= turally modeled after the standard-defined like_regex.

The implementati= on follows the like_regex precedent:
it is a non-indexable predicate that re= lies on GIN path-matching for pruning and heap re-checks for precision.
Cach= ing is scoped to the JsonPathExecContext,
ensuring 'compile-once' ef= ficiency per execution without violating the stability requirements of prep= ared statements.

This initial implementation uses plainto_tsquery.
=
Howeve= r, the grammar is designed to support a "mode" flag (similar to l= ike_regex flags)
in future iterations to toggle between to_tsquery, websearc= h_to_tsquery, and phraseto_tsquery.

=
Here's a v2, that implements the=C2=A0tsqparser=C2=A0clause= =C2=A0

So this should now work too=C2=A0

select jsonb_path_query_array('["fast car", &= quot;slow car", "fast and furious"]', '$[*] ? (@ tsm= atch "fast car" tsqparser "w")=C2=A0
--000000000000219d3f0649c1270d-- --000000000000219d400649c1270f Content-Type: application/octet-stream; name="v2-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Disposition: attachment; filename="v2-0001-Add-tsmatch-JSONPath-operator-for-granular-Full-T.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml3ms92i0 RnJvbSA2OGUxNmI0NTE1ZmEzMTg3M2EyNzY0ZDJmNDg5MDllNjVhZWQ5MmJjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBGbG9yZW50cyBUc2VsYWkgPGZsb3JlbnRzLnRzZWxhaUBnbWFp bC5jb20+CkRhdGU6IFN1biwgMSBGZWIgMjAyNiAxMTo0Mjo1OCArMDIwMApTdWJqZWN0OiBbUEFU Q0ggdjJdIEFkZCB0c21hdGNoIEpTT05QYXRoIG9wZXJhdG9yIGZvciBncmFudWxhciBGdWxsIFRl eHQKIFNlYXJjaApNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNo YXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAoKVGhpcyBwYXRjaCBp bnRyb2R1Y2VzIHRoZSB0c21hdGNoIGJvb2xlYW4gb3BlcmF0b3IgdG8gdGhlIEpTT05QYXRoIGVu Z2luZS4KQnkgaW50ZWdyYXRpbmcgRlRTIG5hdGl2ZWx5IGludG8gcGF0aCBleHByZXNzaW9ucywg dGhpcyBvcGVyYXRvciBhbGxvd3MKZm9yIGhpZ2gtcHJlY2lzaW9uIGZpbHRlcmluZyBvZiBuZXN0 ZWQgSlNPTkIgc3RydWN0dXJlc+KAlHNvbHZpbmcgaXNzdWVzCndpdGggc3RydWN0dXJhbCBhbWJp Z3VpdHkgYW5kIHF1ZXJ5IGNvbXBsZXhpdHkuCgpDdXJyZW50bHksIHVzZXJzIG11c3QgY2hvb3Nl IGJldHdlZW4gdHdvIHN1Ym9wdGltYWwgcGF0aHMgZm9yIHNlYXJjaGluZwpuZXN0ZWQgSlNPTjoK CjEuIEltcHJlY2lzZSBHbG9iYWwgSW5kZXhpbmcKICAganNvbmJfdG9fdHN2ZWN0b3IgYWdncmVn YXRlcyB0ZXh0IGludG8gYSBmbGF0IHZlY3Rvci4gVGhpcyBpZ25vcmVzCiAgIEpTT04gYm91bmRh cmllcywgbGVhZGluZyB0byBmYWxzZSBwb3NpdGl2ZXMgd2hlbiB0aGUgc2FtZSBrZXkKICAgKGUu Zy4sICJib2R5IikgYXBwZWFycyBpbiBkaWZmZXJlbnQgY29udGV4dHMgKGUuZy4sIGEgIlByb2R1 Y3QKICAgRGVzY3JpcHRpb24iIHZzLiBhICJDdXN0b21lciBSZXZpZXciKS4KCjIuIENvbXBsZXgg U1FMIFdvcmthcm91bmRzCiAgIEFjaGlldmluZyAxMDAlIHByZWNpc2lvbiByZXF1aXJlcyAiZXhw bG9kaW5nIiB0aGUgZG9jdW1lbnQgdmlhCiAgIGpzb25iX2FycmF5X2VsZW1lbnRzIGFuZCBMQVRF UkFMIGpvaW5zLiBUaGlzIGxlYWRzIHRvIHZlcmJvc2UgU1FMCiAgIGFuZCBoaWdoIG1lbW9yeSBv dmVyaGVhZCBmcm9tIGdlbmVyYXRpbmcgaW50ZXJtZWRpYXRlIGhlYXAgdHVwbGVzLgoKT25lIG9m IHRoZSBtb3N0IHNpZ25pZmljYW50IGFkdmFudGFnZXMgb2YgdHNtYXRjaCBpcyBpdHMgYWJpbGl0 eSB0bwpwYXJ0aWNpcGF0ZSBpbiBtdWx0aS1jb25kaXRpb24gcHJlZGljYXRlcyB3aXRoaW4gdGhl IHNhbWUgSlNPTiBvYmplY3TigJQKc29tZXRoaW5nIGpzb25iX3RvX3RzdmVjdG9yIGNhbm5vdCBk by4KCiAgU0VMRUNUIGpzb25iX3BhdGhfcXVlcnkoZG9jLCAnJC5jb21tZW50c1sqXSA/IChALnVz ZXIgPT0gIkFsaWNlIiAmJiBALmJvZHkgdHNtYXRjaCAicGVyZm9ybWFuY2UiKScpOwoKSW4gYSBm bGF0IHZlY3RvciwgdGhlIGFzc29jaWF0aW9uIGJldHdlZW4gIkFsaWNlIiBhbmQgInBlcmZvcm1h bmNlIiBpcwpsb3N0LiB0c21hdGNoIHByZXNlcnZlcyB0aGlzIGxpbmsgYnkgZXZhbHVhdGluZyB0 aGUgRlRTIHByZWRpY2F0ZQppbi1wbGFjZSBkdXJpbmcgcGF0aCB0cmF2ZXJzYWwuCgpXaGlsZSB0 aGUgU1FML0pTT04gc3RhbmRhcmQgKElTTy9JRUMgOTA3NS0yKSBkb2VzIG5vdCBleHBsaWNpdGx5 IGRlZmluZQphbiBGVFMgb3BlcmF0b3IsIHRzbWF0Y2ggaXMgYXJjaGl0ZWN0dXJhbGx5IG1vZGVs ZWQgYWZ0ZXIgdGhlCnN0YW5kYXJkLWRlZmluZWQgbGlrZV9yZWdleC4KClRoZSBvcGVyYXRvciBz dXBwb3J0cyBvcHRpb25hbCBjb25maWd1cmF0aW9uIGZvciBib3RoIHRoZSBkaWN0aW9uYXJ5IGFu ZAp0aGUgcXVlcnkgcGFyc2VyOgoKICBAIHRzbWF0Y2ggInF1ZXJ5IiBbIHRzY29uZmlnICJyZWdj b25maWciIF0gWyB0c3FwYXJzZXIgIm1vZGUiIF0KClN1cHBvcnRlZCBwYXJzZXIgbW9kZXMgYXJl OgogLSAicGwiOiBwbGFpbnRvX3RzcXVlcnkgKG5vIG9wZXJhdG9ycyByZXF1aXJlZCkKIC0gInBo IjogcGhyYXNldG9fdHNxdWVyeQogLSAidyI6ICB3ZWJzZWFyY2hfdG9fdHNxdWVyeQogLSBPbWl0 dGVkOiBEZWZhdWx0cyB0byB0b190c3F1ZXJ5IChzdHJpY3QgbW9kZSkKClRoZSBpbXBsZW1lbnRh dGlvbiByZWxpZXMgb24gR0lOIHBhdGgtbWF0Y2hpbmcgZm9yIGluZGV4IHBydW5pbmcgYW5kCmhl YXAgcmUtY2hlY2tzIGZvciBwcmVjaXNpb24uIENhY2hpbmcgaXMgc2NvcGVkIHRvIHRoZQpKc29u UGF0aEV4ZWNDb250ZXh0LCBlbnN1cmluZyAnY29tcGlsZS1vbmNlJyBlZmZpY2llbmN5IGZvciB0 aGUKdHNxdWVyeSBhbmQgT0lEIGxvb2t1cCBwZXIgZXhlY3V0aW9uLCByZXNwZWN0aW5nIHRoZSBz dGFiaWxpdHkKcmVxdWlyZW1lbnRzIG9mIHByZXBhcmVkIHN0YXRlbWVudHMuCi0tLQogZG9jL3Ny Yy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwgICAgICAgICAgICAgfCAgMzQgKysrKysKIHNyYy9i YWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aC5jICAgICAgICAgICAgIHwgMTM2ICsrKysrKysrKysr KysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9leGVjLmMgICAgICAgIHwg MTMwICsrKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoX2dy YW0ueSAgICAgICAgfCAgOTkgKysrKysrKysrKysrKy0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9q c29ucGF0aF9zY2FuLmwgICAgICAgIHwgICAzICsKIHNyYy9pbmNsdWRlL3V0aWxzL2pzb25wYXRo LmggICAgICAgICAgICAgICAgIHwgIDE5ICsrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9q c29uYl9qc29ucGF0aC5vdXQgfCAgNTggKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvanNvbnBhdGgub3V0ICAgICAgIHwgIDYwICsrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL3Nx bC9qc29uYl9qc29ucGF0aC5zcWwgICAgICB8ICAxMyArKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwv anNvbnBhdGguc3FsICAgICAgICAgICAgfCAgMTkgKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCA1Njcg aW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwv ZnVuYy9mdW5jLWpzb24uc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtanNvbi5zZ21sCmlu ZGV4IDFlYzczY2ZmNDY0Li5mNWQ2ZGEzODI0ZCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1 bmMvZnVuYy1qc29uLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVuYy1qc29uLnNnbWwK QEAgLTMxMDcsNiArMzEwNyw0MCBAQCBFUlJPUjogIGpzb25wYXRoIG1lbWJlciBhY2Nlc3NvciBj YW4gb25seSBiZSBhcHBsaWVkIHRvIGFuIG9iamVjdAogICAgICAgICA8cmV0dXJudmFsdWU+W108 L3JldHVybnZhbHVlPgogICAgICAgIDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAg ICA8cm93PgorICAgICAgIDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xl PSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAgIDxyZXBsYWNlYWJsZT5zdHJpbmc8L3JlcGxhY2Vh YmxlPiA8bGl0ZXJhbD50c21hdGNoPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+c3RyaW5nPC9yZXBs YWNlYWJsZT4KKyAgICAgICAgPG9wdGlvbmFsPiA8bGl0ZXJhbD50c2NvbmZpZzwvbGl0ZXJhbD4g PHJlcGxhY2VhYmxlPnN0cmluZzwvcmVwbGFjZWFibGU+IDwvb3B0aW9uYWw+CisgICAgICAgIDxv cHRpb25hbD4gPGxpdGVyYWw+dHNxcGFyc2VyPC9saXRlcmFsPiA8cmVwbGFjZWFibGU+c3RyaW5n PC9yZXBsYWNlYWJsZT4gPC9vcHRpb25hbD4KKyAgICAgICAgPHJldHVybnZhbHVlPmJvb2xlYW48 L3JldHVybnZhbHVlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICBU ZXN0cyB3aGV0aGVyIHRoZSBKU09OIHN0cmluZyAoZmlyc3Qgb3BlcmFuZCkgbWF0Y2hlcyB0aGUg ZnVsbC10ZXh0IHNlYXJjaCBxdWVyeQorICAgICAgICAgKHNlY29uZCBvcGVyYW5kKS4gVGhlIG1h dGNoaW5nIGJlaGF2aW9yIGNhbiBiZSBjdXN0b21pemVkIHVzaW5nIHRoZSBvcHRpb25hbAorICAg ICAgICAgPGxpdGVyYWw+dHNjb25maWc8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD50c3FwYXJzZXI8 L2xpdGVyYWw+IGNsYXVzZXMuCisgICAgICAgICBJZiA8bGl0ZXJhbD50c2NvbmZpZzwvbGl0ZXJh bD4gaXMgb21pdHRlZCwgdGhlIGN1cnJlbnQgc2Vzc2lvbidzIGRlZmF1bHQgdGV4dCBzZWFyY2gg Y29uZmlndXJhdGlvbgorICAgICAgICAgaXMgdXNlZCAoc2VlIDx4cmVmIGxpbmtlbmQ9Imd1Yy1k ZWZhdWx0LXRleHQtc2VhcmNoLWNvbmZpZyIvPikuCisgICAgICAgICBUaGUgPGxpdGVyYWw+dHNx cGFyc2VyPC9saXRlcmFsPiBjbGF1c2UgZGV0ZXJtaW5lcyBob3cgdGhlIHF1ZXJ5IHN0cmluZyBp cyBwYXJzZWQKKyAgICAgICAgIChzZWUgPHhyZWYgbGlua2VuZD0idGV4dHNlYXJjaC1wYXJzaW5n LXF1ZXJpZXMiLz4pLgorICAgICAgICAgVmFsaWQgb3B0aW9ucyBhcmUgPGxpdGVyYWw+InBsIjwv bGl0ZXJhbD4gKDxmdW5jdGlvbj5wbGFpbnRvX3RzcXVlcnk8L2Z1bmN0aW9uPiksCisgICAgICAg ICA8bGl0ZXJhbD4icGgiPC9saXRlcmFsPiAoPGZ1bmN0aW9uPnBocmFzZXRvX3RzcXVlcnk8L2Z1 bmN0aW9uPiksIGFuZAorICAgICAgICAgPGxpdGVyYWw+InciPC9saXRlcmFsPiAoPGZ1bmN0aW9u PndlYnNlYXJjaF90b190c3F1ZXJ5PC9mdW5jdGlvbj4pLgorICAgICAgICAgSWYgPGxpdGVyYWw+ dHNxcGFyc2VyPC9saXRlcmFsPiBpcyBvbWl0dGVkLCB0aGUgcXVlcnkgaXMgcGFyc2VkIHVzaW5n IDxmdW5jdGlvbj50b190c3F1ZXJ5PC9mdW5jdGlvbj4uCisgICAgICAgIDwvcGFyYT4KKyAgICAg ICAgPHBhcmE+CisgICAgICAgICA8bGl0ZXJhbD5qc29uYl9wYXRoX3F1ZXJ5X2FycmF5KCdbInJ1 bm5pbmciLCAicnVucyIsICJyYW4iLCAiam9nZ2luZyJdJywgJyRbKl0gPyAoQCB0c21hdGNoICJy dW4iIHRzY29uZmlnICJlbmdsaXNoIiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52YWx1 ZT5bInJ1bm5pbmciLCAicnVucyJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAg ICAgICA8cGFyYT4KKyAgICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1si ZmFzdCBjYXIiLCAic2xvdyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0 c21hdGNoICJmYXN0ICZhbXA7IGNhciIpJyk8L2xpdGVyYWw+CisgICAgICAgICA8cmV0dXJudmFs dWU+WyJmYXN0IGNhciJdPC9yZXR1cm52YWx1ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8 cGFyYT4KKyAgICAgICAgIDxsaXRlcmFsPmpzb25iX3BhdGhfcXVlcnlfYXJyYXkoJ1siZmFzdCBj YXIiLCAic2xvdyBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyJdJywgJyRbKl0gPyAoQCB0c21hdGNo ICJmYXN0IGNhciIgdHNxcGFyc2VyICJ3IiknKTwvbGl0ZXJhbD4KKyAgICAgICAgIDxyZXR1cm52 YWx1ZT5bImZhc3QgY2FyIl08L3JldHVybnZhbHVlPgorICAgICAgICA8L3BhcmE+CisgICAgICAg PC9lbnRyeT4KKyAgICAgIDwvcm93PgogICAgICA8L3Rib2R5PgogICAgIDwvdGdyb3VwPgogICAg PC90YWJsZT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aC5jIGIv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRoLmMKaW5kZXggMThhODA0NmQ2Y2YuLmRmNGVl MmEyNmYxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGguYworKysg Yi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGguYwpAQCAtMzQ5LDYgKzM0OSw2NiBAQCBm bGF0dGVuSnNvblBhdGhQYXJzZUl0ZW0oU3RyaW5nSW5mbyBidWYsIGludCAqcmVzdWx0LCBzdHJ1 Y3QgTm9kZSAqZXNjb250ZXh0LAogCQkJCSooaW50MzIgKikgKGJ1Zi0+ZGF0YSArIG9mZnMpID0g Y2hsZCAtIHBvczsKIAkJCX0KIAkJCWJyZWFrOworCQljYXNlIGpwaVRzTWF0Y2g6CisJCQl7CisJ CQkJaW50MzIJCWV4cHJfb2ZmOworCQkJCWludDMyCQl0c2NvbmZpZ19vZmY7CisKKwkJCQkvKiBS ZXNlcnZlIHNsb3RzIGZvciBjaGlsZCBub2RlIG9mZnNldHMgKi8KKwkJCQlleHByX29mZiA9IHJl c2VydmVTcGFjZUZvckl0ZW1Qb2ludGVyKGJ1Zik7CisJCQkJdHNjb25maWdfb2ZmID0gcmVzZXJ2 ZVNwYWNlRm9ySXRlbVBvaW50ZXIoYnVmKTsKKworCQkJCS8qIFdyaXRlIHRoZSBNYWluIFF1ZXJ5 IFN0cmluZyAqLworCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVmLAorCQkJCQkJCQkJICAg Jml0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxdWVyeWxlbiwKKwkJCQkJCQkJCSAgIHNpemVvZihpdGVt LT52YWx1ZS50c21hdGNoLnRzcXVlcnlsZW4pKTsKKwkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZv KGJ1ZiwKKwkJCQkJCQkJCSAgIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxdWVyeSwKKwkJCQkJCQkJ CSAgIGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNxdWVyeWxlbik7CisJCQkJYXBwZW5kU3RyaW5nSW5m b0NoYXIoYnVmLCAnXDAnKTsKKworCQkJCS8qIFdyaXRlIHRoZSBQYXJzZXIgRmxhZyAqLworCQkJ CWlmIChpdGVtLT52YWx1ZS50c21hdGNoLnRzcXBhcnNlcikKKwkJCQl7CisJCQkJCWFwcGVuZEJp bmFyeVN0cmluZ0luZm8oYnVmLAorCQkJCQkJCQkJCSAgICZpdGVtLT52YWx1ZS50c21hdGNoLnRz cXBhcnNlcl9sZW4sCisJCQkJCQkJCQkJICAgc2l6ZW9mKGl0ZW0tPnZhbHVlLnRzbWF0Y2gudHNx cGFyc2VyX2xlbikpOworCQkJCQlhcHBlbmRCaW5hcnlTdHJpbmdJbmZvKGJ1ZiwKKwkJCQkJCQkJ CQkgICBpdGVtLT52YWx1ZS50c21hdGNoLnRzcXBhcnNlciwKKwkJCQkJCQkJCQkgICBpdGVtLT52 YWx1ZS50c21hdGNoLnRzcXBhcnNlcl9sZW4pOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihi dWYsICdcMCcpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQl1aW50MzIJCXplcm8gPSAw OworCisJCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVmLCAmemVybywgc2l6ZW9mKHVpbnQz MikpOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICdcMCcpOworCQkJCX0KKworCQkJ CWlmICghZmxhdHRlbkpzb25QYXRoUGFyc2VJdGVtKGJ1ZiwgJmNobGQsIGVzY29udGV4dCwKKwkJ CQkJCQkJCQkJICBpdGVtLT52YWx1ZS50c21hdGNoLmRvYywKKwkJCQkJCQkJCQkJICBuZXN0aW5n TGV2ZWwsCisJCQkJCQkJCQkJCSAgaW5zaWRlQXJyYXlTdWJzY3JpcHQpKQorCQkJCQlyZXR1cm4g ZmFsc2U7CisJCQkJKihpbnQzMiAqKSAoYnVmLT5kYXRhICsgZXhwcl9vZmYpID0gY2hsZCAtIHBv czsKKworCQkJCS8qIFRTQ29uZmlnIChPcHRpb25hbCkgKi8KKwkJCQlpZiAoaXRlbS0+dmFsdWUu dHNtYXRjaC50c2NvbmZpZykKKwkJCQl7CisJCQkJCWlmICghZmxhdHRlbkpzb25QYXRoUGFyc2VJ dGVtKGJ1ZiwgJmNobGQsIGVzY29udGV4dCwKKwkJCQkJCQkJCQkJCSAgaXRlbS0+dmFsdWUudHNt YXRjaC50c2NvbmZpZywKKwkJCQkJCQkJCQkJCSAgbmVzdGluZ0xldmVsLAorCQkJCQkJCQkJCQkJ ICBpbnNpZGVBcnJheVN1YnNjcmlwdCkpCisJCQkJCQlyZXR1cm4gZmFsc2U7CisJCQkJCSooaW50 MzIgKikgKGJ1Zi0+ZGF0YSArIHRzY29uZmlnX29mZikgPSBjaGxkIC0gcG9zOworCQkJCX0KKwkJ CQllbHNlCisJCQkJeworCQkJCQkqKGludDMyICopIChidWYtPmRhdGEgKyB0c2NvbmZpZ19vZmYp ID0gMDsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKIAkJY2FzZSBqcGlGaWx0ZXI6CiAJCQlhcmdO ZXN0aW5nTGV2ZWwrKzsKIAkJCS8qIEZBTExUSFJPVUdIICovCkBAIC03NTksNiArODE5LDU4IEBA IHByaW50SnNvblBhdGhJdGVtKFN0cmluZ0luZm8gYnVmLCBKc29uUGF0aEl0ZW0gKnYsIGJvb2wg aW5LZXksCiAJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnIicpOwogCQkJfQogCisJCQlp ZiAocHJpbnRCcmFja2V0ZXMpCisJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOwor CQkJYnJlYWs7CisJCWNhc2UganBpVHNNYXRjaDoKKwkJCWlmIChwcmludEJyYWNrZXRlcykKKwkJ CQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcoJyk7CisKKwkJCWpzcEluaXRCeUJ1ZmZlcigm ZWxlbSwgdi0+YmFzZSwgdi0+Y29udGVudC50c21hdGNoLmRvYyk7CisJCQlwcmludEpzb25QYXRo SXRlbShidWYsICZlbGVtLCBmYWxzZSwKKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5KGVsZW0u dHlwZSkgPD0KKwkJCQkJCQkgIG9wZXJhdGlvblByaW9yaXR5KHYtPnR5cGUpKTsKKworCQkJYXBw ZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgdHNtYXRjaCAiKTsKKworCQkJZXNjYXBlX2pzb25f d2l0aF9sZW4oYnVmLAorCQkJCQkJCQkgdi0+Y29udGVudC50c21hdGNoLnRzcXVlcnksCisJCQkJ CQkJCSB2LT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeWxlbik7CisKKwkJCS8qIFByaW50IFRTQ29u ZmlnIGlmIHByZXNlbnQgKi8KKwkJCWlmICh2LT5jb250ZW50LnRzbWF0Y2gudHNjb25maWcpCisJ CQl7CisJCQkJSnNvblBhdGhJdGVtIGNvbmZpZ19pdGVtOworCQkJCWludDMyCQljb25maWdfbGVu OworCQkJCWNoYXIJICAgKmNvbmZpZ19zdHI7CisKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIiB0c2NvbmZpZyAiKTsKKwkJCQlqc3BJbml0QnlCdWZmZXIoJmNvbmZpZ19pdGVtLCB2 LT5iYXNlLCB2LT5jb250ZW50LnRzbWF0Y2gudHNjb25maWcpOworCQkJCWNvbmZpZ19zdHIgPSBq c3BHZXRTdHJpbmcoJmNvbmZpZ19pdGVtLCAmY29uZmlnX2xlbik7CisJCQkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnIicpOworCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVmLCBjb25m aWdfc3RyLCBjb25maWdfbGVuKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICciJyk7 CisJCQl9CisKKwkJCWlmICh2LT5jb250ZW50LnRzbWF0Y2gudHNxcGFyc2VyX2xlbiA+IDApCisJ CQl7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICIgdHNxcGFyc2VyICIpOworCQkJ CWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyInKTsKKworCQkJCS8qCisJCQkJICogVXNlIHNp bXBsZSBiaW5hcnkgYXBwZW5kIHNpbmNlIGZsYWdzIGxpa2UgInBsIiBkb24ndCBuZWVkCisJCQkJ ICogSlNPTiBlc2NhcGluZworCQkJCSAqLworCQkJCWFwcGVuZEJpbmFyeVN0cmluZ0luZm8oYnVm LAorCQkJCQkJCQkJICAgdi0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlciwKKwkJCQkJCQkJCSAg IHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXJfbGVuKTsKKwkJCQlhcHBlbmRTdHJpbmdJbmZv Q2hhcihidWYsICciJyk7CisJCQl9CisKKwkJCWlmIChwcmludEJyYWNrZXRlcykKKwkJCQlhcHBl bmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJCQlicmVhazsKKwogCQkJaWYgKHByaW50QnJh Y2tldGVzKQogCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKIAkJCWJyZWFrOwpA QCAtOTE0LDYgKzEwMjYsOCBAQCBqc3BPcGVyYXRpb25OYW1lKEpzb25QYXRoSXRlbVR5cGUgdHlw ZSkKIAkJCXJldHVybiAidGltZXN0YW1wIjsKIAkJY2FzZSBqcGlUaW1lc3RhbXBUejoKIAkJCXJl dHVybiAidGltZXN0YW1wX3R6IjsKKwkJY2FzZSBqcGlUc01hdGNoOgorCQkJcmV0dXJuICJ0c21h dGNoIjsKIAkJZGVmYXVsdDoKIAkJCWVsb2coRVJST1IsICJ1bnJlY29nbml6ZWQganNvbnBhdGgg aXRlbSB0eXBlOiAlZCIsIHR5cGUpOwogCQkJcmV0dXJuIE5VTEw7CkBAIC0xMDcyLDYgKzExODYs MjEgQEAganNwSW5pdEJ5QnVmZmVyKEpzb25QYXRoSXRlbSAqdiwgY2hhciAqYmFzZSwgaW50MzIg cG9zKQogCQkJcmVhZF9pbnQzMih2LT5jb250ZW50Lmxpa2VfcmVnZXgucGF0dGVybmxlbiwgYmFz ZSwgcG9zKTsKIAkJCXYtPmNvbnRlbnQubGlrZV9yZWdleC5wYXR0ZXJuID0gYmFzZSArIHBvczsK IAkJCWJyZWFrOworCQljYXNlIGpwaVRzTWF0Y2g6CisJCQlyZWFkX2ludDMyKHYtPmNvbnRlbnQu dHNtYXRjaC5kb2MsIGJhc2UsIHBvcyk7CisJCQlyZWFkX2ludDMyKHYtPmNvbnRlbnQudHNtYXRj aC50c2NvbmZpZywgYmFzZSwgcG9zKTsKKworCQkJLyogUmVhZCBRdWVyeSBTdHJpbmcgKi8KKwkJ CXJlYWRfaW50MzIodi0+Y29udGVudC50c21hdGNoLnRzcXVlcnlsZW4sIGJhc2UsIHBvcyk7CisJ CQl2LT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeSA9IGJhc2UgKyBwb3M7CisJCQkvKiBTa2lwIHBh c3QgcXVlcnkgc3RyaW5nICsgbnVsbCB0ZXJtaW5hdG9yICovCisJCQlwb3MgKz0gdi0+Y29udGVu dC50c21hdGNoLnRzcXVlcnlsZW4gKyAxOworCisJCQkvKiBSZWFkIFBhcnNlciBGbGFnICovCisJ CQlyZWFkX2ludDMyKHYtPmNvbnRlbnQudHNtYXRjaC50c3FwYXJzZXJfbGVuLCBiYXNlLCBwb3Mp OworCQkJdi0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlciA9IGJhc2UgKyBwb3M7CisJCQlwb3Mg Kz0gdi0+Y29udGVudC50c21hdGNoLnRzcXBhcnNlcl9sZW4gKyAxOworCQkJYnJlYWs7CiAJCWRl ZmF1bHQ6CiAJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIGpzb25wYXRoIGl0ZW0gdHlwZTog JWQiLCB2LT50eXBlKTsKIAl9CkBAIC0xMTQyLDYgKzEyNzEsNyBAQCBqc3BHZXROZXh0KEpzb25Q YXRoSXRlbSAqdiwgSnNvblBhdGhJdGVtICphKQogCQkJICAgdi0+dHlwZSA9PSBqcGlMYXN0IHx8 CiAJCQkgICB2LT50eXBlID09IGpwaVN0YXJ0c1dpdGggfHwKIAkJCSAgIHYtPnR5cGUgPT0ganBp TGlrZVJlZ2V4IHx8CisJCQkgICB2LT50eXBlID09IGpwaVRzTWF0Y2ggfHwKIAkJCSAgIHYtPnR5 cGUgPT0ganBpQmlnaW50IHx8CiAJCQkgICB2LT50eXBlID09IGpwaUJvb2xlYW4gfHwKIAkJCSAg IHYtPnR5cGUgPT0ganBpRGF0ZSB8fApAQCAtMTQ3NCw3ICsxNjA0LDExIEBAIGpzcElzTXV0YWJs ZVdhbGtlcihKc29uUGF0aEl0ZW0gKmpwaSwgc3RydWN0IEpzb25QYXRoTXV0YWJsZUNvbnRleHQg KmN4dCkKIAkJCQlqc3BJbml0QnlCdWZmZXIoJmFyZywganBpLT5iYXNlLCBqcGktPmNvbnRlbnQu bGlrZV9yZWdleC5leHByKTsKIAkJCQlqc3BJc011dGFibGVXYWxrZXIoJmFyZywgY3h0KTsKIAkJ CQlicmVhazsKLQorCQkJY2FzZSBqcGlUc01hdGNoOgorCQkJCUFzc2VydChzdGF0dXMgPT0ganBk c05vbkRhdGVUaW1lKTsKKwkJCQlqc3BJbml0QnlCdWZmZXIoJmFyZywganBpLT5iYXNlLCBqcGkt PmNvbnRlbnQudHNtYXRjaC5kb2MpOworCQkJCWpzcElzTXV0YWJsZVdhbGtlcigmYXJnLCBjeHQp OworCQkJCWJyZWFrOwogCQkJCS8qIGxpdGVyYWxzICovCiAJCQljYXNlIGpwaU51bGw6CiAJCQlj YXNlIGpwaVN0cmluZzoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0 aF9leGVjLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZXhlYy5jCmluZGV4IDUy YWUwYmE0Y2Y3Li44YjkzMjUxOGEwNSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L2pzb25wYXRoX2V4ZWMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvanNvbnBhdGhfZXhl Yy5jCkBAIC0xMjMsNiArMTIzLDEzIEBAIHR5cGVkZWYgc3RydWN0IEpzb25MaWtlUmVnZXhDb250 ZXh0CiAJaW50CQkJY2ZsYWdzOwogfSBKc29uTGlrZVJlZ2V4Q29udGV4dDsKIAordHlwZWRlZiBz dHJ1Y3QgSnNvblRzTWF0Y2hDb250ZXh0Cit7CisJRGF0dW0JCXF1ZXJ5RGF0dW07CQkvKiBDYWNo ZSB0aGUgY29tcGlsZWQgYmluYXJ5IFRTUXVlcnkgKi8KKwlPaWQJCQl0c2NvbmZpZ0lkOwkJLyog Q2FjaGUgdGhlIGRpY3Rpb25hcnkgT0lEICovCisJYm9vbAkJaW5pdGlhbGl6ZWQ7CS8qIEZsYWcg dG8gcnVuIHNldHVwIG9ubHkgb25jZSAqLworfQkJCUpzb25Uc01hdGNoQ29udGV4dDsKKwogLyog UmVzdWx0IG9mIGpzb25wYXRoIHByZWRpY2F0ZSBldmFsdWF0aW9uICovCiB0eXBlZGVmIGVudW0g SnNvblBhdGhCb29sCiB7CkBAIC0zMDYsNiArMzEzLDcgQEAgc3RhdGljIEpzb25QYXRoRXhlY1Jl c3VsdCBleGVjdXRlS2V5VmFsdWVNZXRob2QoSnNvblBhdGhFeGVjQ29udGV4dCAqY3h0LAogCQkJ CQkJCQkJCQkJSnNvblBhdGhJdGVtICpqc3AsIEpzb25iVmFsdWUgKmpiLCBKc29uVmFsdWVMaXN0 ICpmb3VuZCk7CiBzdGF0aWMgSnNvblBhdGhFeGVjUmVzdWx0IGFwcGVuZEJvb2xSZXN1bHQoSnNv blBhdGhFeGVjQ29udGV4dCAqY3h0LAogCQkJCQkJCQkJCSAgIEpzb25QYXRoSXRlbSAqanNwLCBK c29uVmFsdWVMaXN0ICpmb3VuZCwgSnNvblBhdGhCb29sIHJlcyk7CitzdGF0aWMgSnNvblBhdGhC b29sIGV4ZWN1dGVUc01hdGNoKEpzb25QYXRoSXRlbSAqanNwLCBKc29uYlZhbHVlICpzdHIsIEpz b25iVmFsdWUgKnJhcmcsIHZvaWQgKnBhcmFtKTsKIHN0YXRpYyB2b2lkIGdldEpzb25QYXRoSXRl bShKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsIEpzb25QYXRoSXRlbSAqaXRlbSwKIAkJCQkJCQlK c29uYlZhbHVlICp2YWx1ZSk7CiBzdGF0aWMgSnNvbmJWYWx1ZSAqR2V0SnNvblBhdGhWYXIodm9p ZCAqY3h0LCBjaGFyICp2YXJOYW1lLCBpbnQgdmFyTmFtZUxlbiwKQEAgLTgwMCw2ICs4MDgsNyBA QCBleGVjdXRlSXRlbU9wdFVud3JhcFRhcmdldChKc29uUGF0aEV4ZWNDb250ZXh0ICpjeHQsIEpz b25QYXRoSXRlbSAqanNwLAogCQljYXNlIGpwaUV4aXN0czoKIAkJY2FzZSBqcGlTdGFydHNXaXRo OgogCQljYXNlIGpwaUxpa2VSZWdleDoKKwkJY2FzZSBqcGlUc01hdGNoOgogCQkJewogCQkJCUpz b25QYXRoQm9vbCBzdCA9IGV4ZWN1dGVCb29sSXRlbShjeHQsIGpzcCwgamIsIHRydWUpOwogCkBA IC0xODY4LDYgKzE4NzcsMTYgQEAgZXhlY3V0ZUJvb2xJdGVtKEpzb25QYXRoRXhlY0NvbnRleHQg KmN4dCwgSnNvblBhdGhJdGVtICpqc3AsCiAJCQkJcmV0dXJuIGV4ZWN1dGVQcmVkaWNhdGUoY3h0 LCBqc3AsICZsYXJnLCBOVUxMLCBqYiwgZmFsc2UsCiAJCQkJCQkJCQkJZXhlY3V0ZUxpa2VSZWdl eCwgJmxyY3h0KTsKIAkJCX0KKwkJY2FzZSBqcGlUc01hdGNoOgorCQkJeworCQkJCUpzb25Uc01h dGNoQ29udGV4dCBscmN4dCA9IHswfTsKKworCQkJCWpzcEluaXRCeUJ1ZmZlcigmbGFyZywganNw LT5iYXNlLAorCQkJCQkJCQlqc3AtPmNvbnRlbnQudHNtYXRjaC5kb2MpOworCisJCQkJcmV0dXJu IGV4ZWN1dGVQcmVkaWNhdGUoY3h0LCBqc3AsICZsYXJnLCBOVUxMLCBqYiwgZmFsc2UsCisJCQkJ CQkJCQkJZXhlY3V0ZVRzTWF0Y2gsICZscmN4dCk7CisJCQl9CiAKIAkJY2FzZSBqcGlFeGlzdHM6 CiAJCQlqc3BHZXRBcmcoanNwLCAmbGFyZyk7CkBAIC0xODk5LDcgKzE5MTgsNiBAQCBleGVjdXRl Qm9vbEl0ZW0oSnNvblBhdGhFeGVjQ29udGV4dCAqY3h0LCBKc29uUGF0aEl0ZW0gKmpzcCwKIAog CQkJCXJldHVybiByZXMgPT0ganBlck9rID8ganBiVHJ1ZSA6IGpwYkZhbHNlOwogCQkJfQotCiAJ CWRlZmF1bHQ6CiAJCQllbG9nKEVSUk9SLCAiaW52YWxpZCBib29sZWFuIGpzb25wYXRoIGl0ZW0g dHlwZTogJWQiLCBqc3AtPnR5cGUpOwogCQkJcmV0dXJuIGpwYlVua25vd247CkBAIC0yOTIyLDYg KzI5NDAsMTE2IEBAIGV4ZWN1dGVLZXlWYWx1ZU1ldGhvZChKc29uUGF0aEV4ZWNDb250ZXh0ICpj eHQsIEpzb25QYXRoSXRlbSAqanNwLAogCiAJcmV0dXJuIHJlczsKIH0KKyNpbmNsdWRlICJ0c2Vh cmNoL3RzX3V0aWxzLmgiCisjaW5jbHVkZSAidHNlYXJjaC90c19jYWNoZS5oIgorI2luY2x1ZGUg InV0aWxzL3JlZ3Byb2MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL25hbWVzcGFjZS5oIgorCitzdGF0 aWMgSnNvblBhdGhCb29sCitleGVjdXRlVHNNYXRjaChKc29uUGF0aEl0ZW0gKmpzcCwgSnNvbmJW YWx1ZSAqc3RyLCBKc29uYlZhbHVlICpyYXJnLAorCQkJICAgdm9pZCAqcGFyYW0pCit7CisJSnNv blRzTWF0Y2hDb250ZXh0ICpjeHQgPSBwYXJhbTsKKwl0ZXh0CSAgICpkb2NfdGV4dDsKKwlEYXR1 bQkJdHN2ZWN0b3JfZGF0dW07CisJYm9vbAkJbWF0Y2g7CisKKwlpZiAoIShzdHIgPSBnZXRTY2Fs YXIoc3RyLCBqYnZTdHJpbmcpKSkKKwkJcmV0dXJuIGpwYlVua25vd247CisKKwkvKiBTZXR1cCBD b250ZXh0IChSdW4gT05MWSBvbmNlIHBlciBwcmVkaWNhdGUpICovCisJaWYgKCFjeHQtPmluaXRp YWxpemVkKQorCXsKKwkJdGV4dAkgICAqcXVlcnlfdGV4dDsKKwkJY2hhcgkgICAqcGFyc2VyX21v ZGU7CisJCXVpbnQzMgkJcGFyc2VyX2xlbjsKKworCQlpZiAoanNwLT5jb250ZW50LnRzbWF0Y2gu dHNjb25maWcgIT0gMCkKKwkJeworCQkJSnNvblBhdGhJdGVtIGNvbmZpZ19pdGVtOworCQkJaW50 MzIJCWNvbmZpZ19sZW47CisJCQljaGFyCSAgICpjb25maWdfc3RyOworCisJCQlqc3BJbml0QnlC dWZmZXIoJmNvbmZpZ19pdGVtLCBqc3AtPmJhc2UsIGpzcC0+Y29udGVudC50c21hdGNoLnRzY29u ZmlnKTsKKwkJCWNvbmZpZ19zdHIgPSBqc3BHZXRTdHJpbmcoJmNvbmZpZ19pdGVtLCAmY29uZmln X2xlbik7CisKKwkJCWN4dC0+dHNjb25maWdJZCA9IGdldF90c19jb25maWdfb2lkKHN0cmluZ1Rv UXVhbGlmaWVkTmFtZUxpc3QoY29uZmlnX3N0ciwgTlVMTCksIHRydWUpOworCQl9CisJCWVsc2UK KwkJeworCQkJY3h0LT50c2NvbmZpZ0lkID0gZ2V0VFNDdXJyZW50Q29uZmlnKHRydWUpOworCQl9 CisKKwkJLyogUHJlcGFyZSBRdWVyeSBUZXh0ICovCisJCXF1ZXJ5X3RleHQgPSBjc3RyaW5nX3Rv X3RleHRfd2l0aF9sZW4oanNwLT5jb250ZW50LnRzbWF0Y2gudHNxdWVyeSwKKwkJCQkJCQkJCQkJ ICBqc3AtPmNvbnRlbnQudHNtYXRjaC50c3F1ZXJ5bGVuKTsKKworCQkvKiBTZWxlY3QgUGFyc2Vy IGFuZCBDb21waWxlIFF1ZXJ5ICovCisJCXBhcnNlcl9tb2RlID0ganNwLT5jb250ZW50LnRzbWF0 Y2gudHNxcGFyc2VyOworCQlwYXJzZXJfbGVuID0ganNwLT5jb250ZW50LnRzbWF0Y2gudHNxcGFy c2VyX2xlbjsKKworCQlpZiAocGFyc2VyX2xlbiA+IDApCisJCXsKKwkJCS8qIERpc3BhdGNoIGJh c2VkIG9uIGZsYWcgKi8KKwkJCWlmIChwZ19zdHJuY2FzZWNtcChwYXJzZXJfbW9kZSwgInBsIiwg cGFyc2VyX2xlbikgPT0gMCkKKwkJCXsKKwkJCQljeHQtPnF1ZXJ5RGF0dW0gPSBEaXJlY3RGdW5j dGlvbkNhbGwyKHBsYWludG9fdHNxdWVyeV9ieWlkLAorCQkJCQkJCQkJCQkJCSAgT2JqZWN0SWRH ZXREYXR1bShjeHQtPnRzY29uZmlnSWQpLAorCQkJCQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVt KHF1ZXJ5X3RleHQpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBnX3N0cm5jYXNlY21wKHBhcnNlcl9t b2RlLCAicGgiLCBwYXJzZXJfbGVuKSA9PSAwKQorCQkJeworCQkJCWN4dC0+cXVlcnlEYXR1bSA9 IERpcmVjdEZ1bmN0aW9uQ2FsbDIocGhyYXNldG9fdHNxdWVyeV9ieWlkLAorCQkJCQkJCQkJCQkJ CSAgT2JqZWN0SWRHZXREYXR1bShjeHQtPnRzY29uZmlnSWQpLAorCQkJCQkJCQkJCQkJCSAgUG9p bnRlckdldERhdHVtKHF1ZXJ5X3RleHQpKTsKKwkJCX0KKwkJCWVsc2UgaWYgKHBnX3N0cm5jYXNl Y21wKHBhcnNlcl9tb2RlLCAidyIsIHBhcnNlcl9sZW4pID09IDApCisJCQl7CisJCQkJY3h0LT5x dWVyeURhdHVtID0gRGlyZWN0RnVuY3Rpb25DYWxsMih3ZWJzZWFyY2hfdG9fdHNxdWVyeV9ieWlk LAorCQkJCQkJCQkJCQkJCSAgT2JqZWN0SWRHZXREYXR1bShjeHQtPnRzY29uZmlnSWQpLAorCQkJ CQkJCQkJCQkJCSAgUG9pbnRlckdldERhdHVtKHF1ZXJ5X3RleHQpKTsKKwkJCX0KKwkJCWVsc2UK KwkJCXsKKwkJCQkvKgorCQkJCSAqIEZhbGxiYWNrIG9yIEVycm9yIGZvciB1bmtub3duIGZsYWdz IChzaG91bGQgYmUgY2F1Z2h0IGJ5CisJCQkJICogcGFyc2VyKQorCQkJCSAqLworCQkJCWVyZXBv cnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX1NZTlRBWF9FUlJPUiksCisJCQkJCQkg ZXJybXNnKCJ1bnJlY29nbml6ZWQgdHNxcGFyc2VyIGZsYWciKSkpOworCQkJfQorCQl9CisJCWVs c2UKKwkJeworCQkJLyoKKwkJCSAqIERlZmF1bHQ6IHRvX3RzcXVlcnkgKFN0YW5kYXJkIE1vZGUp IE5vdGU6IFRoaXMgZXhwZWN0cworCQkJICogb3BlcmF0b3JzIGxpa2UgJyYnIG9yICd8JyBpbiB0 aGUgcXVlcnkgc3RyaW5nCisJCQkgKi8KKwkJCWN4dC0+cXVlcnlEYXR1bSA9IERpcmVjdEZ1bmN0 aW9uQ2FsbDIodG9fdHNxdWVyeV9ieWlkLAorCQkJCQkJCQkJCQkJICBPYmplY3RJZEdldERhdHVt KGN4dC0+dHNjb25maWdJZCksCisJCQkJCQkJCQkJCQkgIFBvaW50ZXJHZXREYXR1bShxdWVyeV90 ZXh0KSk7CisJCX0KKworCQljeHQtPmluaXRpYWxpemVkID0gdHJ1ZTsKKwl9CisKKwkvKiBSdW50 aW1lOiBDb252ZXJ0IERvYyB0byBWZWN0b3IgYW5kIE1hdGNoICovCisKKwlkb2NfdGV4dCA9IGNz dHJpbmdfdG9fdGV4dF93aXRoX2xlbihzdHItPnZhbC5zdHJpbmcudmFsLAorCQkJCQkJCQkJCXN0 ci0+dmFsLnN0cmluZy5sZW4pOworCisJdHN2ZWN0b3JfZGF0dW0gPSBEaXJlY3RGdW5jdGlvbkNh bGwyKHRvX3RzdmVjdG9yX2J5aWQsCisJCQkJCQkJCQkJIE9iamVjdElkR2V0RGF0dW0oY3h0LT50 c2NvbmZpZ0lkKSwKKwkJCQkJCQkJCQkgUG9pbnRlckdldERhdHVtKGRvY190ZXh0KSk7CisKKwlt YXRjaCA9IERhdHVtR2V0Qm9vbChEaXJlY3RGdW5jdGlvbkNhbGwyKHRzX21hdGNoX3ZxLAorCQkJ CQkJCQkJCQkgdHN2ZWN0b3JfZGF0dW0sCisJCQkJCQkJCQkJCSBjeHQtPnF1ZXJ5RGF0dW0pKTsK KworCXJldHVybiBtYXRjaCA/IGpwYlRydWUgOiBqcGJGYWxzZTsKK30KKwogCiAvKgogICogQ29u dmVydCBib29sZWFuIGV4ZWN1dGlvbiBzdGF0dXMgJ3JlcycgdG8gYSBib29sZWFuIEpTT04gaXRl bSBhbmQgZXhlY3V0ZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pzb25wYXRo X2dyYW0ueSBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9ncmFtLnkKaW5kZXggNDU0 MzYyNmZmYzguLmIwZTE5YjhiNTY3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQv anNvbnBhdGhfZ3JhbS55CisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9ncmFt LnkKQEAgLTQzLDcgKzQzLDEyIEBAIHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4KEpzb25Q YXRoUGFyc2VJdGVtICpleHByLAogCQkJCQkJCSAgSnNvblBhdGhTdHJpbmcgKmZsYWdzLAogCQkJ CQkJCSAgSnNvblBhdGhQYXJzZUl0ZW0gKiogcmVzdWx0LAogCQkJCQkJCSAgc3RydWN0IE5vZGUg KmVzY29udGV4dCk7Ci0KK3N0YXRpYyBib29sIG1ha2VJdGVtVHNNYXRjaChKc29uUGF0aFBhcnNl SXRlbSAqZG9jLAorCQkJCQkJCSAgSnNvblBhdGhTdHJpbmcgKnRzcXVlcnksCisJCQkJCQkJICBK c29uUGF0aFN0cmluZyAqdHNjb25maWcsCisJCQkJCQkJICBKc29uUGF0aFN0cmluZyAqdHNxdWVy eV9wYXJzZXIsCisJCQkJCQkJICBKc29uUGF0aFBhcnNlSXRlbSAqKiByZXN1bHQsCisJCQkJCQkJ ICBzdHJ1Y3QgTm9kZSAqZXNjb250ZXh0KTsKIC8qCiAgKiBCaXNvbiBkb2Vzbid0IGFsbG9jYXRl IGFueXRoaW5nIHRoYXQgbmVlZHMgdG8gbGl2ZSBhY3Jvc3MgcGFyc2VyIGNhbGxzLAogICogc28g d2UgY2FuIGVhc2lseSBoYXZlIGl0IHVzZSBwYWxsb2MgaW5zdGVhZCBvZiBtYWxsb2MuICBUaGlz IHByZXZlbnRzCkBAIC04MSw3ICs4Niw3IEBAIHN0YXRpYyBib29sIG1ha2VJdGVtTGlrZVJlZ2V4 KEpzb25QYXRoUGFyc2VJdGVtICpleHByLAogJXRva2VuCTxzdHI+CQlJREVOVF9QIFNUUklOR19Q IE5VTUVSSUNfUCBJTlRfUCBWQVJJQUJMRV9QCiAldG9rZW4JPHN0cj4JCU9SX1AgQU5EX1AgTk9U X1AKICV0b2tlbgk8c3RyPgkJTEVTU19QIExFU1NFUVVBTF9QIEVRVUFMX1AgTk9URVFVQUxfUCBH UkVBVEVSRVFVQUxfUCBHUkVBVEVSX1AKLSV0b2tlbgk8c3RyPgkJQU5ZX1AgU1RSSUNUX1AgTEFY X1AgTEFTVF9QIFNUQVJUU19QIFdJVEhfUCBMSUtFX1JFR0VYX1AgRkxBR19QCisldG9rZW4JPHN0 cj4JCUFOWV9QIFNUUklDVF9QIExBWF9QIExBU1RfUCBTVEFSVFNfUCBXSVRIX1AgTElLRV9SRUdF WF9QIEZMQUdfUCBUU01BVENIX1AgVFNDT05GSUdfUCBUU1FVRVJZUEFSU0VSX1AKICV0b2tlbgk8 c3RyPgkJQUJTX1AgU0laRV9QIFRZUEVfUCBGTE9PUl9QIERPVUJMRV9QIENFSUxJTkdfUCBLRVlW QUxVRV9QCiAldG9rZW4JPHN0cj4JCURBVEVUSU1FX1AKICV0b2tlbgk8c3RyPgkJQklHSU5UX1Ag Qk9PTEVBTl9QIERBVEVfUCBERUNJTUFMX1AgSU5URUdFUl9QIE5VTUJFUl9QCkBAIC0xODcsNiAr MTkyLDM3IEBAIHByZWRpY2F0ZToKIAkJCVlZQUJPUlQ7CiAJCSQkID0ganBwaXRlbTsKIAl9CisJ fCBleHByIFRTTUFUQ0hfUCBTVFJJTkdfUAorCXsKKwkJSnNvblBhdGhQYXJzZUl0ZW0gKmpwcGl0 ZW07CisJCS8qIFBhc3MgTlVMTCBmb3IgdHNjb25maWcgKDNyZCkgYW5kIE5VTEwgZm9yIHRzcXVl cnlfcGFyc2VyICg0dGgpICovCisJCWlmICghIG1ha2VJdGVtVHNNYXRjaCgkMSwgJiQzLCBOVUxM LCBOVUxMLCAmanBwaXRlbSwgZXNjb250ZXh0KSkKKwkJICAgWVlBQk9SVDsKKwkJJCQgPSBqcHBp dGVtOworCX0KKwl8IGV4cHIgVFNNQVRDSF9QIFNUUklOR19QIFRTQ09ORklHX1AgU1RSSU5HX1AK Kwl7CisJCUpzb25QYXRoUGFyc2VJdGVtICpqcHBpdGVtOworCQkvKiBQYXNzIE5VTEwgZm9yIHRz cXVlcnlfcGFyc2VyICg0dGgpICovCisJCWlmICghIG1ha2VJdGVtVHNNYXRjaCgkMSwgJiQzLCAm JDUsIE5VTEwsICZqcHBpdGVtLCBlc2NvbnRleHQpKQorCQkgICBZWUFCT1JUOworCQkkJCA9IGpw cGl0ZW07CisJfQorCXwgZXhwciBUU01BVENIX1AgU1RSSU5HX1AgVFNRVUVSWVBBUlNFUl9QIFNU UklOR19QCisJeworCQlKc29uUGF0aFBhcnNlSXRlbSAqanBwaXRlbTsKKwkJLyogUGFzcyBOVUxM IGZvciB0c2NvbmZpZyAoM3JkKSAqLworCQlpZiAoISBtYWtlSXRlbVRzTWF0Y2goJDEsICYkMywg TlVMTCwgJiQ1LCAmanBwaXRlbSwgZXNjb250ZXh0KSkKKwkJICAgWVlBQk9SVDsKKwkJJCQgPSBq cHBpdGVtOworCX0KKwl8IGV4cHIgVFNNQVRDSF9QIFNUUklOR19QIFRTQ09ORklHX1AgU1RSSU5H X1AgVFNRVUVSWVBBUlNFUl9QIFNUUklOR19QCisJeworCQlKc29uUGF0aFBhcnNlSXRlbSAqanBw aXRlbTsKKwkJaWYgKCEgbWFrZUl0ZW1Uc01hdGNoKCQxLCAmJDMsICYkNSwgJiQ3LCAmanBwaXRl bSwgZXNjb250ZXh0KSkKKwkJICAgWVlBQk9SVDsKKwkJJCQgPSBqcHBpdGVtOworCX0KIAk7CiAK IHN0YXJ0c193aXRoX2luaXRpYWw6CkBAIC0zNTcsNiArMzkzLDkgQEAga2V5X25hbWU6CiAJfCBU SU1FX1RaX1AKIAl8IFRJTUVTVEFNUF9QCiAJfCBUSU1FU1RBTVBfVFpfUAorCXwgVFNDT05GSUdf UAorCXwgVFNNQVRDSF9QCisJfCBUU1FVRVJZUEFSU0VSX1AKIAk7CiAKIG1ldGhvZDoKQEAgLTY4 MywzICs3MjIsNTkgQEAganNwQ29udmVydFJlZ2V4RmxhZ3ModWludDMyIHhmbGFncywgaW50ICpy ZXN1bHQsIHN0cnVjdCBOb2RlICplc2NvbnRleHQpCiAKIAlyZXR1cm4gdHJ1ZTsKIH0KKworc3Rh dGljIGJvb2wKK21ha2VJdGVtVHNNYXRjaChKc29uUGF0aFBhcnNlSXRlbSAqZG9jLAorICAgICAg ICAgICAgIEpzb25QYXRoU3RyaW5nICp0c3F1ZXJ5LAorICAgICAgICAgICAgIEpzb25QYXRoU3Ry aW5nICp0c2NvbmZpZywKKyAgICAgICAgICAgICBKc29uUGF0aFN0cmluZyAqdHNxdWVyeV9wYXJz ZXIsCisgICAgICAgICAgICAgSnNvblBhdGhQYXJzZUl0ZW0gKipyZXN1bHQsCisgICAgICAgICAg ICAgc3RydWN0IE5vZGUgKmVzY29udGV4dCkKK3sKKyAgICBKc29uUGF0aFBhcnNlSXRlbSAqdiA9 IG1ha2VJdGVtVHlwZShqcGlUc01hdGNoKTsKKworICAgIHYtPnZhbHVlLnRzbWF0Y2guZG9jID0g ZG9jOworCisgICAgdi0+dmFsdWUudHNtYXRjaC50c3F1ZXJ5ID0gdHNxdWVyeS0+dmFsOworICAg IHYtPnZhbHVlLnRzbWF0Y2gudHNxdWVyeWxlbiA9IHRzcXVlcnktPmxlbjsKKworICAgIC8qIEhh bmRsZSB0aGUgQ29uZmlndXJhdGlvbiAoU3RvcmVkIGFzIGEgTm9kZSkgKi8KKyAgICBpZiAodHNj b25maWcpCisgICAgeworICAgICAgIEpzb25QYXRoUGFyc2VJdGVtICpjb25mID0gbWFrZUl0ZW1U eXBlKGpwaVN0cmluZyk7CisgICAgICAgY29uZi0+dmFsdWUuc3RyaW5nLnZhbCA9IHRzY29uZmln LT52YWw7CisgICAgICAgY29uZi0+dmFsdWUuc3RyaW5nLmxlbiA9IHRzY29uZmlnLT5sZW47Cisg ICAgICAgdi0+dmFsdWUudHNtYXRjaC50c2NvbmZpZyA9IGNvbmY7CisgICAgfQorICAgIGVsc2UK KyAgICB7CisgICAgICAgdi0+dmFsdWUudHNtYXRjaC50c2NvbmZpZyA9IE5VTEw7CisgICAgfQor CisgICAgLyogSGFuZGxlIHRoZSBUU1F1ZXJ5IFBhcnNlciBGbGFnICovCisgICAgaWYgKHRzcXVl cnlfcGFyc2VyKQorICAgIHsKKyAgICAgICAgLyogQ2hlY2sgZm9yICJwbCIsICJwaCIsICJ3IiBo ZXJlIHRvIHRocm93IGEgc3ludGF4IGVycm9yIGltbWVkaWF0ZWx5ICovCisgICAgICAgIGlmIChw Z19zdHJuY2FzZWNtcCh0c3F1ZXJ5X3BhcnNlci0+dmFsLCAicGwiLCB0c3F1ZXJ5X3BhcnNlci0+ bGVuKSAhPSAwICYmCisgICAgICAgICAgICBwZ19zdHJuY2FzZWNtcCh0c3F1ZXJ5X3BhcnNlci0+ dmFsLCAicGgiLCB0c3F1ZXJ5X3BhcnNlci0+bGVuKSAhPSAwICYmCisgICAgICAgICAgICBwZ19z dHJuY2FzZWNtcCh0c3F1ZXJ5X3BhcnNlci0+dmFsLCAidyIsICB0c3F1ZXJ5X3BhcnNlci0+bGVu KSAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAgZXJlcG9ydChFUlJPUiwKKyAgICAgICAg ICAgICAgICAgICAgIChlcnJjb2RlKEVSUkNPREVfU1lOVEFYX0VSUk9SKSwKKyAgICAgICAgICAg ICAgICAgICAgICBlcnJtc2coImludmFsaWQgdHNxdWVyeV9wYXJzZXIgdmFsdWU6IFwiJXNcIiIs IHRzcXVlcnlfcGFyc2VyLT52YWwpLAorICAgICAgICAgICAgICAgICAgICAgIGVycmhpbnQoIlZh bGlkIHZhbHVlcyBhcmUgXCJwbFwiLCBcInBoXCIsIGFuZCBcIndcIi4iKSkpOworICAgICAgICB9 CisKKyAgICAgICAgdi0+dmFsdWUudHNtYXRjaC50c3FwYXJzZXIgPSB0c3F1ZXJ5X3BhcnNlci0+ dmFsOworICAgICAgICB2LT52YWx1ZS50c21hdGNoLnRzcXBhcnNlcl9sZW4gPSB0c3F1ZXJ5X3Bh cnNlci0+bGVuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2LT52YWx1ZS50c21h dGNoLnRzcXBhcnNlciA9IE5VTEw7CisgICAgICAgIHYtPnZhbHVlLnRzbWF0Y2gudHNxcGFyc2Vy X2xlbiA9IDA7CisgICAgfQorCisgICAgLyogU3VjY2VzcyAqLworICAgICpyZXN1bHQgPSB2Owor ICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2pz b25wYXRoX3NjYW4ubCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0aF9zY2FuLmwKaW5k ZXggMzhjNTg0MWU4NzkuLjgwOWM2NmVjMDg1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGls cy9hZHQvanNvbnBhdGhfc2Nhbi5sCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9qc29ucGF0 aF9zY2FuLmwKQEAgLTQyNywxMCArNDI3LDEzIEBAIHN0YXRpYyBjb25zdCBKc29uUGF0aEtleXdv cmQga2V5d29yZHNbXSA9IHsKIAl7NywgZmFsc2UsIERFQ0lNQUxfUCwgImRlY2ltYWwifSwKIAl7 NywgZmFsc2UsIElOVEVHRVJfUCwgImludGVnZXIifSwKIAl7NywgZmFsc2UsIFRJTUVfVFpfUCwg InRpbWVfdHoifSwKKwl7NywgZmFsc2UsIFRTTUFUQ0hfUCwgInRzbWF0Y2gifSwKIAl7NywgZmFs c2UsIFVOS05PV05fUCwgInVua25vd24ifSwKIAl7OCwgZmFsc2UsIERBVEVUSU1FX1AsICJkYXRl dGltZSJ9LAogCXs4LCBmYWxzZSwgS0VZVkFMVUVfUCwgImtleXZhbHVlIn0sCisJezgsIGZhbHNl LCBUU0NPTkZJR19QLCAidHNjb25maWcifSwKIAl7OSwgZmFsc2UsIFRJTUVTVEFNUF9QLCAidGlt ZXN0YW1wIn0sCisJezksIGZhbHNlLCBUU1FVRVJZUEFSU0VSX1AsICJ0c3FwYXJzZXIifSwKIAl7 MTAsIGZhbHNlLCBMSUtFX1JFR0VYX1AsICJsaWtlX3JlZ2V4In0sCiAJezEyLCBmYWxzZSwgVElN RVNUQU1QX1RaX1AsICJ0aW1lc3RhbXBfdHoifSwKIH07CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS91dGlscy9qc29ucGF0aC5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGguaAppbmRleCA2 ZjUyOWQ3NGRjZC4uMDA3NTIzMjFmZjYgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0aWxzL2pz b25wYXRoLmgKKysrIGIvc3JjL2luY2x1ZGUvdXRpbHMvanNvbnBhdGguaApAQCAtMTA0LDYgKzEw NCw3IEBAIHR5cGVkZWYgZW51bSBKc29uUGF0aEl0ZW1UeXBlCiAJanBpTGFzdCwJCQkJCS8qIExB U1QgYXJyYXkgc3Vic2NyaXB0ICovCiAJanBpU3RhcnRzV2l0aCwJCQkJLyogU1RBUlRTIFdJVEgg cHJlZGljYXRlICovCiAJanBpTGlrZVJlZ2V4LAkJCQkvKiBMSUtFX1JFR0VYIHByZWRpY2F0ZSAq LworCWpwaVRzTWF0Y2gsCQkJCQkvKiBUU01BVENIIHByZWRpY2F0ZSAqLwogCWpwaUJpZ2ludCwJ CQkJCS8qIC5iaWdpbnQoKSBpdGVtIG1ldGhvZCAqLwogCWpwaUJvb2xlYW4sCQkJCQkvKiAuYm9v bGVhbigpIGl0ZW0gbWV0aG9kICovCiAJanBpRGF0ZSwJCQkJCS8qIC5kYXRlKCkgaXRlbSBtZXRo b2QgKi8KQEAgLTE4OCw2ICsxODksMTUgQEAgdHlwZWRlZiBzdHJ1Y3QgSnNvblBhdGhJdGVtCiAJ CQlpbnQzMgkJcGF0dGVybmxlbjsKIAkJCXVpbnQzMgkJZmxhZ3M7CiAJCX0JCQlsaWtlX3JlZ2V4 OworCQlzdHJ1Y3QKKwkJeworCQkJaW50MzIJCWRvYzsKKwkJCWNoYXIJICAgKnRzcXVlcnk7CisJ CQl1aW50MzIJCXRzcXVlcnlsZW47CisJCQlpbnQzMgkJdHNjb25maWc7CisJCQljaGFyCSAgICp0 c3FwYXJzZXI7CisJCQl1aW50MzIJCXRzcXBhcnNlcl9sZW47CisJCX0JCQl0c21hdGNoOwogCX0J CQljb250ZW50OwogfSBKc29uUGF0aEl0ZW07CiAKQEAgLTI2Niw2ICsyNzYsMTUgQEAgc3RydWN0 IEpzb25QYXRoUGFyc2VJdGVtCiAJCQl1aW50MzIJCWxlbjsKIAkJCWNoYXIJICAgKnZhbDsJLyog Y291bGQgbm90IGJlIG5vdCBudWxsLXRlcm1pbmF0ZWQgKi8KIAkJfQkJCXN0cmluZzsKKwkJc3Ry dWN0CisJCXsKKwkJCUpzb25QYXRoUGFyc2VJdGVtICpkb2M7CisJCQljaGFyCSAgICp0c3F1ZXJ5 OworCQkJdWludDMyCQl0c3F1ZXJ5bGVuOworCQkJSnNvblBhdGhQYXJzZUl0ZW0gKnRzY29uZmln OworCQkJY2hhcgkgICAqdHNxcGFyc2VyOworCQkJdWludDMyCQl0c3FwYXJzZXJfbGVuOworCQl9 CQkJdHNtYXRjaDsKIAl9CQkJdmFsdWU7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pzb25iX2pzb25wYXRoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvanNvbmJfanNvbnBhdGgub3V0CmluZGV4IDRiY2Q0ZTkxYTI5Li4zNTU1OGFmMDRlNSAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQKKysr IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29uYl9qc29ucGF0aC5vdXQKQEAgLTQ1MTAs MyArNDUxMCw2MSBAQCBPUkRFUiBCWSBzMS5udW0sIHMyLm51bTsKICB7InMiOiAiQiJ9ICAgIHwg eyJzIjogIkIifSAgICB8IGZhbHNlIHwgdHJ1ZSAgfCB0cnVlICB8IHRydWUgIHwgZmFsc2UKICgx NDQgcm93cykKIAorc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAicnVubmluZyIs ICJydW5zIiwgInJhbiIsICJydW4iLCAicnVubmVyIiwgImpvZ2dpbmciXScsICdsYXggJFsqXSA/ IChAIHRzbWF0Y2ggImZseSIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVl cnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKygwIHJvd3MpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1 ZXJ5KCdbbnVsbCwgMSwgInJ1bm5pbmciLCAicnVucyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIs ICJqb2dnaW5nIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29uZmlnICJlbmds aXNoIiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0tLS0tLS0tLS0tLS0tLS0tCisgInJ1bm5p bmciCisgInJ1bnMiCisgInJ1biIKKygzIHJvd3MpCisKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5 KCdbbnVsbCwgMSwgInJ1bm5pbmciLCAicnVucyIsICJyYW4iLCAicnVuIiwgInJ1bm5lciIsICJq b2dnaW5nIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJydW4iIHRzY29uZmlnICJzaW1wbGUi KScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAicnVuIgorKDEg cm93KQorCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJQb3N0Z3JlU1FMIiwg InBvc3RncmVzIiwgIlBPU1RHUkVTIiwgImRhdGFiYXNlIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21h dGNoICJQb3N0Z3JlcyIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3BhdGhfcXVlcnkg CistLS0tLS0tLS0tLS0tLS0tLS0KKyAicG9zdGdyZXMiCisgIlBPU1RHUkVTIgorKDIgcm93cykK Kworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1tudWxsLCAxLCAiUG9zdGdyZVNRTCIsICJwb3N0 Z3JlcyIsICJQT1NUR1JFUyIsICJkYXRhYmFzZSJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAi UG9zdGdyZXMiIHRzY29uZmlnICJzaW1wbGUiKScpOworIGpzb25iX3BhdGhfcXVlcnkgCistLS0t LS0tLS0tLS0tLS0tLS0KKyAicG9zdGdyZXMiCisgIlBPU1RHUkVTIgorKDIgcm93cykKKworLS0g aW4gdGhlIGRlZmF1bHQgdHNxcGFyc2VyICh0b190c3F1ZXJ5KSBzcGFjZXMgYXJlIG5vdCBhbGxv d2VkLCBzbyB0aGlzIHNob3VsZCBmYWlsIGZvciBzeW50YXgKK3NlbGVjdCBqc29uYl9wYXRoX3F1 ZXJ5KCdbImZhc3QgY2FyIiwgInN1cGVyIGZhc3QgY2FyIiwgImZhc3QgYW5kIGZ1cmlvdXMiLCAi c2xvdyBjYXIiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2ggImZhc3QgY2FyIiB0c2NvbmZpZyAi ZW5nbGlzaCIpJyk7CitFUlJPUjogIHN5bnRheCBlcnJvciBpbiB0c3F1ZXJ5OiAiZmFzdCBjYXIi CistLSBpZiB3ZSBzcGVjaWZ5ICJ3IiBob3dldmVyIGl0IHNob3VsZCBiZSBvaworc2VsZWN0IGpz b25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIiLCAiZmFzdCBhbmQg ZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmFzdCBjYXIi IHRzY29uZmlnICJlbmdsaXNoIiB0c3FwYXJzZXIgInciKScpOworIGpzb25iX3BhdGhfcXVlcnkg CistLS0tLS0tLS0tLS0tLS0tLS0KKyAiZmFzdCBjYXIiCisgInN1cGVyIGZhc3QgY2FyIgorKDIg cm93cykKKworLS0gaXQgc2hvdWxkIGFsc28gYmUgb2sgaWYgd2UgY2hhbmdlIHRvIGEgdmFsaWQg dG9fdHNxdWVyeQorc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIg ZmFzdCBjYXIiLCAiZmFzdCBhbmQgZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8g KEAgdHNtYXRjaCAiZmFzdCAmIGNhciIgdHNjb25maWcgImVuZ2xpc2giKScpOworIGpzb25iX3Bh dGhfcXVlcnkgCistLS0tLS0tLS0tLS0tLS0tLS0KKyAiZmFzdCBjYXIiCisgInN1cGVyIGZhc3Qg Y2FyIgorKDIgcm93cykKKworc2VsZWN0IGpzb25iX3BhdGhfcXVlcnkoJ1siZmF0IGNhdCIsICJj YXQgZmF0IiwgImZhdCByYXRzIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJmYXQgJiByYXQi IHRzY29uZmlnICJlbmdsaXNoIiknKTsKKyBqc29uYl9wYXRoX3F1ZXJ5IAorLS0tLS0tLS0tLS0t LS0tLS0tCisgImZhdCByYXRzIgorKDEgcm93KQorCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL2pzb25wYXRoLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvanNv bnBhdGgub3V0CmluZGV4IGZkOWJkNzU1ZjUyLi4wMmZlY2VjYjJhOSAxMDA2NDQKLS0tIGEvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qc29ucGF0aC5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9qc29ucGF0aC5vdXQKQEAgLTEyOTQsMyArMTI5NCw2MyBAQCBGUk9NIHVubmVz dChBUlJBWVsnJCA/IChAIGxpa2VfcmVnZXggInBhdHRlcm4iIGZsYWcgInNtaXhxIiknOjp0ZXh0 LAogIDFhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZiAgfCA0MjYw MSAgICAgICAgICB8IHRyYWlsaW5nIGp1bmsgYWZ0ZXIgbnVtZXJpYyBsaXRlcmFsIGF0IG9yIG5l YXIgIjFhIiBvZiBqc29ucGF0aCBpbnB1dCB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCiAoNSByb3dzKQogCistLSB0c21hdGNoIChG dWxsIFRleHQgU2VhcmNoKQorLS0gYmFzaWMgc3VjY2Vzcworc2VsZWN0ICckID8gKEAgdHNtYXRj aCAic2ltcGxlIiknOjpqc29ucGF0aDsKKyAgICAgICAganNvbnBhdGggICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgJD8oQCB0c21hdGNoICJzaW1wbGUiKQorKDEgcm93KQorCitz ZWxlY3QgJyQgPyAoQCB0c21hdGNoICJydW5uaW5nIiB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNv bnBhdGg7CisgICAgICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2gg InJ1bm5pbmciIHRzY29uZmlnICJlbmdsaXNoIikKKygxIHJvdykKKworLS0gdy9vdXQgdHNjb25m aWcgYW5kIHRzcXBhcnNlcgorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMi IHRzY29uZmlnICJzaW1wbGUiKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgICAganNv bnBhdGggICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgJD8oQCB0c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNj b25maWcgInNpbXBsZSIpCisoMSByb3cpCisKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggImZhc3Qg JiBmdXJpb3VzIiB0c2NvbmZpZyAic2ltcGxlIiB0c3FwYXJzZXIgInciKSc6Ompzb25wYXRoOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzb25wYXRoICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorICQ/KEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzY29uZmln ICJzaW1wbGUiIHRzcXBhcnNlciAidyIpCisoMSByb3cpCisKKy0tIHRzY29uZmlnIG11c3QgYmUg c3BlY2lmaWVkIGZpcnN0IGFuZCB0aGVuIHRzcXBhcnNlcgorc2VsZWN0ICckID8gKEAgdHNtYXRj aCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIgdHNjb25maWcgInNpbXBsZSIgKSc6Ompz b25wYXRoOworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3IgbmVhciAiICIgb2YganNvbnBhdGgg aW5wdXQKK0xJTkUgMTogc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRz cXBhcnNlciAidyIgdHNjb25mLi4uCisgICAgICAgICAgICAgICBeCitzZWxlY3QgJyQgPyAoQCB0 c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNxcGFyc2VyICJ3IiknOjpqc29ucGF0aDsKKyAgICAg ICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAkPyhAIHRzbWF0Y2ggImZhc3QgJiBm dXJpb3VzIiB0c3FwYXJzZXIgInciKQorKDEgcm93KQorCitzZWxlY3QgJyRbKl0gPyAoQC50aXRs ZSB0c21hdGNoICJnb2QiICYmIEAucmF0aW5nID4gNSknOjpqc29ucGF0aDsKKyAgICAgICAgICAg ICAgICAgICAgIGpzb25wYXRoICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICRbKl0/KEAuInRpdGxlIiB0c21h dGNoICJnb2QiICYmIEAuInJhdGluZyIgPiA1KQorKDEgcm93KQorCitzZWxlY3QgJyQgPyAoQCB0 c21hdGNoICRwYXR0ZXJuKSc6Ompzb25wYXRoOworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3Ig bmVhciAiJHBhdHRlcm4iIG9mIGpzb25wYXRoIGlucHV0CitMSU5FIDE6IHNlbGVjdCAnJCA/IChA IHRzbWF0Y2ggJHBhdHRlcm4pJzo6anNvbnBhdGg7CisgICAgICAgICAgICAgICBeCistLSBvbmx5 IHN0cmluZyBsaXRlcmFscyAobm8gdmFyaWFibGVzKSBhcmUgYWxsb3dlZCBmb3IgdHNxdWVyeQor c2VsZWN0ICckID8gKEAgdHNtYXRjaCAkdmFyIHRzY29uZmlnICJlbmdsaXNoIiknOjpqc29ucGF0 aDsKK0VSUk9SOiAgc3ludGF4IGVycm9yIGF0IG9yIG5lYXIgIiR2YXIiIG9mIGpzb25wYXRoIGlu cHV0CitMSU5FIDE6IHNlbGVjdCAnJCA/IChAIHRzbWF0Y2ggJHZhciB0c2NvbmZpZyAiZW5nbGlz aCIpJzo6anNvbnBhdGg7CisgICAgICAgICAgICAgICBeCistLSBpZiBhIHRzY29uZmlnIGRvZXNu J3QgZXhpc3QgaXQgc2hvdWxkIHBhcnNlIG5vbmV0aGVsZXNzIChleGVjdXRvciB3aWxsIGZhaWwg aXQpCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJydW5uaW5nIiB0c2NvbmZpZyAid3Jvbmdjb25m aWciKSc6Ompzb25wYXRoOworICAgICAgICAgICAgICAgICAgICBqc29ucGF0aCAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyAkPyhAIHRzbWF0Y2ggInJ1bm5pbmciIHRzY29uZmlnICJ3cm9uZ2NvbmZpZyIpCisoMSBy b3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iX2pzb25wYXRoLnNx bCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25iX2pzb25wYXRoLnNxbAppbmRleCAzZTg5Mjlh NTI2OS4uOWM3MjI5ZWIzODIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pzb25i X2pzb25wYXRoLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qc29uYl9qc29ucGF0aC5z cWwKQEAgLTExNDcsMyArMTE0NywxNiBAQCBTRUxFQ1QKIAlqc29uYl9wYXRoX3F1ZXJ5X2ZpcnN0 KHMxLmosICckLnMgPiAkcycsIHZhcnMgPT4gczIuaikgZ3QKIEZST00gc3RyIHMxLCBzdHIgczIK IE9SREVSIEJZIHMxLm51bSwgczIubnVtOworCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251 bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9nZ2lu ZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmx5IiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7 CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnW251bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAi cmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9nZ2luZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRj aCAicnVuIiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgn W251bGwsIDEsICJydW5uaW5nIiwgInJ1bnMiLCAicmFuIiwgInJ1biIsICJydW5uZXIiLCAiam9n Z2luZyJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAicnVuIiB0c2NvbmZpZyAic2ltcGxlIikn KTsKK3NlbGVjdCBqc29uYl9wYXRoX3F1ZXJ5KCdbbnVsbCwgMSwgIlBvc3RncmVTUUwiLCAicG9z dGdyZXMiLCAiUE9TVEdSRVMiLCAiZGF0YWJhc2UiXScsICdsYXggJFsqXSA/IChAIHRzbWF0Y2gg IlBvc3RncmVzIiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJfcGF0aF9xdWVy eSgnW251bGwsIDEsICJQb3N0Z3JlU1FMIiwgInBvc3RncmVzIiwgIlBPU1RHUkVTIiwgImRhdGFi YXNlIl0nLCAnbGF4ICRbKl0gPyAoQCB0c21hdGNoICJQb3N0Z3JlcyIgdHNjb25maWcgInNpbXBs ZSIpJyk7CistLSBpbiB0aGUgZGVmYXVsdCB0c3FwYXJzZXIgKHRvX3RzcXVlcnkpIHNwYWNlcyBh cmUgbm90IGFsbG93ZWQsIHNvIHRoaXMgc2hvdWxkIGZhaWwgZm9yIHN5bnRheAorc2VsZWN0IGpz b25iX3BhdGhfcXVlcnkoJ1siZmFzdCBjYXIiLCAic3VwZXIgZmFzdCBjYXIiLCAiZmFzdCBhbmQg ZnVyaW91cyIsICJzbG93IGNhciJdJywgJ2xheCAkWypdID8gKEAgdHNtYXRjaCAiZmFzdCBjYXIi IHRzY29uZmlnICJlbmdsaXNoIiknKTsKKy0tIGlmIHdlIHNwZWNpZnkgInciIGhvd2V2ZXIgaXQg c2hvdWxkIGJlIG9rCitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJzdXBl ciBmYXN0IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRbKl0g PyAoQCB0c21hdGNoICJmYXN0IGNhciIgdHNjb25maWcgImVuZ2xpc2giIHRzcXBhcnNlciAidyIp Jyk7CistLSBpdCBzaG91bGQgYWxzbyBiZSBvayBpZiB3ZSBjaGFuZ2UgdG8gYSB2YWxpZCB0b190 c3F1ZXJ5CitzZWxlY3QganNvbmJfcGF0aF9xdWVyeSgnWyJmYXN0IGNhciIsICJzdXBlciBmYXN0 IGNhciIsICJmYXN0IGFuZCBmdXJpb3VzIiwgInNsb3cgY2FyIl0nLCAnbGF4ICRbKl0gPyAoQCB0 c21hdGNoICJmYXN0ICYgY2FyIiB0c2NvbmZpZyAiZW5nbGlzaCIpJyk7CitzZWxlY3QganNvbmJf cGF0aF9xdWVyeSgnWyJmYXQgY2F0IiwgImNhdCBmYXQiLCAiZmF0IHJhdHMiXScsICdsYXggJFsq XSA/IChAIHRzbWF0Y2ggImZhdCAmIHJhdCIgdHNjb25maWcgImVuZ2xpc2giKScpOwpkaWZmIC0t Z2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbnBhdGguc3FsIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvanNvbnBhdGguc3FsCmluZGV4IDYxYTUyNzBkNGU4Li45ZjU4ZjQ2NjYyNiAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvanNvbnBhdGguc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL2pzb25wYXRoLnNxbApAQCAtMjY1LDMgKzI2NSwyMiBAQCBGUk9NIHVubmVzdChB UlJBWVsnJCA/IChAIGxpa2VfcmVnZXggInBhdHRlcm4iIGZsYWcgInNtaXhxIiknOjp0ZXh0LAog ICAgICAgICAgICAgICAgICAgJzAwJywKICAgICAgICAgICAgICAgICAgICcxYSddKSBzdHIsCiAg ICAgIExBVEVSQUwgcGdfaW5wdXRfZXJyb3JfaW5mbyhzdHIsICdqc29ucGF0aCcpIGFzIGVycmlu Zm87CisKKy0tIHRzbWF0Y2ggKEZ1bGwgVGV4dCBTZWFyY2gpCisKKy0tIGJhc2ljIHN1Y2Nlc3MK K3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggInNpbXBsZSIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyQg PyAoQCB0c21hdGNoICJydW5uaW5nIiB0c2NvbmZpZyAiZW5nbGlzaCIpJzo6anNvbnBhdGg7Cist LSB3L291dCB0c2NvbmZpZyBhbmQgdHNxcGFyc2VyCitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICJm YXN0ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIpJzo6anNvbnBhdGg7CitzZWxlY3QgJyQg PyAoQCB0c21hdGNoICJmYXN0ICYgZnVyaW91cyIgdHNjb25maWcgInNpbXBsZSIgdHNxcGFyc2Vy ICJ3IiknOjpqc29ucGF0aDsKKy0tIHRzY29uZmlnIG11c3QgYmUgc3BlY2lmaWVkIGZpcnN0IGFu ZCB0aGVuIHRzcXBhcnNlcgorc2VsZWN0ICckID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMi IHRzcXBhcnNlciAidyIgdHNjb25maWcgInNpbXBsZSIgKSc6Ompzb25wYXRoOworc2VsZWN0ICck ID8gKEAgdHNtYXRjaCAiZmFzdCAmIGZ1cmlvdXMiIHRzcXBhcnNlciAidyIpJzo6anNvbnBhdGg7 CitzZWxlY3QgJyRbKl0gPyAoQC50aXRsZSB0c21hdGNoICJnb2QiICYmIEAucmF0aW5nID4gNSkn Ojpqc29ucGF0aDsKK3NlbGVjdCAnJCA/IChAIHRzbWF0Y2ggJHBhdHRlcm4pJzo6anNvbnBhdGg7 CisKKy0tIG9ubHkgc3RyaW5nIGxpdGVyYWxzIChubyB2YXJpYWJsZXMpIGFyZSBhbGxvd2VkIGZv ciB0c3F1ZXJ5CitzZWxlY3QgJyQgPyAoQCB0c21hdGNoICR2YXIgdHNjb25maWcgImVuZ2xpc2gi KSc6Ompzb25wYXRoOworLS0gaWYgYSB0c2NvbmZpZyBkb2Vzbid0IGV4aXN0IGl0IHNob3VsZCBw YXJzZSBub25ldGhlbGVzcyAoZXhlY3V0b3Igd2lsbCBmYWlsIGl0KQorc2VsZWN0ICckID8gKEAg dHNtYXRjaCAicnVubmluZyIgdHNjb25maWcgIndyb25nY29uZmlnIiknOjpqc29ucGF0aDsKLS0g CjIuNTIuMAoK --000000000000219d400649c1270f--