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 1wbeZ2-002jsM-2b for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 13:19:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wbeZ1-006sT1-27 for pgsql-hackers@arkaria.postgresql.org; Mon, 22 Jun 2026 13:19:47 +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 1wbeZ0-006sSt-3C for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 13:19:47 +0000 Received: from mail-ej1-x631.google.com ([2a00:1450:4864:20::631]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wbeYx-00000001arU-3jp1 for pgsql-hackers@lists.postgresql.org; Mon, 22 Jun 2026 13:19:45 +0000 Received: by mail-ej1-x631.google.com with SMTP id a640c23a62f3a-c07c67ad9f2so592732166b.0 for ; Mon, 22 Jun 2026 06:19:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782134380; cv=none; d=google.com; s=arc-20240605; b=Ye9HCFpWJQV84XkIcqEnCGavHnqAZoiu/VwApP4BP+jRQ8tXYgGC1IKKRuho27x2Cw OFAfDmhYsrSdPvdet12bKuRv2e5NO/MSpXXahK8/1RsSfFmUOuuzEogy1KFo/JvKo30y O2PT670D7PFEE5iT/rt7kD2cV97JvikJpG+TmIhAuJY9aQkwfv4NODGTaBsThYON0+ej cRaz4bAHKLsBm2PmLTCCOAUrPG9p6aGV6qwYYQiDwMbkOhc0HzuDPSACo6lPzHWwWVtr W4a8urxzNZZhfYmEwiopBIRjDRZKIX/cROnNUFWyeqa4iswbMT+Bc6JP0QQfAjBPyjqR qZyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=1vHrvMkNVE/P7lf/qmiQFR6fdMCpdQqFEtkh8tbhJUI=; fh=/uy8NC9tIPWwdPmQhyTVPY86Bp1fyJtMbnfOOBAlGek=; b=CBA5tCiOngEG1KNn+rFUCcZockhJKagGsdDg9o730ojad4AnFKVt5aOw/gI6uFGQd/ QcxB3M/LMwaDERyaKPT10emUQ4Rn5Q70FoclNAKdKdJfzJhB9ZmJSEgYFPtYAT9najc0 DEMvcyoN27M7STbHsMdPOvlqsU0wGpLceZwdtwzMHpfodMompvrgFnJ7HbVWz4EO3vwG YoXG56fP2ATxILHvC+zvLs3SfemO+5OKLj44zXBUlvenbF3FRnydsOLFpw2RoRyGp/Jg lFV6EBOmNHIJ4loF0njr6PEEZzc1SrGKKlPxN9VvVRktw0cnRugK1g1D/S4zvC1ufyu4 jV1A==; 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=enterprisedb.com; s=google; t=1782134380; x=1782739180; darn=lists.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=1vHrvMkNVE/P7lf/qmiQFR6fdMCpdQqFEtkh8tbhJUI=; b=IU5hnU2FiblMSRw4ftJSud317clun7R5u9N1XG0L8olTzNPY79Ca1HFYUdJdJdOdx3 zFNRSPlZmJ78/pyAZwrB9s2V9MHO4xgMWUySuNvHHbfUXQ/CQkzbeYe/Sj1SSdi58oY5 dtyDtDkoe053Xy8ozdRtGg5pPasqQ3ugqoRFckwLIXb0t0PRgKSQLztRDs+3CnNefVI+ 3gjeecJHP5m61u2vJUgwTZeXB0Ef6TpbmRq0+8kye/65+oUb1tpOAd0kMBSgwr7W8Vw8 QMYSp8WxGToBsFwZJ6owVgPpLaXsvLEOoCMCufbRrlhQ00GnpD6SC/SWCnwL+05rI6/t ekzw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782134380; x=1782739180; h=cc: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=1vHrvMkNVE/P7lf/qmiQFR6fdMCpdQqFEtkh8tbhJUI=; b=DEBt3EiDp5cCDKyinSLOPoXulCxoQ+i1ixbyEh79Gs8PW4rRSVluviTe1SyXTX8VXX OONq+q/DOF5zsnxdJtwfevJhbFY22I+4LbcKKqoBNv/86VCmWMWFd3+4nn/kIIuBBLuu ybU6CzFe1O4chjy2LyhKhL8KMmpHvW8jr8hfsbTseueueFb0km28Y3SjJY+rJgZsXct4 boGcQatco0G+1EWQIjIa9S0QTN1+qwWpJJk68gkW2+JAkHx5Qwh7G7KqmPwJB2xtioFA 9eg+hYi52WeO/IkW+OkZNsVZyM8DmWRvTH3+YUxFDdS9R1aN3WynLvG83kH4wxtzGlBE eIgQ== X-Forwarded-Encrypted: i=1; AFNElJ/0YJcevfN+CbF0Tdfagm3CXrz84mo4z4d+JNK5q5UBCVz2wE3q3BFzHhyXXhn5h4NOmumug3oYVilPx4MG@lists.postgresql.org X-Gm-Message-State: AOJu0YzmMo7TNG2CwUtEqT9JiXAb6QZznrqLWGsy1bcwfg7nBzxIsVQK S9anndOXFq5tz1tSS1viaN6aqCNVyUQAG8y59c7ND+roNedJlHWMjfd6Qrif1JC9baFax5SjppW CCSjygcDiEypVhhgpuZNHdIp9E7nsxDFNyAn9L54y X-Gm-Gg: AfdE7ckZMz2EKtZn3znboLmbciWjD6qnHIu5QIUVWeh4NukpuA6Wktz3bVCP1Wldz6S Z85Da/9V2GSZIZGL6zpIBQBpeUFgkhJ5gCfPfAZ6S59rJDA2J8iSTLokG7qZkL9/SQJO6hipwnK dMuCZt7jUMKt5sVdJKDGvjd21gmk1eRvKFj6ZDdox4DOuiAhILOF9iuuBvWQIwGnwUtpKALq6Q8 KRibVybNke913GkrIdUTYMuVe838x84P76+hWVLzYKkY5AS7Fy0zzVh8vXdj+6PGgkIS/8SHMMq yGyKa3WB X-Received: by 2002:a17:907:c30c:b0:bc1:d3d2:9348 with SMTP id a640c23a62f3a-c09b8f9f017mr623289266b.20.1782134380375; Mon, 22 Jun 2026 06:19:40 -0700 (PDT) MIME-Version: 1.0 References: <177997571870.313758.10720313850275742354.pgcf@coridan.postgresql.org> In-Reply-To: From: Akshay Joshi Date: Mon, 22 Jun 2026 18:49:27 +0530 X-Gm-Features: AVVi8Cc0XtF5Ge-19_zJl-IFhoPNofkB2Gvf_cii1yW3MTn32BrYzGsDtCCZBlc Message-ID: Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement To: solai v Cc: Ilmar Y , pgsql-hackers@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000af85f50654d77ef7" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000af85f50654d77ef7 Content-Type: multipart/alternative; boundary="000000000000af85f20654d77ef5" --000000000000af85f20654d77ef5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable *Chao Li* found an issue in my other patch for *pg_get_table_ddl.* Specifically, the existing pattern in pg_proc.dat for variadic-text functions (e.g., jsonb_delete, json_extract_path) uses *_text* instead of *text* at the variadic position in both proargtypes and proallargtypes, with provariadic =3D> 'text'. This is the convention documented by the sanity check in src/test/regress/sql/opr_sanity.sql. I realized the same issue was present in this patch as well, so I have fixed it and added corresponding test cases. The v12 patch is now ready for review and commit. On Mon, Jun 22, 2026 at 6:34=E2=80=AFPM Akshay Joshi wrote: > > > On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v wro= te: > >> Hi all, >> >> >> On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li wr= ote: >> > >> > On Fri, 29 May 2026 at 12:20, Akshay Joshi < >> akshay.joshi@enterprisedb.com> wrote: >> > > Thanks for the reviews. >> > > >> > > My original patch (v9) was actually correct. After considering >> Japin's review comment, I initially thought the extra >> > > parentheses weren't necessary, but they are indeed required for >> handling boolean values properly in non-pretty mode too, >> > > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. >> > > >> > >> > My bad! I had not considered this situation. >> > >> > > `pg_get_expr()` only adds outer parentheses for composite expression= s >> (via the deparsers for `OpExpr`, `BoolExpr`, etc.). >> > > For atomic top-level nodes like `Const`, `Var`, `current_user`, >> `NULL`, etc. >> > > For example: >> > > >> > > CREATE POLICY p ON t USING (true); >> > > SELECT pg_get_policy_ddl('t', 'p'); -- previously: ... USING >> true; (syntax error) >> > > >> > > This is exactly why `pg_dump` always wraps the expression >> unconditionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477: >> > > >> > > if (polinfo->polqual !=3D NULL) >> > > appendPQExpBuffer(query, " USING (%s)", polinfo->polqual); >> > > if (polinfo->polwithcheck !=3D NULL) >> > > appendPQExpBuffer(query, " WITH CHECK (%s)", >> polinfo->polwithcheck); >> > > >> > > I've also added a round-trip regression test with `USING (true)` / >> `WITH CHECK (false)` that captures the generated DDL, >> > > drops the policies, re-executes the DDL, and verifies the policies >> are recreated. >> > > >> > > v11 Patch attached for review. >> > > >> > > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y wrote: >> > > >> > > The following review has been posted through the commitfest >> application: >> > > make installcheck-world: not tested >> > > Implements feature: tested, failed >> > > Spec compliant: not tested >> > > Documentation: not tested >> > > >> > > Hi, >> > > >> > > I looked at v10, focused on whether the generated CREATE POLICY >> statement >> > > can be executed again. >> > > >> > > The patch applies cleanly on current master at >> > > 8a86aa313a714adc56c74e4b08793e4e6102b5ca. >> > > >> > > git diff --check reports no issues. >> > > >> > > I built with: >> > > >> > > ./configure --prefix=3D"$PWD/pg-install" --without-readline >> --without-zlib --without-icu >> > > make -s -j8 >> > > make -s install >> > > >> > > make -C src/test/regress check TESTS=3Drowsecurity >> > > >> > > ended up running the full parallel_schedule in this makefile; all >> 245 tests >> > > passed, including rowsecurity. >> > > >> > > I found one correctness issue in the generated non-pretty DDL. The >> code >> > > assumes that pg_get_expr_ext(..., false) already returns the >> parentheses >> > > required by CREATE POLICY syntax, but that is not true for simple >> boolean >> > > constants. >> > > >> > > For example: >> > > >> > > CREATE TABLE t(a int); >> > > CREATE POLICY p_true ON t USING (true); >> > > SELECT ddl FROM pg_get_policy_ddl('t', 'p_true', 'pretty', 'false') >> AS ddl; >> > > >> > > returns: >> > > >> > > CREATE POLICY p_true ON public.t USING true; >> > > >> > > If I drop the policy and execute that generated statement, it fails= : >> > > >> > > ERROR: syntax error at or near "true" >> > > LINE 1: CREATE POLICY p_true ON public.t USING true; >> > > ^ >> > > >> > > The same issue reproduces for WITH CHECK: >> > > >> > > CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); >> > > >> > > is reconstructed as: >> > > >> > > CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK false; >> > > >> > > and executing it fails at "false". >> > > >> > > So I think USING and WITH CHECK need to be parenthesized in >> non-pretty mode >> > > too, or the tests should include a round-trip execution check for >> generated >> > > DDL with simple boolean expressions. >> > > >> > > I used two small SQL reproducers for the manual checks; the complet= e >> repro is >> > > included above. >> > > >> > > I have not reviewed the broader pg_get_*_ddl API design or every >> possible >> > > policy expression form. >> > > >> > > Regards, >> > > Ilmar Yunusov >> > > >> > > The new status of this patch is: Waiting on Author >> > >> >> >> I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified >> the basic functionality by creating various row-level security >> policies and checking the reconstructed DDL returned by >> pg_get_policy_ddl(). The function correctly reconstructed policies for >> different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE >> and RESTRICTIVE policies, multiple role lists, quoted identifiers, >> USING clauses, and WITH CHECK clauses. >> I also tested more complex cases involving subqueries. Policies >> containing EXISTS subqueries in both USING and WITH CHECK clauses were >> reconstructed successfully. Nested subqueries were also handled >> correctly, and I did not encounter any issues related to expression >> reconstruction or variable handling. I verified NULL input handling as >> well. Passing NULL values for the table name or policy name returned >> no rows as expected. Invalid relation names resulted in the expected >> regclass resolution error. One observation from testing is that the >> generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For >> example, a policy created with FOR ALL TO PUBLIC is reconstructed >> without those clauses, while still producing semantically equivalent >> DDL. I'm not sure whether this is intentional or if the function is >> expected to reproduce all clauses explicitly, but it may be worth >> discussing. >> Overall, the patch worked as expected in all scenarios I tested, and I >> did not find any functional issues. >> > > Thanks for the review. The omission of FOR ALL and TO PUBLIC is > intentional and matches the long-standing convention used by > pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc.: emit a claus= e > only when it differs from the parser's default. The result is semanticall= y > equivalent to the CREATE POLICY DDL. > >> >> >> Regards, >> Solai >> > --000000000000af85f20654d77ef5 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Chao Li found an issue in my other patch for pg_= get_table_ddl.=C2=A0Specifically, the existing pattern in pg_proc.dat f= or variadic-text functions (e.g., jsonb_delete, json_extract_path) uses = _text=C2=A0instead of text at the variadic position in both proa= rgtypes and proallargtypes, with provariadic =3D> 'text'. This i= s the convention documented by the sanity check in src/test/regress/sql/opr= _sanity.sql.

I realized the same issue was present in this patch as = well, so I have fixed it and added corresponding test cases.

The v12= patch is now ready for review and commit.

On Mon, Jun= 22, 2026 at 6:34=E2=80=AFPM Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
<= blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-l= eft:1px solid rgb(204,204,204);padding-left:1ex">


On Mon, Jun 8, 2026 at 6:10=E2=80=AFPM solai v <solai.cdac@gmail.com>= wrote:
Hi all,<= br>

On Mon, Jun 8, 2026 at 5:32=E2=80=AFPM Japin Li <japinli@hotmail.com> wrote:
>
> On Fri, 29 May 2026 at 12:20, Akshay Joshi <akshay.joshi@enterprisedb.com> wrote:
> > Thanks for the reviews.
> >
> > My original patch (v9) was actually correct. After considering Ja= pin's review comment, I initially thought the extra
> > parentheses weren't necessary, but they are indeed required f= or handling boolean values properly in non-pretty mode too,
> > so I kept them in USING (%s) / WITH CHECK (%s) for both modes. > >
>
> My bad!=C2=A0 I had not considered this situation.
>
> > `pg_get_expr()` only adds outer parentheses for composite express= ions (via the deparsers for `OpExpr`, `BoolExpr`, etc.).
> > For atomic top-level nodes like `Const`, `Var`, `current_user`, `= NULL`, etc.
> > For example:
> >
> >=C2=A0 =C2=A0 =C2=A0CREATE POLICY p ON t USING (true);
> >=C2=A0 =C2=A0 =C2=A0SELECT pg_get_policy_ddl('t', 'p&#= 39;);=C2=A0 -- previously: ... USING true;=C2=A0 (syntax error)
> >
> > This is exactly why `pg_dump` always wraps the expression uncondi= tionally; see `src/bin/pg_dump/pg_dump.c`:4473-4477:
> >
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polqual !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = USING (%s)", polinfo->polqual);
> >=C2=A0 =C2=A0 =C2=A0if (polinfo->polwithcheck !=3D NULL)
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0appendPQExpBuffer(query, " = WITH CHECK (%s)", polinfo->polwithcheck);
> >
> > I've also added a round-trip regression test with `USING (tru= e)` / `WITH CHECK (false)` that captures the generated DDL,
> > drops the policies, re-executes the DDL, and verifies the policie= s are recreated.
> >
> > v11 Patch attached for review.
> >
> > On Thu, May 28, 2026 at 7:12=E2=80=AFPM Ilmar Y <
tanswis42@gmail.com> wro= te:
> >
> >=C2=A0 The following review has been posted through the commitfest= application:
> >=C2=A0 make installcheck-world:=C2=A0 not tested
> >=C2=A0 Implements feature:=C2=A0 =C2=A0 =C2=A0 =C2=A0tested, faile= d
> >=C2=A0 Spec compliant:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0not= tested
> >=C2=A0 Documentation:=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 not= tested
> >
> >=C2=A0 Hi,
> >
> >=C2=A0 I looked at v10, focused on whether the generated CREATE PO= LICY statement
> >=C2=A0 can be executed again.
> >
> >=C2=A0 The patch applies cleanly on current master at
> >=C2=A0 8a86aa313a714adc56c74e4b08793e4e6102b5ca.
> >
> >=C2=A0 git diff --check reports no issues.
> >
> >=C2=A0 I built with:
> >
> >=C2=A0 ./configure --prefix=3D"$PWD/pg-install" --withou= t-readline --without-zlib --without-icu
> >=C2=A0 make -s -j8
> >=C2=A0 make -s install
> >
> >=C2=A0 make -C src/test/regress check TESTS=3Drowsecurity
> >
> >=C2=A0 ended up running the full parallel_schedule in this makefil= e; all 245 tests
> >=C2=A0 passed, including rowsecurity.
> >
> >=C2=A0 I found one correctness issue in the generated non-pretty D= DL.=C2=A0 The code
> >=C2=A0 assumes that pg_get_expr_ext(..., false) already returns th= e parentheses
> >=C2=A0 required by CREATE POLICY syntax, but that is not true for = simple boolean
> >=C2=A0 constants.
> >
> >=C2=A0 For example:
> >
> >=C2=A0 CREATE TABLE t(a int);
> >=C2=A0 CREATE POLICY p_true ON t USING (true);
> >=C2=A0 SELECT ddl FROM pg_get_policy_ddl('t', 'p_true&= #39;, 'pretty', 'false') AS ddl;
> >
> >=C2=A0 returns:
> >
> >=C2=A0 CREATE POLICY p_true ON public.t USING true;
> >
> >=C2=A0 If I drop the policy and execute that generated statement, = it fails:
> >
> >=C2=A0 ERROR:=C2=A0 syntax error at or near "true"
> >=C2=A0 LINE 1: CREATE POLICY p_true ON public.t USING true;
> >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^
> >
> >=C2=A0 The same issue reproduces for WITH CHECK:
> >
> >=C2=A0 CREATE POLICY p_check ON t FOR INSERT WITH CHECK (false); > >
> >=C2=A0 is reconstructed as:
> >
> >=C2=A0 CREATE POLICY p_check ON public.t FOR INSERT WITH CHECK fal= se;
> >
> >=C2=A0 and executing it fails at "false".
> >
> >=C2=A0 So I think USING and WITH CHECK need to be parenthesized in= non-pretty mode
> >=C2=A0 too, or the tests should include a round-trip execution che= ck for generated
> >=C2=A0 DDL with simple boolean expressions.
> >
> >=C2=A0 I used two small SQL reproducers for the manual checks; the= complete repro is
> >=C2=A0 included above.
> >
> >=C2=A0 I have not reviewed the broader pg_get_*_ddl API design or = every possible
> >=C2=A0 policy expression form.
> >
> >=C2=A0 Regards,
> >=C2=A0 Ilmar Yunusov
> >
> >=C2=A0 The new status of this patch is: Waiting on Author
>


I reviewed and tested the V11 pg_get_policy_ddl() patch. I verified
the basic functionality by creating various row-level security
policies and checking the reconstructed DDL returned by
pg_get_policy_ddl(). The function correctly reconstructed policies for
different command types (SELECT, INSERT, UPDATE, DELETE), PERMISSIVE
and RESTRICTIVE policies, multiple role lists, quoted identifiers,
USING clauses, and WITH CHECK clauses.
I also tested more complex cases involving subqueries. Policies
containing EXISTS subqueries in both USING and WITH CHECK clauses were
reconstructed successfully. Nested subqueries were also handled
correctly, and I did not encounter any issues related to expression
reconstruction or variable handling. I verified NULL input handling as
well. Passing NULL values for the table name or policy name returned
no rows as expected. Invalid relation names resulted in the expected
regclass resolution error. One observation from testing is that the
generated DDL omits default clauses such as FOR ALL and TO PUBLIC. For
example, a policy created with FOR ALL TO PUBLIC is reconstructed
without those clauses, while still producing semantically equivalent
DDL. I'm not sure whether this is intentional or if the function is
expected to reproduce all clauses explicitly, but it may be worth
discussing.
Overall, the patch worked as expected in all scenarios I tested, and I
did not find any functional issues.

Thanks for the review. The omissi= on of FOR ALL and TO PUBLIC is intentional and matches the long-standing co= nvention used by pg_get_indexdef, pg_get_constraintdef, pg_get_viewdef, etc= .: emit a clause only when it differs from the parser's default. The re= sult is semantically equivalent to the CREATE POLICY DDL.=C2=A0


Regards,
Solai
--000000000000af85f20654d77ef5-- --000000000000af85f50654d77ef7 Content-Type: application/octet-stream; name="v12-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v12-0001-Add-pg_get_policy_ddl-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mqp8sa3e0 RnJvbSBlMWQwYjY1NGI2NTE3ZGYyMjcwYzNhODNmZTY0ZjZkY2JhM2MwODIxIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDIyIE1heSAyMDI2IDE4OjE4OjA3ICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2MTJdIEFkZCBwZ19nZXRfcG9saWN5X2RkbCgpIHRvIHJlY29uc3RydWN0IENSRUFURSBQ T0xJQ1kKIHN0YXRlbWVudHMKClRoaXMgcGF0Y2ggaW50cm9kdWNlcyBhIG5ldyBzeXN0ZW0gZnVu Y3Rpb246CgogIHBnX2dldF9wb2xpY3lfZGRsKHRhYmxlIHJlZ2NsYXNzLAogICAgICAgICAgICAg ICAgICAgIHBvbGljeV9uYW1lIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgb3B0 aW9ucyB0ZXh0W10pCiAgUkVUVVJOUyBTRVRPRiB0ZXh0Cgp3aGljaCByZWNvbnN0cnVjdHMgdGhl IENSRUFURSBQT0xJQ1kgc3RhdGVtZW50IGZvciB0aGUgbmFtZWQgcm93LWxldmVsCnNlY3VyaXR5 IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlLiAgQWx0aG91Z2ggYSBzaW5nbGUgc3RhdGVt ZW50IGlzCnByb2R1Y2VkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIFNFVE9GIHRleHQgcmVzdWx0 IHNvIGl0cyBjYWxsaW5nCmNvbnZlbnRpb24gbWF0Y2hlcyB0aGUgcmVzdCBvZiB0aGUgcGdfZ2V0 XypfZGRsIGZhbWlseS4KClRoZSByZWNvbnN0cnVjdGVkIERETCBpbmNsdWRlcyB0aGUgcG9saWN5 J3MgcGVybWlzc2l2ZW5lc3MgKEFTClJFU1RSSUNUSVZFKSwgY29tbWFuZCAoRk9SIFNFTEVDVC9J TlNFUlQvVVBEQVRFL0RFTEVURSksIHJvbGUgbGlzdCAoVE8KPHJvbGVzPiksIFVTSU5HIHF1YWxp ZmljYXRpb24sIGFuZCBXSVRIIENIRUNLIGV4cHJlc3Npb24uICBDbGF1c2VzCndob3NlIHZhbHVl IGVxdWFscyB0aGUgcGFyc2VyJ3MgZGVmYXVsdCAtLSBQRVJNSVNTSVZFLCBGT1IgQUxMLCBhbmQK VE8gUFVCTElDIC0tIGFyZSBvbWl0dGVkIGZyb20gdGhlIG91dHB1dCwgbWF0Y2hpbmcgdGhlIGNv bnZlbnRpb24gdXNlZApieSBwZ19nZXRfaW5kZXhkZWYsIHBnX2dldF9jb25zdHJhaW50ZGVmLCBw Z19nZXRfdmlld2RlZiwgYW5kIHNpbWlsYXIKZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBpcyB0aGVy ZWZvcmUgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gdGhlCm9yaWdpbmFsIERETCwgbm90IGxl eGljYWxseSBpZGVudGljYWwuCgpPcHRpb25zIGFyZSBwYXNzZWQgYXMgYWx0ZXJuYXRpbmcgbmFt ZS92YWx1ZSB0ZXh0IHBhaXJzIHZpYSB0aGUKVkFSSUFESUMgYXJndW1lbnQ7IHRoZSBzdXBwb3J0 ZWQgb3B0aW9uIGlzOgoKICBwcmV0dHkgKGJvb2xlYW4pIC0tIGZvcm1hdCB0aGUgb3V0cHV0IGZv ciByZWFkYWJpbGl0eS4KCk5VTEwgaW5wdXRzIGZvciB0aGUgdGFibGUgb3IgcG9saWN5IG5hbWUg eWllbGQgbm8gcm93cy4gIEFuIGludmFsaWQKcmVsYXRpb24gbmFtZSBzdXJmYWNlcyB0aGUgcmVn Y2xhc3MgcmVzb2x1dGlvbiBlcnJvcjsgYSBub24tZXhpc3RlbnQKcG9saWN5IHJhaXNlcyBhbiBl eHBsaWNpdCAicG9saWN5IC4uLiBkb2VzIG5vdCBleGlzdCIgZXJyb3IuICBPcHRpb24KcGFyc2lu ZyByZWplY3RzIHVucmVjb2duaXplZCBuYW1lcywgaW52YWxpZCBib29sZWFuIHZhbHVlcywgZHVw bGljYXRlCm9wdGlvbnMsIGFuZCBhbiBvZGQgbnVtYmVyIG9mIHZhcmlhZGljIGFyZ3VtZW50cy4K ClVzYWdlIGV4YW1wbGVzOgoKICAtLSBjb21wYWN0IGZvcm0gKGRlZmF1bHQpCiAgU0VMRUNUICog RlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3BvbDEnKTsKICBTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKDE2NTY0LCAncG9sMScpOwoKICAtLSBwcmV0dHktcHJpbnRl ZCBmb3JtCiAgU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3Bv bDEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByZXR0eScsICd0cnVlJyk7 CgogIC0tIG9wdGlvbnMgc3VwcGxpZWQgYXMgYSBjb25zdHJ1Y3RlZCBhcnJheQogIFNFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YWJsZScsICdwb2wxJywKICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCd0cnVlJ10pOwoK UmVncmVzc2lvbiBjb3ZlcmFnZSBpcyBhZGRlZCB0byBzcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dz ZWN1cml0eS5zcWwKYW5kIGV4ZXJjaXNlcyBQRVJNSVNTSVZFL1JFU1RSSUNUSVZFIHBvbGljaWVz LCBhbGwgRk9SIGNvbW1hbmQKdmFyaWFudHMsIG11bHRpLXJvbGUgVE8gbGlzdHMsIHN1YnF1ZXJ5 IGV4cHJlc3Npb25zIGluIFVTSU5HIGFuZApXSVRIIENIRUNLLCBwcmV0dHkgYW5kIG5vbi1wcmV0 dHkgb3V0cHV0LCBOVUxMIGFuZCBlcnJvciBwYXRocywgdGhlClZBUklBRElDIEFSUkFZWy4uLl0g Y2FsbCBzeW50YXgsIGFuZCBhIHJvdW5kLXRyaXAgdGVzdCB0aGF0IGRyb3BzCmFuZCByZS1leGVj dXRlcyB0aGUgZ2VuZXJhdGVkIERETC4KCkF1dGhvcjogQWtzaGF5IEpvc2hpIDxha3NoYXkuam9z aGlAZW50ZXJwcmlzZWRiLmNvbT4KLS0tCiBkb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dt bCAgICAgICAgICB8ICAyMCArKwogc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMgICAg ICAgICAgfCAyNjIgKysrKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0ICAgICAgICAgICB8ICAgOCArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jv d3NlY3VyaXR5Lm91dCB8IDI3MSArKysrKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdy ZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgICAgICB8IDEyNiArKysrKysrKysrCiA1IGZpbGVzIGNo YW5nZWQsIDY4NyBpbnNlcnRpb25zKCspCgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL2Z1bmMv ZnVuYy1pbmZvLnNnbWwgYi9kb2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbAppbmRleCA4 ZmZhN2U4MzI3NS4uMWNmNDk4Y2I0NTQgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9mdW5jL2Z1 bmMtaW5mby5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMtaW5mby5zZ21sCkBAIC0z OTQ3LDYgKzM5NDcsMjYgQEAgYWNsICAgICAgfCB7cG9zdGdyZXM9YXJ3ZER4dG0vcG9zdGdyZXMs Zm9vPXIvcG9zdGdyZXN9CiAgICAgICAgIDxsaXRlcmFsPlRBQkxFU1BBQ0U8L2xpdGVyYWw+Lgog ICAgICAgIDwvcGFyYT48L2VudHJ5PgogICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAg IDxlbnRyeSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVy ZSI+CisgICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcG9saWN5 X2RkbDwvcHJpbWFyeT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5w Z19nZXRfcG9saWN5X2RkbDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwv cGFyYW1ldGVyPiA8dHlwZT5yZWdjbGFzczwvdHlwZT4sCisgICAgICAgIDxwYXJhbWV0ZXI+cG9s aWN5X25hbWU8L3BhcmFtZXRlcj4gPHR5cGU+bmFtZTwvdHlwZT4KKyAgICAgICAgPG9wdGlvbmFs PiwgPGxpdGVyYWw+VkFSSUFESUM8L2xpdGVyYWw+IDxwYXJhbWV0ZXI+b3B0aW9uczwvcGFyYW1l dGVyPgorICAgICAgICA8dHlwZT50ZXh0PC90eXBlPiA8L29wdGlvbmFsPiApCisgICAgICAgIDxy ZXR1cm52YWx1ZT5zZXRvZiB0ZXh0PC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAg ICAgPHBhcmE+CisgICAgICAgIFJlY29uc3RydWN0cyB0aGUgPGNvbW1hbmQ+Q1JFQVRFIFBPTElD WTwvY29tbWFuZD4gc3RhdGVtZW50IGZvciB0aGUKKyAgICAgICAgbmFtZWQgcm93LWxldmVsIHNl Y3VyaXR5IHBvbGljeSBvbiB0aGUgc3BlY2lmaWVkIHRhYmxlLiAgVGhlIHJlc3VsdAorICAgICAg ICBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSByb3cuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgb3B0 aW9uIGlzIHN1cHBvcnRlZDogPGxpdGVyYWw+cHJldHR5PC9saXRlcmFsPgorICAgICAgICAoYm9v bGVhbikgZm9yIGZvcm1hdHRlZCBvdXRwdXQuCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAg ICA8L3Jvdz4KICAgICAgPC90Ym9keT4KICAgICA8L3Rncm91cD4KICAgIDwvdGFibGU+CmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvZGRsdXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0 aWxzL2FkdC9kZGx1dGlscy5jCmluZGV4IGYzMmZjZDQ1M2VmLi43MjhkMzY0ODk3OSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L2RkbHV0aWxzLmMKKysrIGIvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L2RkbHV0aWxzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjYXRhbG9n L3BnX2NvbGxhdGlvbi5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfZGF0YWJhc2UuaCIKICNpbmNs dWRlICJjYXRhbG9nL3BnX2RiX3JvbGVfc2V0dGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf cG9saWN5LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190YWJsZXNwYWNlLmgiCiAjaW5jbHVkZSAi Y29tbWFuZHMvdGFibGVzcGFjZS5oIgogI2luY2x1ZGUgImNvbW1vbi9yZWxwYXRoLmgiCkBAIC04 Niw2ICs4Nyw5IEBAIHN0YXRpYyBMaXN0ICpwZ19nZXRfdGFibGVzcGFjZV9kZGxfaW50ZXJuYWwo T2lkIHRzaWQsIGJvb2wgcHJldHR5LCBib29sIG5vX293bmVyCiBzdGF0aWMgRGF0dW0gcGdfZ2V0 X3RhYmxlc3BhY2VfZGRsX3NyZihGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbywgT2lkIHRzaWQsIGJv b2wgaXNudWxsKTsKIHN0YXRpYyBMaXN0ICpwZ19nZXRfZGF0YWJhc2VfZGRsX2ludGVybmFsKE9p ZCBkYmlkLCBib29sIHByZXR0eSwKIAkJCQkJCQkJCQkgIGJvb2wgbm9fb3duZXIsIGJvb2wgbm9f dGFibGVzcGFjZSk7CitzdGF0aWMgTGlzdCAqcGdfZ2V0X3BvbGljeV9kZGxfaW50ZXJuYWwoT2lk IHRhYmxlSUQsIGNvbnN0IGNoYXIgKnBvbGljeU5hbWUsCisJCQkJCQkJCQkJYm9vbCBwcmV0dHkp Oworc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wb2xpY3lfY21kX25hbWUoY2hhciBjbWQpOwogCiAK IC8qCkBAIC0xMTg1LDMgKzExODksMjYxIEBAIHBnX2dldF9kYXRhYmFzZV9kZGwoUEdfRlVOQ1RJ T05fQVJHUykKIAkJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOwogCX0KIH0KKworLyoKKyAqIGdl dF9wb2xpY3lfY21kX25hbWUKKyAqCQlNYXAgYSBwZ19wb2xpY3kucG9sY21kIGNoYXIgdG8gaXRz IFNRTCBrZXl3b3JkLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitnZXRfcG9saWN5X2NtZF9u YW1lKGNoYXIgY21kKQoreworCXN3aXRjaCAoY21kKQorCXsKKwkJY2FzZSAnKic6CisJCQlyZXR1 cm4gIkFMTCI7CisJCWNhc2UgQUNMX1NFTEVDVF9DSFI6CisJCQlyZXR1cm4gIlNFTEVDVCI7CisJ CWNhc2UgQUNMX0lOU0VSVF9DSFI6CisJCQlyZXR1cm4gIklOU0VSVCI7CisJCWNhc2UgQUNMX1VQ REFURV9DSFI6CisJCQlyZXR1cm4gIlVQREFURSI7CisJCWNhc2UgQUNMX0RFTEVURV9DSFI6CisJ CQlyZXR1cm4gIkRFTEVURSI7CisJCWRlZmF1bHQ6CisJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25p emVkIHBvbGljeSBjb21tYW5kOiAlZCIsIChpbnQpIGNtZCk7CisJfQorfQorCisvKgorICogcGdf Z2V0X3BvbGljeV9kZGxfaW50ZXJuYWwKKyAqCQlHZW5lcmF0ZSB0aGUgRERMIHN0YXRlbWVudCB0 byByZWNyZWF0ZSBhIHJvdy1sZXZlbCBzZWN1cml0eSBwb2xpY3kuCisgKgorICogUmV0dXJucyBh IExpc3QgY29udGFpbmluZyBhIHNpbmdsZSBwYWxsb2MnZCBzdHJpbmcgd2l0aCB0aGUgQ1JFQVRF IFBPTElDWQorICogc3RhdGVtZW50LiAgUmV0dXJuaW5nIGEgTGlzdCBrZWVwcyB0aGUgY2FsbGlu ZyBjb252ZW50aW9uIGNvbnNpc3RlbnQgd2l0aAorICogdGhlIHJlc3Qgb2YgdGhlIHBnX2dldF8q X2RkbCBmYW1pbHkgZXZlbiB0aG91Z2ggb25seSBvbmUgcm93IGlzIHByb2R1Y2VkLgorICovCitz dGF0aWMgTGlzdCAqCitwZ19nZXRfcG9saWN5X2RkbF9pbnRlcm5hbChPaWQgdGFibGVJRCwgY29u c3QgY2hhciAqcG9saWN5TmFtZSwgYm9vbCBwcmV0dHkpCit7CisJUmVsYXRpb24JcGdQb2xpY3lS ZWw7CisJSGVhcFR1cGxlCXR1cGxlUG9saWN5OworCUZvcm1fcGdfcG9saWN5IHBvbGljeUZvcm07 CisJU2NhbktleURhdGEgc2tleVsyXTsKKwlTeXNTY2FuRGVzYyBzc2NhbjsKKwlTdHJpbmdJbmZv RGF0YSBidWY7CisJRGF0dW0JCXZhbHVlRGF0dW07CisJYm9vbAkJYXR0cklzTnVsbDsKKwljaGFy CSAgICp0YXJnZXRUYWJsZTsKKwlMaXN0CSAgICpzdGF0ZW1lbnRzID0gTklMOworCisJLyogVmFs aWRhdGUgdGhhdCB0aGUgcmVsYXRpb24gZXhpc3RzICovCisJeworCQljaGFyCSAgICpyZWxuYW1l ID0gZ2V0X3JlbF9uYW1lKHRhYmxlSUQpOworCQljaGFyCSAgICpuc3BuYW1lOworCisJCWlmIChy ZWxuYW1lID09IE5VTEwpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RF X1VOREVGSU5FRF9UQUJMRSksCisJCQkJCSBlcnJtc2coInJlbGF0aW9uIHdpdGggT0lEICV1IGRv ZXMgbm90IGV4aXN0IiwgdGFibGVJRCkpKTsKKworCQluc3BuYW1lID0gZ2V0X25hbWVzcGFjZV9u YW1lKGdldF9yZWxfbmFtZXNwYWNlKHRhYmxlSUQpKTsKKwkJaWYgKG5zcG5hbWUgPT0gTlVMTCkK KwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfVU5ERUZJTkVEX1NDSEVN QSksCisJCQkJCSBlcnJtc2coInNjaGVtYSBmb3IgcmVsYXRpb24gd2l0aCBPSUQgJXUgZG9lcyBu b3QgZXhpc3QiLAorCQkJCQkJCXRhYmxlSUQpKSk7CisKKwkJdGFyZ2V0VGFibGUgPSBxdW90ZV9x dWFsaWZpZWRfaWRlbnRpZmllcihuc3BuYW1lLCByZWxuYW1lKTsKKwkJcGZyZWUocmVsbmFtZSk7 CisJCXBmcmVlKG5zcG5hbWUpOworCX0KKworCXBnUG9saWN5UmVsID0gdGFibGVfb3BlbihQb2xp Y3lSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJLyogU2V0IGtleSAtIHBvbGljeSdz IHJlbGF0aW9uIGlkLiAqLworCVNjYW5LZXlJbml0KCZza2V5WzBdLAorCQkJCUFudW1fcGdfcG9s aWN5X3BvbHJlbGlkLAorCQkJCUJURXF1YWxTdHJhdGVneU51bWJlciwgRl9PSURFUSwKKwkJCQlP YmplY3RJZEdldERhdHVtKHRhYmxlSUQpKTsKKworCS8qIFNldCBrZXkgLSBwb2xpY3kncyBuYW1l LiAqLworCVNjYW5LZXlJbml0KCZza2V5WzFdLAorCQkJCUFudW1fcGdfcG9saWN5X3BvbG5hbWUs CisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX05BTUVFUSwKKwkJCQlDU3RyaW5nR2V0RGF0 dW0ocG9saWN5TmFtZSkpOworCisJc3NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdQb2xpY3lS ZWwsCisJCQkJCQkJICAgUG9saWN5UG9scmVsaWRQb2xuYW1lSW5kZXhJZCwgdHJ1ZSwgTlVMTCwg MiwKKwkJCQkJCQkgICBza2V5KTsKKworCXR1cGxlUG9saWN5ID0gc3lzdGFibGVfZ2V0bmV4dChz c2Nhbik7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlUG9saWN5KSkKKwkJZXJlcG9ydChF UlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1QpLAorCQkJCSBlcnJt c2coInBvbGljeSBcIiVzXCIgZm9yIHRhYmxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisJCQkJ CQlwb2xpY3lOYW1lLCB0YXJnZXRUYWJsZSkpKTsKKworCXBvbGljeUZvcm0gPSAoRm9ybV9wZ19w b2xpY3kpIEdFVFNUUlVDVCh0dXBsZVBvbGljeSk7CisKKwlpbml0U3RyaW5nSW5mbygmYnVmKTsK KworCS8qIEJ1aWxkIHRoZSBDUkVBVEUgUE9MSUNZIHN0YXRlbWVudCAqLworCWFwcGVuZFN0cmlu Z0luZm8oJmJ1ZiwgIkNSRUFURSBQT0xJQ1kgJXMgT04gJXMiLAorCQkJCQkgcXVvdGVfaWRlbnRp Zmllcihwb2xpY3lOYW1lKSwKKwkJCQkJIHRhcmdldFRhYmxlKTsKKworCS8qCisJICogRW1pdCBB UyBSRVNUUklDVElWRSBvbmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZhdWx0IChQRVJN SVNTSVZFKS4KKwkgKi8KKwlpZiAoIXBvbGljeUZvcm0tPnBvbHBlcm1pc3NpdmUpCisJCWFwcGVu ZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIkFTIFJFU1RSSUNUSVZFIik7CisKKwkvKgor CSAqIEVtaXQgRk9SIDxjbWQ+IG9ubHkgd2hlbiBpdCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQg KEFMTCwgZW5jb2RlZCBhcworCSAqICcqJykuCisJICovCisJaWYgKHBvbGljeUZvcm0tPnBvbGNt ZCAhPSAnKicpCisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIkZPUiAlcyIs CisJCQkJCQkgIGdldF9wb2xpY3lfY21kX25hbWUocG9saWN5Rm9ybS0+cG9sY21kKSk7CisKKwkv KgorCSAqIEVtaXQgVE8gPHJvbGVzPiBvbmx5IHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBkZWZh dWx0IChQVUJMSUMpLiAgUFVCTElDCisJICogaXMgZW5jb2RlZCBpbiBwb2xyb2xlcyBhcyBhIHNp bmdsZSBJbnZhbGlkT2lkIGVsZW1lbnQsIHNvIHdlIG9taXQgdGhlCisJICogY2xhdXNlIHdoZW5l dmVyIGV2ZXJ5IGVudHJ5IGlzIEludmFsaWRPaWQuCisJICovCisJdmFsdWVEYXR1bSA9IGhlYXBf Z2V0YXR0cih0dXBsZVBvbGljeSwKKwkJCQkJCQkgIEFudW1fcGdfcG9saWN5X3BvbHJvbGVzLAor CQkJCQkJCSAgUmVsYXRpb25HZXREZXNjcihwZ1BvbGljeVJlbCksCisJCQkJCQkJICAmYXR0cklz TnVsbCk7CisJaWYgKCFhdHRySXNOdWxsKQorCXsKKwkJQXJyYXlUeXBlICAqcG9saWN5X3JvbGVz ID0gRGF0dW1HZXRBcnJheVR5cGVQQ29weSh2YWx1ZURhdHVtKTsKKwkJaW50CQkJbml0ZW1zID0g QVJSX0RJTVMocG9saWN5X3JvbGVzKVswXTsKKwkJT2lkCQkgICAqcm9sZXMgPSAoT2lkICopIEFS Ul9EQVRBX1BUUihwb2xpY3lfcm9sZXMpOworCQlTdHJpbmdJbmZvRGF0YSByb2xlX25hbWVzOwor CisJCWluaXRTdHJpbmdJbmZvKCZyb2xlX25hbWVzKTsKKworCQlmb3IgKGludCBpID0gMDsgaSA8 IG5pdGVtczsgaSsrKQorCQl7CisJCQlpZiAoT2lkSXNWYWxpZChyb2xlc1tpXSkpCisJCQl7CisJ CQkJY2hhcgkgICAqcm9sZW5hbWUgPSBHZXRVc2VyTmFtZUZyb21JZChyb2xlc1tpXSwgZmFsc2Up OworCisJCQkJaWYgKHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0 cmluZygmcm9sZV9uYW1lcywgIiwgIik7CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmcm9s ZV9uYW1lcywgcXVvdGVfaWRlbnRpZmllcihyb2xlbmFtZSkpOworCQkJfQorCQl9CisKKwkJaWYg KHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwg NCwgIlRPICVzIiwgcm9sZV9uYW1lcy5kYXRhKTsKKworCQlwZnJlZShyb2xlX25hbWVzLmRhdGEp OworCQlwZnJlZShwb2xpY3lfcm9sZXMpOworCX0KKworCS8qIFVTSU5HIGV4cHJlc3Npb24gKi8K Kwl2YWx1ZURhdHVtID0gaGVhcF9nZXRhdHRyKHR1cGxlUG9saWN5LAorCQkJCQkJCSAgQW51bV9w Z19wb2xpY3lfcG9scXVhbCwKKwkJCQkJCQkgIFJlbGF0aW9uR2V0RGVzY3IocGdQb2xpY3lSZWwp LAorCQkJCQkJCSAgJmF0dHJJc051bGwpOworCWlmICghYXR0cklzTnVsbCkKKwl7CisJCURhdHVt CQlleHByOworCisJCWV4cHIgPSBEaXJlY3RGdW5jdGlvbkNhbGwzKHBnX2dldF9leHByX2V4dCwK KwkJCQkJCQkJICAgdmFsdWVEYXR1bSwKKwkJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShwb2xp Y3lGb3JtLT5wb2xyZWxpZCksCisJCQkJCQkJCSAgIEJvb2xHZXREYXR1bShwcmV0dHkpKTsKKwkJ YXBwZW5kX2RkbF9vcHRpb24oJmJ1ZiwgcHJldHR5LCA0LCAiVVNJTkcgKCVzKSIsCisJCQkJCQkg IFRleHREYXR1bUdldENTdHJpbmcoZXhwcikpOworCX0KKworCS8qIFdJVEggQ0hFQ0sgZXhwcmVz c2lvbiAqLworCXZhbHVlRGF0dW0gPSBoZWFwX2dldGF0dHIodHVwbGVQb2xpY3ksCisJCQkJCQkJ ICBBbnVtX3BnX3BvbGljeV9wb2x3aXRoY2hlY2ssCisJCQkJCQkJICBSZWxhdGlvbkdldERlc2Ny KHBnUG9saWN5UmVsKSwKKwkJCQkJCQkgICZhdHRySXNOdWxsKTsKKwlpZiAoIWF0dHJJc051bGwp CisJeworCQlEYXR1bQkJZXhwcjsKKworCQlleHByID0gRGlyZWN0RnVuY3Rpb25DYWxsMyhwZ19n ZXRfZXhwcl9leHQsCisJCQkJCQkJCSAgIHZhbHVlRGF0dW0sCisJCQkJCQkJCSAgIE9iamVjdElk R2V0RGF0dW0ocG9saWN5Rm9ybS0+cG9scmVsaWQpLAorCQkJCQkJCQkgICBCb29sR2V0RGF0dW0o cHJldHR5KSk7CisJCWFwcGVuZF9kZGxfb3B0aW9uKCZidWYsIHByZXR0eSwgNCwgIldJVEggQ0hF Q0sgKCVzKSIsCisJCQkJCQkgIFRleHREYXR1bUdldENTdHJpbmcoZXhwcikpOworCX0KKworCWFw cGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICc7Jyk7CisKKwlzdGF0ZW1lbnRzID0gbGFwcGVuZChz dGF0ZW1lbnRzLCBwc3RyZHVwKGJ1Zi5kYXRhKSk7CisKKwlzeXN0YWJsZV9lbmRzY2FuKHNzY2Fu KTsKKwl0YWJsZV9jbG9zZShwZ1BvbGljeVJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlwZnJlZShi dWYuZGF0YSk7CisKKwlyZXR1cm4gc3RhdGVtZW50czsKK30KKworLyoKKyAqIHBnX2dldF9wb2xp Y3lfZGRsCisgKgkJUmV0dXJuIERETCB0byByZWNyZWF0ZSBhIHJvdy1sZXZlbCBzZWN1cml0eSBw b2xpY3kgYXMgYSBzaW5nbGUgdGV4dCByb3cuCisgKi8KK0RhdHVtCitwZ19nZXRfcG9saWN5X2Rk bChQR19GVU5DVElPTl9BUkdTKQoreworCUZ1bmNDYWxsQ29udGV4dCAqZnVuY2N0eDsKKwlMaXN0 CSAgICpzdGF0ZW1lbnRzOworCisJaWYgKFNSRl9JU19GSVJTVENBTEwoKSkKKwl7CisJCU1lbW9y eUNvbnRleHQgb2xkY29udGV4dDsKKwkJT2lkCQkJdGFibGVJRDsKKwkJTmFtZQkJcG9saWN5TmFt ZTsKKwkJRGRsT3B0aW9uCW9wdHNbXSA9IHsKKwkJCXsicHJldHR5IiwgRERMX09QVF9CT09MfSwK KwkJfTsKKworCQlmdW5jY3R4ID0gU1JGX0ZJUlNUQ0FMTF9JTklUKCk7CisJCW9sZGNvbnRleHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZnVuY2N0eC0+bXVsdGlfY2FsbF9tZW1vcnlfY3R4KTsK KworCQlpZiAoUEdfQVJHSVNOVUxMKDApIHx8IFBHX0FSR0lTTlVMTCgxKSkKKwkJeworCQkJTWVt b3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCQkJU1JGX1JFVFVSTl9ET05FKGZ1bmNj dHgpOworCQl9CisKKwkJdGFibGVJRCA9IFBHX0dFVEFSR19PSUQoMCk7CisJCXBvbGljeU5hbWUg PSBQR19HRVRBUkdfTkFNRSgxKTsKKworCQlwYXJzZV9kZGxfb3B0aW9ucyhmY2luZm8sIDIsIG9w dHMsIGxlbmd0aG9mKG9wdHMpKTsKKworCQlzdGF0ZW1lbnRzID0gcGdfZ2V0X3BvbGljeV9kZGxf aW50ZXJuYWwodGFibGVJRCwKKwkJCQkJCQkJCQkJCU5hbWVTdHIoKnBvbGljeU5hbWUpLAorCQkJ CQkJCQkJCQkJb3B0c1swXS5pc3NldCAmJiBvcHRzWzBdLmJvb2x2YWwpOworCQlmdW5jY3R4LT51 c2VyX2ZjdHggPSBzdGF0ZW1lbnRzOworCQlmdW5jY3R4LT5tYXhfY2FsbHMgPSBsaXN0X2xlbmd0 aChzdGF0ZW1lbnRzKTsKKworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY29udGV4dCk7CisJ fQorCisJZnVuY2N0eCA9IFNSRl9QRVJDQUxMX1NFVFVQKCk7CisJc3RhdGVtZW50cyA9IChMaXN0 ICopIGZ1bmNjdHgtPnVzZXJfZmN0eDsKKworCWlmIChmdW5jY3R4LT5jYWxsX2NudHIgPCBmdW5j Y3R4LT5tYXhfY2FsbHMpCisJeworCQljaGFyCSAgICpzdG10OworCisJCXN0bXQgPSBsaXN0X250 aChzdGF0ZW1lbnRzLCBmdW5jY3R4LT5jYWxsX2NudHIpOworCisJCVNSRl9SRVRVUk5fTkVYVChm dW5jY3R4LCBDU3RyaW5nR2V0VGV4dERhdHVtKHN0bXQpKTsKKwl9CisJZWxzZQorCXsKKwkJbGlz dF9mcmVlX2RlZXAoc3RhdGVtZW50cyk7CisJCVNSRl9SRVRVUk5fRE9ORShmdW5jY3R4KTsKKwl9 Cit9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0IGIvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCBiZTE1N2E1ZmJlOS4uMWEzMjQxMzAwY2Eg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKKysrIGIvc3JjL2lu Y2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdApAQCAtODYxNSw2ICs4NjE1LDE0IEBACiAgIHByb2Fy Z3R5cGVzID0+ICdyZWdkYXRhYmFzZSB0ZXh0JywgcHJvYWxsYXJndHlwZXMgPT4gJ3tyZWdkYXRh YmFzZSx0ZXh0fScsCiAgIHByb2FyZ21vZGVzID0+ICd7aSx2fScsIHByb2FyZ2RlZmF1bHRzID0+ ICd7TlVMTH0nLAogICBwcm9zcmMgPT4gJ3BnX2dldF9kYXRhYmFzZV9kZGwnIH0sCit7IG9pZCA9 PiAnNjUxNycsIGRlc2NyID0+ICdnZXQgRERMIHRvIHJlY3JlYXRlIGEgcm93LWxldmVsIHNlY3Vy aXR5IHBvbGljeScsCisgIHByb25hbWUgPT4gJ3BnX2dldF9wb2xpY3lfZGRsJywgcHJvcm93cyA9 PiAnMScsIHByb3ZhcmlhZGljID0+ICd0ZXh0JywKKyAgcHJvaXNzdHJpY3QgPT4gJ2YnLCBwcm9y ZXRzZXQgPT4gJ3QnLCBwcm92b2xhdGlsZSA9PiAncycsCisgIHByb25hcmdkZWZhdWx0cyA9PiAn MScsIHByb3JldHR5cGUgPT4gJ3RleHQnLAorICBwcm9hcmd0eXBlcyA9PiAncmVnY2xhc3MgbmFt ZSBfdGV4dCcsCisgIHByb2FsbGFyZ3R5cGVzID0+ICd7cmVnY2xhc3MsbmFtZSxfdGV4dH0nLAor ICBwcm9hcmdtb2RlcyA9PiAne2ksaSx2fScsIHByb2FyZ2RlZmF1bHRzID0+ICd7TlVMTH0nLAor ICBwcm9zcmMgPT4gJ3BnX2dldF9wb2xpY3lfZGRsJyB9LAogeyBvaWQgPT4gJzI1MDknLAogICBk ZXNjciA9PiAnZGVwYXJzZSBhbiBlbmNvZGVkIGV4cHJlc3Npb24gd2l0aCBwcmV0dHktcHJpbnQg b3B0aW9uJywKICAgcHJvbmFtZSA9PiAncGdfZ2V0X2V4cHInLCBwcm92b2xhdGlsZSA9PiAncycs IHByb3JldHR5cGUgPT4gJ3RleHQnLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9yb3dzZWN1cml0eS5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3Jvd3NlY3Vy aXR5Lm91dAppbmRleCAzYTVlODJjMzViZC4uYzdkZTZlNDdjMWQgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcm93c2VjdXJpdHkub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jl c3MvZXhwZWN0ZWQvcm93c2VjdXJpdHkub3V0CkBAIC01MTk1LDYgKzUxOTUsMjc3IEBAIHJlc2V0 IHJsc190ZXN0LmJsYWg7CiBkcm9wIGZ1bmN0aW9uIHJsc19mKHRleHQpOwogZHJvcCB0YWJsZSBy bHNfdCwgdGVzdF90OwogLS0KKy0tIFRlc3QgZm9yIHBnX2dldF9wb2xpY3lfZGRsKHRhYmxlLCBw b2xpY3lfbmFtZSwgVkFSSUFESUMgb3B0aW9ucykgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxF IHJsc190YmxfMSAoCisgICAgZGlkICAgICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAg ICAgICAgIGludCwKKyAgICBkbGV2ZWwgICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAg ICAgbmFtZSwKKyAgICBkdGl0bGUgICAgICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190Ymxf MSBUTyBwdWJsaWM7CitDUkVBVEUgVEFCTEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBu YW1lIHByaW1hcnkga2V5LAorICAgIHNlY2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBP TiBybHNfdGJsXzIgVE8gcHVibGljOworLS0gVGVzdCBQRVJNSVNTSVZFIGFuZCBSRVNUUklDVElW RQorQ1JFQVRFIFBPTElDWSBybHNfcDEgT04gcmxzX3RibF8xIEFTIFBFUk1JU1NJVkUKKyAgICBV U0lORyAoZGxldmVsIDw9IChTRUxFQ1Qgc2VjbHYgRlJPTSBybHNfdGJsXzIgV0hFUkUgcGd1c2Vy ID0gY3VycmVudF91c2VyKSk7CitDUkVBVEUgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzEgQVMg UkVTVFJJQ1RJVkUgVVNJTkcgKGNpZCA8PiA0NCBBTkQgY2lkIDwgNTApOworLS0gVGVzdCBGT1Ig QUxMIHwgU0VMRUNUIHwgSU5TRVJUIHwgVVBEQVRFIHwgREVMRVRFCitDUkVBVEUgUE9MSUNZIHJs c19wMyBPTiBybHNfdGJsXzEgRk9SIEFMTCBVU0lORyAoZGF1dGhvciA9IGN1cnJlbnRfdXNlcik7 CitDUkVBVEUgUE9MSUNZIHJsc19wNCBPTiBybHNfdGJsXzEgRk9SIFNFTEVDVCBVU0lORyAoY2lk ICUgMiA9IDApOworQ1JFQVRFIFBPTElDWSBybHNfcDUgT04gcmxzX3RibF8xIEZPUiBJTlNFUlQg V0lUSCBDSEVDSyAoY2lkICUgMiA9IDEpOworQ1JFQVRFIFBPTElDWSBybHNfcDYgT04gcmxzX3Ri bF8xIEZPUiBVUERBVEUgVVNJTkcgKGNpZCAlIDIgPSAwKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A3 IE9OIHJsc190YmxfMSBGT1IgREVMRVRFIFVTSU5HIChjaWQgPCA4KTsKKy0tIFRlc3QgVE8geyBy b2xlX25hbWUgLi4uIH0KK0NSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBUTyByZWdy ZXNzX3Jsc19kYXZlLCByZWdyZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9M SUNZIHJsc19wOSBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBD SEVDSyAoY2lkID0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMikpOworLS0gTlVMTCBpbnB1 dHMgc2hvdWxkIHJldHVybiBubyByb3dzCitTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19nZXRfcG9s aWN5X2RkbChOVUxMLCAncmxzX3AxJyk7CisgY291bnQgCistLS0tLS0tCisgICAgIDAKKygxIHJv dykKKworU0VMRUNUIGNvdW50KCopIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScs IE5VTEwpOworIGNvdW50IAorLS0tLS0tLQorICAgICAwCisoMSByb3cpCisKK1NFTEVDVCBjb3Vu dCgqKSBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsIE5VTEwpOworIGNvdW50IAorLS0tLS0t LQorICAgICAwCisoMSByb3cpCisKKy0tIFRhYmxlIGRvZXMgbm90IGV4aXN0CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdub25leGlzdGVudF90YmwnLCAncmxzX3AxJyk7CitFUlJP UjogIHJlbGF0aW9uICJub25leGlzdGVudF90YmwiIGRvZXMgbm90IGV4aXN0CitMSU5FIDE6IFNF TEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ25vbmV4aXN0ZW50X3RibCcsICdybHNfcDEn KS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKy0tIFBvbGlj eSBkb2VzIG5vdCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3Ri bF8xJywgJ25vbmV4aXN0ZW50X3BvbCcpOworRVJST1I6ICBwb2xpY3kgIm5vbmV4aXN0ZW50X3Bv bCIgZm9yIHRhYmxlICJyZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIiBkb2VzIG5vdCBleGlz dAorLS0gSW52YWxpZCBvcHRpb24gbmFtZQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2Rk bCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdiYWRvcHQnLCAndHJ1ZScpOworRVJST1I6ICB1bnJl Y29nbml6ZWQgb3B0aW9uOiAiYmFkb3B0IgorLS0gSW52YWxpZCBib29sZWFuIHZhbHVlIGZvciBv cHRpb24KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDEnLCAncHJldHR5JywgJ21heWJlJyk7CitFUlJPUjogIGludmFsaWQgdmFsdWUgZm9yIGJvb2xl YW4gb3B0aW9uICJwcmV0dHkiOiBtYXliZQorLS0gRHVwbGljYXRlIG9wdGlvbgorU0VMRUNUICog RlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdwcmV0dHknLCAn dHJ1ZScsICdwcmV0dHknLCAnZmFsc2UnKTsKK0VSUk9SOiAgb3B0aW9uICJwcmV0dHkiIGlzIHNw ZWNpZmllZCBtb3JlIHRoYW4gb25jZQorLS0gV2l0aG91dCBwcmV0dHkgZm9ybWF0dGluZyAoZGVm YXVsdCkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDEnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9s aWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMSBP TiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIFVTSU5HICgoZGxldmVsIDw9ICggU0VMRUNU IHJsc190YmxfMi5zZWNsdisKKyAgICBGUk9NIHJsc190YmxfMiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICsKKyAgIFdIRVJFIChybHNfdGJsXzIucGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpKTsKKygxIHJv dykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19w MicpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JF QVRFIFBPTElDWSBybHNfcDIgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBBUyBSRVNU UklDVElWRSBVU0lORyAoKChjaWQgPD4gNDQpIEFORCAoY2lkIDwgNTApKSk7CisoMSByb3cpCisK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnKTsK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxz X3RibF8xIFVTSU5HICgoZGF1dGhvciA9IENVUlJFTlRfVVNFUikpOworKDEgcm93KQorCitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0Jyk7CisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIENSRUFURSBQT0xJQ1kgcmxzX3A0IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf dGJsXzEgRk9SIFNFTEVDVCBVU0lORyAoKChjaWQgJSAyKSA9IDApKTsKKygxIHJvdykKKworU0VM RUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNScpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDUgT04gcmVncmVzc19ybHNf c2NoZW1hLnJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKCgoY2lkICUgMikgPSAxKSk7 CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScs ICdybHNfcDYnLCAncHJldHR5JywgJ2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIENSRUFURSBQT0xJ Q1kgcmxzX3A2IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEgRk9SIFVQREFURSBVU0lO RyAoKChjaWQgJSAyKSA9IDApKTsKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9s aWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNycsICdwcmV0dHknLCAnZmFsc2UnKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JF QVRFIFBPTElDWSBybHNfcDcgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBGT1IgREVM RVRFIFVTSU5HICgoY2lkIDwgOCkpOworKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A4JywgJ3ByZXR0eScsICdmYWxzZScpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9k ZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElD WSBybHNfcDggT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBUTyByZWdyZXNzX3Jsc19k YXZlLCByZWdyZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CisoMSByb3cpCisKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDknLCAncHJldHR5Jywg J2ZhbHNlJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19w OSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xIFRPIHJlZ3Jlc3NfcmxzX2V4ZW1wdF91 c2VyIFdJVEggQ0hFQ0sgKChjaWQgPSAoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYrCisgICAgRlJP TSBybHNfdGJsXzIpKSk7CisoMSByb3cpCisKKy0tIFdpdGggcHJldHR5IGZvcm1hdHRpbmcKK1xw c2V0IGZvcm1hdCB1bmFsaWduZWQKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Js c190YmxfMScsICdybHNfcDEnLCAncHJldHR5JywgJ3RydWUnKTsKK3BnX2dldF9wb2xpY3lfZGRs CitDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisg ICAgVVNJTkcgKGRsZXZlbCA8PSAoKCBTRUxFQ1QgcmxzX3RibF8yLnNlY2x2CisgICBGUk9NIHJs c190YmxfMgorICBXSEVSRSBybHNfdGJsXzIucGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpOworKDEg cm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19w MicsICdwcmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kg cmxzX3AyIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBBUyBSRVNUUklDVElW RQorICAgIFVTSU5HIChjaWQgPD4gNDQgQU5EIGNpZCA8IDUwKTsKKygxIHJvdykKK1NFTEVDVCAq IEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCAncHJldHR5Jywg J3RydWUnKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiByZWdy ZXNzX3Jsc19zY2hlbWEucmxzX3RibF8xCisgICAgVVNJTkcgKGRhdXRob3IgPSBDVVJSRU5UX1VT RVIpOworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8x JywgJ3Jsc19wNCcsICdwcmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFU RSBQT0xJQ1kgcmxzX3A0IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBGT1Ig U0VMRUNUCisgICAgVVNJTkcgKChjaWQgJSAyKSA9IDApOworKDEgcm93KQorU0VMRUNUICogRlJP TSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNScsICdwcmV0dHknLCAndHJ1 ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJlZ3Jlc3Nf cmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBGT1IgSU5TRVJUCisgICAgV0lUSCBDSEVDSyAoKGNp ZCAlIDIpID0gMSk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdy bHNfdGJsXzEnLCAncmxzX3A2JywgJ3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2Rk bAorQ1JFQVRFIFBPTElDWSBybHNfcDYgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQor ICAgIEZPUiBVUERBVEUKKyAgICBVU0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCitTRUxF Q1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A3JywgJ3ByZXR0 eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDcgT04g cmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIEZPUiBERUxFVEUKKyAgICBVU0lORyAo Y2lkIDwgOCk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNf dGJsXzEnLCAncmxzX3A4JywgJ3ByZXR0eScsICd0cnVlJyk7CitwZ19nZXRfcG9saWN5X2RkbAor Q1JFQVRFIFBPTElDWSBybHNfcDggT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAg IFRPIHJlZ3Jlc3NfcmxzX2RhdmUsIHJlZ3Jlc3NfcmxzX2FsaWNlCisgICAgVVNJTkcgKHRydWUp OworKDEgcm93KQorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywg J3Jsc19wOScsICdwcmV0dHknLCAndHJ1ZScpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQ T0xJQ1kgcmxzX3A5IE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNfdGJsXzEKKyAgICBUTyByZWdy ZXNzX3Jsc19leGVtcHRfdXNlcgorICAgIFdJVEggQ0hFQ0sgKGNpZCA9ICgoIFNFTEVDVCBybHNf dGJsXzIuc2VjbHYKKyAgIEZST00gcmxzX3RibF8yKSkpOworKDEgcm93KQorXHBzZXQgZm9ybWF0 IGFsaWduZWQKKy0tIFBhc3Mgb3B0aW9ucyB2aWEgVkFSSUFESUMgQVJSQVlbLi4uXSBzeW50YXgK K1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsncHJldHR5Jywn ZmFsc2UnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0 X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNf cDEgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBVU0lORyAoKGRsZXZlbCA8PSAoIFNF TEVDVCBybHNfdGJsXzIuc2VjbHYrCisgICAgRlJPTSBybHNfdGJsXzIgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICArCisgICBXSEVSRSAocmxzX3RibF8yLnBndXNlciA9IENVUlJFTlRfVVNFUikpKSk7Ciso MSByb3cpCisKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsn cHJldHR5JywnZmFsc2UnXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBn X2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmVn cmVzc19ybHNfc2NoZW1hLnJsc190YmxfMSBVU0lORyAoKGRhdXRob3IgPSBDVVJSRU5UX1VTRVIp KTsKKygxIHJvdykKKworXHBzZXQgZm9ybWF0IHVuYWxpZ25lZAorU0VMRUNUICogRlJPTSBwZ19n ZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFZBUklBRElDIEFSUkFZWydwcmV0dHknLCd0cnVlJ10pOworcGdfZ2V0X3Bv bGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3AxIE9OIHJlZ3Jlc3NfcmxzX3NjaGVtYS5ybHNf dGJsXzEKKyAgICBVU0lORyAoZGxldmVsIDw9ICgoIFNFTEVDVCBybHNfdGJsXzIuc2VjbHYKKyAg IEZST00gcmxzX3RibF8yCisgIFdIRVJFIHJsc190YmxfMi5wZ3VzZXIgPSBDVVJSRU5UX1VTRVIp KSk7CisoMSByb3cpCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEn LCAncmxzX3AzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgQVJS QVlbJ3ByZXR0eScsJ3RydWUnXSk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JFQVRFIFBPTElDWSBy bHNfcDMgT04gcmVncmVzc19ybHNfc2NoZW1hLnJsc190YmxfMQorICAgIFVTSU5HIChkYXV0aG9y ID0gQ1VSUkVOVF9VU0VSKTsKKygxIHJvdykKK1xwc2V0IGZvcm1hdCBhbGlnbmVkCistLSBFbXB0 eSBWQVJJQURJQyBhcnJheSBiZWhhdmVzIGFzIGRlZmF1bHQgKG5vIG9wdGlvbnMpCitTRUxFQ1Qg KiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgQVJSQVlbXTo6dGV4dFtdKTsKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiByZWdyZXNzX3Js c19zY2hlbWEucmxzX3RibF8xIFVTSU5HICgoZGxldmVsIDw9ICggU0VMRUNUIHJsc190YmxfMi5z ZWNsdisKKyAgICBGUk9NIHJsc190YmxfMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgIFdIRVJF IChybHNfdGJsXzIucGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpKTsKKygxIHJvdykKKworLS0gVW5y ZWNvZ25pemVkIG9wdGlvbiB2aWEgVkFSSUFESUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0 X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsnYmFkb3B0JywndHJ1ZSddKTsKK0VSUk9SOiAgdW5y ZWNvZ25pemVkIG9wdGlvbjogImJhZG9wdCIKKy0tIEludmFsaWQgYm9vbGVhbiB2YWx1ZSB2aWEg VkFSSUFESUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190Ymxf MScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBB UlJBWVsncHJldHR5JywnbWF5YmUnXSk7CitFUlJPUjogIGludmFsaWQgdmFsdWUgZm9yIGJvb2xl YW4gb3B0aW9uICJwcmV0dHkiOiBtYXliZQorLS0gT2RkIG51bWJlciBvZiBlbGVtZW50cyB2aWEg VkFSSUFESUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190Ymxf MScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBB UlJBWVsncHJldHR5J10pOworRVJST1I6ICB2YXJpYWRpYyBhcmd1bWVudHMgbXVzdCBiZSBuYW1l L3ZhbHVlIHBhaXJzCitISU5UOiAgUHJvdmlkZSBhbiBldmVuIG51bWJlciBvZiB2YXJpYWRpYyBh cmd1bWVudHMgdGhhdCBjYW4gYmUgZGl2aWRlZCBpbnRvIHBhaXJzLgorLS0gUm91bmQtdHJpcDog dGhlIGdlbmVyYXRlZCBEREwgbXVzdCBiZSByZS1leGVjdXRhYmxlLCBpbmNsdWRpbmcgZm9yIGF0 b21pYworLS0gYm9vbGVhbiBleHByZXNzaW9ucyB0aGF0IHBnX2dldF9leHByKCkgZG9lcyBub3Qg cGFyZW50aGVzaXplLgorQ1JFQVRFIFRBQkxFIHJsc19ydCAoYSBpbnQpOworQ1JFQVRFIFBPTElD WSBydF90cnVlIE9OIHJsc19ydCBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9MSUNZIHJ0X2ZhbHNl IE9OIHJsc19ydCBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKGZhbHNlKTsKK0NSRUFURSBURU1QIFRB QkxFIHJ0X2RkbCBBUworICAgIFNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3J0JywgJ3J0 X3RydWUnKSBBUyBkZGwKKyAgICBVTklPTiBBTEwKKyAgICBTRUxFQ1QgcGdfZ2V0X3BvbGljeV9k ZGwoJ3Jsc19ydCcsICdydF9mYWxzZScpOworRFJPUCBQT0xJQ1kgcnRfdHJ1ZSBPTiBybHNfcnQ7 CitEUk9QIFBPTElDWSBydF9mYWxzZSBPTiBybHNfcnQ7CitTRUxFQ1QgZGRsIEZST00gcnRfZGRs IE9SREVSIEJZIGRkbCBcZ2V4ZWMKK0NSRUFURSBQT0xJQ1kgcnRfZmFsc2UgT04gcmVncmVzc19y bHNfc2NoZW1hLnJsc19ydCBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKGZhbHNlKTsKK0NSRUFURSBQ T0xJQ1kgcnRfdHJ1ZSBPTiByZWdyZXNzX3Jsc19zY2hlbWEucmxzX3J0IFVTSU5HICh0cnVlKTsK K1NFTEVDVCBwb2xuYW1lIEZST00gcGdfcG9saWN5IFdIRVJFIHBvbHJlbGlkID0gJ3Jsc19ydCc6 OnJlZ2NsYXNzIE9SREVSIEJZIHBvbG5hbWU7CisgcG9sbmFtZSAgCistLS0tLS0tLS0tCisgcnRf ZmFsc2UKKyBydF90cnVlCisoMiByb3dzKQorCitEUk9QIFRBQkxFIHJsc19ydDsKKy0tIENsZWFu IHVwIG9iamVjdHMgY3JlYXRlZCBmb3IgdGVzdGluZyBwZ19nZXRfcG9saWN5X2RkbCBmdW5jdGlv bi4KK0RST1AgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDIg T04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AzIE9OIHJsc190YmxfMTsKK0RST1AgUE9M SUNZIHJsc19wNCBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDUgT04gcmxzX3RibF8x OworRFJPUCBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNyBP TiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDggT04gcmxzX3RibF8xOworRFJPUCBQT0xJ Q1kgcmxzX3A5IE9OIHJsc190YmxfMTsKK0RST1AgVEFCTEUgcmxzX3RibF8xOworRFJPUCBUQUJM RSBybHNfdGJsXzI7CistLQogLS0gQ2xlYW4gdXAgb2JqZWN0cwogLS0KIFJFU0VUIFNFU1NJT04g QVVUSE9SSVpBVElPTjsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3NlY3Vy aXR5LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jvd3NlY3VyaXR5LnNxbAppbmRleCA2YjM1 NjYyNzFkZi4uMmU4ZjExZTYzYTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3Jv d3NlY3VyaXR5LnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwK QEAgLTI1OTgsNiArMjU5OCwxMzIgQEAgcmVzZXQgcmxzX3Rlc3QuYmxhaDsKIGRyb3AgZnVuY3Rp b24gcmxzX2YodGV4dCk7CiBkcm9wIHRhYmxlIHJsc190LCB0ZXN0X3Q7CiAKKy0tCistLSBUZXN0 IGZvciBwZ19nZXRfcG9saWN5X2RkbCh0YWJsZSwgcG9saWN5X25hbWUsIFZBUklBRElDIG9wdGlv bnMpIGZ1bmN0aW9uLgorLS0KK0NSRUFURSBUQUJMRSBybHNfdGJsXzEgKAorICAgIGRpZCAgICAg ICAgIGludCBwcmltYXJ5IGtleSwKKyAgICBjaWQgICAgICAgICBpbnQsCisgICAgZGxldmVsICAg ICAgaW50IG5vdCBudWxsLAorICAgIGRhdXRob3IgICAgIG5hbWUsCisgICAgZHRpdGxlICAgICAg dGV4dAorKTsKK0dSQU5UIEFMTCBPTiBybHNfdGJsXzEgVE8gcHVibGljOworQ1JFQVRFIFRBQkxF IHJsc190YmxfMiAoCisgICAgcGd1c2VyICAgICAgbmFtZSBwcmltYXJ5IGtleSwKKyAgICBzZWNs diAgICAgICBpbnQKKyk7CitHUkFOVCBTRUxFQ1QgT04gcmxzX3RibF8yIFRPIHB1YmxpYzsKKwor LS0gVGVzdCBQRVJNSVNTSVZFIGFuZCBSRVNUUklDVElWRQorQ1JFQVRFIFBPTElDWSBybHNfcDEg T04gcmxzX3RibF8xIEFTIFBFUk1JU1NJVkUKKyAgICBVU0lORyAoZGxldmVsIDw9IChTRUxFQ1Qg c2VjbHYgRlJPTSBybHNfdGJsXzIgV0hFUkUgcGd1c2VyID0gY3VycmVudF91c2VyKSk7CitDUkVB VEUgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzEgQVMgUkVTVFJJQ1RJVkUgVVNJTkcgKGNpZCA8 PiA0NCBBTkQgY2lkIDwgNTApOworCistLSBUZXN0IEZPUiBBTEwgfCBTRUxFQ1QgfCBJTlNFUlQg fCBVUERBVEUgfCBERUxFVEUKK0NSRUFURSBQT0xJQ1kgcmxzX3AzIE9OIHJsc190YmxfMSBGT1Ig QUxMIFVTSU5HIChkYXV0aG9yID0gY3VycmVudF91c2VyKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A0 IE9OIHJsc190YmxfMSBGT1IgU0VMRUNUIFVTSU5HIChjaWQgJSAyID0gMCk7CitDUkVBVEUgUE9M SUNZIHJsc19wNSBPTiBybHNfdGJsXzEgRk9SIElOU0VSVCBXSVRIIENIRUNLIChjaWQgJSAyID0g MSk7CitDUkVBVEUgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzEgRk9SIFVQREFURSBVU0lORyAo Y2lkICUgMiA9IDApOworQ1JFQVRFIFBPTElDWSBybHNfcDcgT04gcmxzX3RibF8xIEZPUiBERUxF VEUgVVNJTkcgKGNpZCA8IDgpOworCistLSBUZXN0IFRPIHsgcm9sZV9uYW1lIC4uLiB9CitDUkVB VEUgUE9MSUNZIHJsc19wOCBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZGF2ZSwgcmVncmVz c19ybHNfYWxpY2UgVVNJTkcgKHRydWUpOworQ1JFQVRFIFBPTElDWSBybHNfcDkgT04gcmxzX3Ri bF8xIFRPIHJlZ3Jlc3NfcmxzX2V4ZW1wdF91c2VyIFdJVEggQ0hFQ0sgKGNpZCA9IChTRUxFQ1Qg c2VjbHYgRlJPTSBybHNfdGJsXzIpKTsKKworLS0gTlVMTCBpbnB1dHMgc2hvdWxkIHJldHVybiBu byByb3dzCitTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCAncmxz X3AxJyk7CitTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8x JywgTlVMTCk7CitTRUxFQ1QgY291bnQoKikgRlJPTSBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCBO VUxMKTsKKworLS0gVGFibGUgZG9lcyBub3QgZXhpc3QKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3Bv bGljeV9kZGwoJ25vbmV4aXN0ZW50X3RibCcsICdybHNfcDEnKTsKKy0tIFBvbGljeSBkb2VzIG5v dCBleGlzdAorU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ25v bmV4aXN0ZW50X3BvbCcpOworCistLSBJbnZhbGlkIG9wdGlvbiBuYW1lCitTRUxFQ1QgKiBGUk9N IHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgJ2JhZG9wdCcsICd0cnVl Jyk7CistLSBJbnZhbGlkIGJvb2xlYW4gdmFsdWUgZm9yIG9wdGlvbgorU0VMRUNUICogRlJPTSBw Z19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMScsICdwcmV0dHknLCAnbWF5YmUn KTsKKy0tIER1cGxpY2F0ZSBvcHRpb24KK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwo J3Jsc190YmxfMScsICdybHNfcDEnLCAncHJldHR5JywgJ3RydWUnLCAncHJldHR5JywgJ2ZhbHNl Jyk7CisKKy0tIFdpdGhvdXQgcHJldHR5IGZvcm1hdHRpbmcgKGRlZmF1bHQpCitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AyJyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AzJyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0Jyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A1Jyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A2JywgJ3ByZXR0eScsICdm YWxzZScpOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Js c19wNycsICdwcmV0dHknLCAnZmFsc2UnKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9k ZGwoJ3Jsc190YmxfMScsICdybHNfcDgnLCAncHJldHR5JywgJ2ZhbHNlJyk7CitTRUxFQ1QgKiBG Uk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgJ3ByZXR0eScsICdm YWxzZScpOworCistLSBXaXRoIHByZXR0eSBmb3JtYXR0aW5nCitccHNldCBmb3JtYXQgdW5hbGln bmVkCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3Ax JywgJ3ByZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdy bHNfdGJsXzEnLCAncmxzX3AyJywgJ3ByZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBn X2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AzJywgJ3ByZXR0eScsICd0cnVlJyk7 CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0Jywg J3ByZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNf dGJsXzEnLCAncmxzX3A1JywgJ3ByZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A2JywgJ3ByZXR0eScsICd0cnVlJyk7CitT RUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A3JywgJ3By ZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJs XzEnLCAncmxzX3A4JywgJ3ByZXR0eScsICd0cnVlJyk7CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9w b2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A5JywgJ3ByZXR0eScsICd0cnVlJyk7CitccHNl dCBmb3JtYXQgYWxpZ25lZAorCistLSBQYXNzIG9wdGlvbnMgdmlhIFZBUklBRElDIEFSUkFZWy4u Ll0gc3ludGF4CitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAn cmxzX3AxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSSUFESUMgQVJSQVlb J3ByZXR0eScsJ2ZhbHNlJ10pOworU0VMRUNUICogRlJPTSBwZ19nZXRfcG9saWN5X2RkbCgncmxz X3RibF8xJywgJ3Jsc19wMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklB RElDIEFSUkFZWydwcmV0dHknLCdmYWxzZSddKTsKK1xwc2V0IGZvcm1hdCB1bmFsaWduZWQKK1NF TEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsncHJldHR5JywndHJ1 ZSddKTsKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNf cDMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJQURJQyBBUlJBWVsncHJl dHR5JywndHJ1ZSddKTsKK1xwc2V0IGZvcm1hdCBhbGlnbmVkCistLSBFbXB0eSBWQVJJQURJQyBh cnJheSBiZWhhdmVzIGFzIGRlZmF1bHQgKG5vIG9wdGlvbnMpCitTRUxFQ1QgKiBGUk9NIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgVkFSSUFESUMgQVJSQVlbXTo6dGV4dFtdKTsKKy0tIFVucmVjb2duaXplZCBv cHRpb24gdmlhIFZBUklBRElDIEFSUkFZCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRs KCdybHNfdGJsXzEnLCAncmxzX3AxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg VkFSSUFESUMgQVJSQVlbJ2JhZG9wdCcsJ3RydWUnXSk7CistLSBJbnZhbGlkIGJvb2xlYW4gdmFs dWUgdmlhIFZBUklBRElDIEFSUkFZCitTRUxFQ1QgKiBGUk9NIHBnX2dldF9wb2xpY3lfZGRsKCdy bHNfdGJsXzEnLCAncmxzX3AxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFS SUFESUMgQVJSQVlbJ3ByZXR0eScsJ21heWJlJ10pOworLS0gT2RkIG51bWJlciBvZiBlbGVtZW50 cyB2aWEgVkFSSUFESUMgQVJSQVkKK1NFTEVDVCAqIEZST00gcGdfZ2V0X3BvbGljeV9kZGwoJ3Js c190YmxfMScsICdybHNfcDEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJJ QURJQyBBUlJBWVsncHJldHR5J10pOworCistLSBSb3VuZC10cmlwOiB0aGUgZ2VuZXJhdGVkIERE TCBtdXN0IGJlIHJlLWV4ZWN1dGFibGUsIGluY2x1ZGluZyBmb3IgYXRvbWljCistLSBib29sZWFu IGV4cHJlc3Npb25zIHRoYXQgcGdfZ2V0X2V4cHIoKSBkb2VzIG5vdCBwYXJlbnRoZXNpemUuCitD UkVBVEUgVEFCTEUgcmxzX3J0IChhIGludCk7CitDUkVBVEUgUE9MSUNZIHJ0X3RydWUgT04gcmxz X3J0IFVTSU5HICh0cnVlKTsKK0NSRUFURSBQT0xJQ1kgcnRfZmFsc2UgT04gcmxzX3J0IEZPUiBJ TlNFUlQgV0lUSCBDSEVDSyAoZmFsc2UpOworQ1JFQVRFIFRFTVAgVEFCTEUgcnRfZGRsIEFTCisg ICAgU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfcnQnLCAncnRfdHJ1ZScpIEFTIGRkbAor ICAgIFVOSU9OIEFMTAorICAgIFNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3J0JywgJ3J0 X2ZhbHNlJyk7CitEUk9QIFBPTElDWSBydF90cnVlIE9OIHJsc19ydDsKK0RST1AgUE9MSUNZIHJ0 X2ZhbHNlIE9OIHJsc19ydDsKK1NFTEVDVCBkZGwgRlJPTSBydF9kZGwgT1JERVIgQlkgZGRsIFxn ZXhlYworU0VMRUNUIHBvbG5hbWUgRlJPTSBwZ19wb2xpY3kgV0hFUkUgcG9scmVsaWQgPSAncmxz X3J0Jzo6cmVnY2xhc3MgT1JERVIgQlkgcG9sbmFtZTsKK0RST1AgVEFCTEUgcmxzX3J0OworCist LSBDbGVhbiB1cCBvYmplY3RzIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcGdfZ2V0X3BvbGljeV9kZGwg ZnVuY3Rpb24uCitEUk9QIFBPTElDWSBybHNfcDEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kg cmxzX3AyIE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzE7CitE Uk9QIFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A1IE9OIHJs c190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBy bHNfcDcgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMTsKK0RS T1AgUE9MSUNZIHJsc19wOSBPTiBybHNfdGJsXzE7CitEUk9QIFRBQkxFIHJsc190YmxfMTsKK0RS T1AgVEFCTEUgcmxzX3RibF8yOworCiAtLQogLS0gQ2xlYW4gdXAgb2JqZWN0cwogLS0KLS0gCjIu NTEuMAoK --000000000000af85f50654d77ef7--