Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v9JRY-00FJs9-Pf for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Oct 2025 08:34:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v9JRX-00ApfS-NW for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Oct 2025 08:34:38 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v9JRX-00ApfJ-0I for pgsql-hackers@lists.postgresql.org; Thu, 16 Oct 2025 08:34:38 +0000 Received: from mail-lf1-x12e.google.com ([2a00:1450:4864:20::12e]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v9JRT-0023gb-0X for pgsql-hackers@postgresql.org; Thu, 16 Oct 2025 08:34:36 +0000 Received: by mail-lf1-x12e.google.com with SMTP id 2adb3069b0e04-59066761388so1792776e87.0 for ; Thu, 16 Oct 2025 01:34:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1760603673; x=1761208473; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=1obUXVM/scXBQUkUh2Cl8+ulbW8Mdf6kp+cAcLS51aA=; b=hRjqWeFS3F6d8xKwKa6mEY3bYlUe3v8thPwo36IDLoLzao2Hbdpyl7sj+kzy2VgTsZ AM6z2+ak1VfCxcQSUHu95P9RhonaXFyoLXEG6Ato4PhrWff0HiPM9gkUm5scwq8mS+l1 ST/16qJ3863FhyhAY3bKtOK/vqgRBq6CwbVPR21hoJwuqAR2ydu63YAZvKPogMWB1SJY ut5C+olxoAhI8ubHrmPj5qUpMouWjnIX69Y2Xcgs9dTLu944epemYDxm4fZYkwLojimc x0RqwTPW9J67khiR5GlpLYUgCwKDz3Pss6P8Dcon766WmkXuP7mD9b9aqt2LFmCQ0EqO F48g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760603673; x=1761208473; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=1obUXVM/scXBQUkUh2Cl8+ulbW8Mdf6kp+cAcLS51aA=; b=oq/2IuoLdF/SWHcHuh+t4PE7ofo5hwVivU+MBGwu52whmk2qK/p3SQucKE5C37ckPf 9Y0Tf1teLL4SJBlTCQ2PiiPiYwV9WDTTVmeBH0fX36foOBPGuJUzp+gxT5LVbiCEPHQR 0egdaOlba1eqpn+j7Ohb4TZ5nKJX59Bc0JMNW/U2iDZgXTVfGZXlxdU0p2vewo2Vnr+p Q7rLHrps8TFPtosadJ+bfhG0RQLhQmvQpYjZrIANdX5eOyxt2PYGXvjByw3Q7YGdGLuq KMZrK+Ov/I1SacJxkbBQTAZxmztJ4qbUfhJL+wcuIEbWluGDa2bPiu8AgpnBV7Rqzy4O utlQ== X-Gm-Message-State: AOJu0Yya7IkNrFUtudJ9yRXPtr20oVRFw1guENRwRzdSycxQy5KLry0s /XoHdLlP+klLgNbXbeK/iPYasLoHTQPObEm6o31hSz98pMiGth90k/QoN8+a0nSRWxuX1JIIOVG prK9fWF1shwH3WouFjyjyhJ6xCY5O2a8DfhhZRbY72AjMqLGZ5ndqJuxk X-Gm-Gg: ASbGncsaE5BkNl0tsCZTn3xF3NxPotX0/hgtLNEdly3JxZAO6m9Ap95V9UW74qmbq3e Dfzo7ifYJFhf91itjQecmRgTWJ6qmfbMTaFRmeyFHJU/8UIAL/Od/f3KSoL1bPcSUWcOGMdvrP2 8YhU0QiWK5yjRgG7r3HTMfnIkIEzLdVqUdDotH3C3wz1Xfp6gtVdf6PbzUOgWl5jnrCAs5t0l6G wnmvj4P4k3GBqycW/nDeDvPyjkgPr+ZM5bd3lQlEn10nq/tFfZkAG1HsI71L+01uZxXkjmufQ== X-Google-Smtp-Source: AGHT+IEMHi21HWpGGzJOzihdeEtzU4N1TyA4K5iyMO/U511tQ7Ud7UQ4jsIXI8+aBM/1JIYZBISIXK7/R9EDzdVSB3w= X-Received: by 2002:a05:6512:4022:b0:55f:4c92:f4c8 with SMTP id 2adb3069b0e04-591d0748d01mr1123088e87.8.1760603673458; Thu, 16 Oct 2025 01:34:33 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Akshay Joshi Date: Thu, 16 Oct 2025 14:04:21 +0530 X-Gm-Features: AS18NWB6CPcMDICaexgEmRWfmyYavcTyQ7OnWKVxpbEPSFF_3WdAd76NuHkvP34 Message-ID: Subject: Re: [PATCH] Add pg_get_policy_ddl() function to reconstruct CREATE POLICY statement To: Philip Alger Cc: pgsql-hackers Content-Type: multipart/mixed; boundary="0000000000008c2d460641427c65" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008c2d460641427c65 Content-Type: multipart/alternative; boundary="0000000000008c2d450641427c63" --0000000000008c2d450641427c63 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Oct 15, 2025 at 11:00=E2=80=AFPM Philip Alger = wrote: > Hi Akshay, > > When applying the patch, I got a number of errors and the tests failed. I > think it stems from: > > + targetTable =3D relation_open(tableID, NoLock); > + relation_close(targetTable, NoLock); > > > I changed them to use "AccessShareLock" and it worked, and it's probably > relevant to change table_close to "AccessShareLock" as well. You're just > reading from the table. > > + table_close(pgPolicyRel, RowExclusiveLock); > > > You might move "Datum valueDatum" to the top of the function. The > compiler screamed at me for that, so I went ahead and made that change an= d > the screaming stopped. > > + /* Check if the policy has a TO list */ > + Datum valueDatum =3D heap_getattr(tuplePolicy, > > Fixed all the above review comments in the v2 patch. > > I also don't think you need the extra parenthesis around "USING (%s)" and > ""WITH CHECK (%s)" in the code; it seems to print it just fine without > them. Other people might have different opinions. > We need to add extra parentheses for the USING and CHECK clauses. Without them, expressions like USING true or CHECK true will throw a syntax error at or near "true". > > 2) SELECT pg_get_policy_ddl('rls_tbl_1', 'rls_p8', true); -- *pretty >> formatted DDL* >> pg_get_policy_ddl >> ------------------------------------------------ >> CREATE POLICY rls_p8 ON rls_tbl_1 >> AS PERMISSIVE >> FOR ALL >> TO regress_rls_alice, regress_rls_dave >> USING (true) >> ; >> >> > As for the "pretty" part. In my opinion, I don't think it's necessary, an= d > putting the statement terminator (;) seems strange. > I think the pretty format option is a nice-to-have parameter. Users can simply set it to false if they don=E2=80=99t want the DDL to be formatted. As for the statement terminator, it=E2=80=99s useful to include it, while r= unning multiple queries together could result in a syntax error. In my opinion, there=E2=80=99s no harm in providing the statement terminator. However, I=E2=80=99ve modified the logic to add the statement terminator at= the end instead of appending to a new line. > > However, I think you're going to get a lot of opinions on what > well-formatted SQL looks like. > > -- > Best, > Phil Alger > --0000000000008c2d450641427c63 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


On Wed, Oct 15,= 2025 at 11:00=E2=80=AFPM Philip Alger <paalger0@gmail.com> wrote:
Hi Akshay,
When applying the patch, I got a number of errors and the test= s failed. I think it stems from:

+ targetTab= le =3D relation_open(tableID, NoLock);
+ relation_clos= e(targetTable, NoLock);

<= /div>
I changed them to use "AccessShareLock" and it worked, = and it's probably relevant to change table_close to "AccessShareLo= ck" as well. You're just reading from the table.

+ table_close(pgPolicyRel, RowExclusiveLock);

You might move "Datum valueDatum" to the top of the functio= n. The compiler=C2=A0screamed at me for that, so I went ahead and made that= change and the=C2=A0screaming stopped.=C2=A0

+ /* Check if the policy has a TO list */
+ Datum val= ueDatum =3D heap_getattr(tuplePolicy,
<= /div>

Fixed all the above review comments in the v2 pa= tch.

<= div class=3D"gmail_quote">
I also don't think you need the extra pa= renthesis around "USING (%s)" and ""WITH CHECK (%s)&quo= t; in the code; it seems to print it just fine without them. Other people m= ight have different opinions.

We nee= d to add extra parentheses for the USING and CHECK clauses. Without them, e= xpressions like USING true or CHECK true will throw a syntax error at or ne= ar "true".

2) SELECT pg_get_policy= _ddl('rls_tbl_1', 'rls_p8', true); =C2=A0 -- pretty form= atted DDL
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0pg_= get_policy_ddl=C2=A0
------------------------------------------------=C2=A0CREATE POLICY rls_p8 ON rls_tbl_1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0AS PERMISSIVE
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0FOR ALL
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0TO = regress_rls_alice, regress_rls_dave
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0US= ING (true)
=C2=A0;


As for the "prett= y" part. In my opinion, I don't think it's necessary,=C2=A0and= putting the statement terminator (;) seems strange.
=C2=A0
I think the pretty format option is a nice-to-have parame= ter. Users can simply set it to false if they don=E2=80=99t want the DDL to= be formatted.
As for the statement terminator, it=E2=80=99s useful to i= nclude it, while running multiple queries together could result in a syntax= error. In my opinion, there=E2=80=99s no harm in providing the statement t= erminator.
However, I=E2=80=99ve modified the logic to add the statement= terminator at the end instead of appending to a new line.=C2=A0
=C2=A0
However, I think you're going to get a lot of opinions on what= well-formatted SQL looks like.

--
Best,=C2=A0
Phil Alger
--0000000000008c2d450641427c63-- --0000000000008c2d460641427c65 Content-Type: application/octet-stream; name="v2-0001-Add-pg_get_policy_ddl-function-to-reconstruct-CREATE.patch" Content-Disposition: attachment; filename="v2-0001-Add-pg_get_policy_ddl-function-to-reconstruct-CREATE.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mgt5dyjk0 RnJvbSBjZmM5Y2U0OTE4Y2EwNWU0NTU4MTA0MTc3ZjdkNjMyMDM2NGE0NjQyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBa3NoYXkgSm9zaGkgPGFrc2hheS5qb3NoaUBlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDEwIE9jdCAyMDI1IDE1OjQ2OjEzICswNTMwClN1YmplY3Q6IFtQ QVRDSCB2Ml0gQWRkIHBnX2dldF9wb2xpY3lfZGRsKCkgZnVuY3Rpb24gdG8gcmVjb25zdHJ1Y3Qg Q1JFQVRFCiBQT0xJQ1kgc3RhdGVtZW50cwpNSU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6 IHRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJp dAoKVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIGEgbmV3IHN5c3RlbSBmdW5jdGlvbjoKcGdfZ2V0X3Bv bGljeV9kZGwocmVnY2xhc3MgdGFibGUsIG5hbWUgcG9saWN5X25hbWUsIGJvb2wgcHJldHR5KSwK d2hpY2ggcmVjb25zdHJ1Y3RzIHRoZSBDUkVBVEUgUE9MSUNZIHN0YXRlbWVudCBmb3IgdGhlIHNw ZWNpZmllZCBwb2xpY3kuCgpVc2FnZSBleGFtcGxlczoKU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRs KCdybHNfdGFibGUnLCAncG9sMScsIGZhbHNlKTsgLS0gbm9uLXByZXR0eSBmb3JtYXR0ZWQgRERM ClNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RhYmxlJywgJ3BvbDEnLCB0cnVlKTsgIC0t IHByZXR0eSBmb3JtYXR0ZWQgRERMCgpSZWZlcmVuY2U6IFBHLTE2MwpBdXRob3I6IEFrc2hheSBK b3NoaSA8YWtzaGF5Lmpvc2hpQGVudGVycHJpc2VkYi5jb20+ClJldmlld2VkLWJ5OiDDgWx2YXJv IEhlcnJlcmEgPGFsdmhlcnJlQGt1cmlsZW11LmRlPgotLS0KIGRvYy9zcmMvc2dtbC9mdW5jL2Z1 bmMtaW5mby5zZ21sICAgICAgICAgIHwgIDQ1ICsrKysrCiBzcmMvYmFja2VuZC9jb21tYW5kcy9w b2xpY3kuYyAgICAgICAgICAgICB8ICAyNyArKysKIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxl dXRpbHMuYyAgICAgICAgIHwgMTg2ICsrKysrKysrKysrKysrKysrKysrCiBzcmMvaW5jbHVkZS9j YXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICB8ICAgMyArCiBzcmMvaW5jbHVkZS9jb21tYW5k cy9wb2xpY3kuaCAgICAgICAgICAgICB8ICAgMiArCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3Jvd3NlY3VyaXR5Lm91dCB8IDE5NiArKysrKysrKysrKysrKysrKysrKystCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgICAgICB8ICA3OCArKysrKysrKysKIDcgZmlsZXMg Y2hhbmdlZCwgNTM2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9k b2Mvc3JjL3NnbWwvZnVuYy9mdW5jLWluZm8uc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jL2Z1bmMt aW5mby5zZ21sCmluZGV4IGMzOTM4MzJkOTRjLi40YjljNjYxYzIwYiAxMDA2NDQKLS0tIGEvZG9j L3NyYy9zZ21sL2Z1bmMvZnVuYy1pbmZvLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL2Z1bmMvZnVu Yy1pbmZvLnNnbWwKQEAgLTM3OTcsNCArMzc5Nyw0OSBAQCBhY2wgICAgICB8IHtwb3N0Z3Jlcz1h cndkRHh0bS9wb3N0Z3Jlcyxmb289ci9wb3N0Z3Jlc30KIAogICA8L3NlY3QyPgogCisgIDxzZWN0 MiBpZD0iZnVuY3Rpb25zLWdldC1vYmplY3QtZGRsIj4KKyAgIDx0aXRsZT5HZXQgT2JqZWN0IERE TCBGdW5jdGlvbnM8L3RpdGxlPgorCisgICA8cGFyYT4KKyAgICBUaGUgZnVuY3Rpb25zIGRlc2Ny aWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJmdW5jdGlvbnMtZ2V0LW9iamVjdC1kZGwtdGFibGUiLz4K KyAgICByZXR1cm4gdGhlIERhdGEgRGVmaW5pdGlvbiBMYW5ndWFnZSAoRERMKSBzdGF0ZW1lbnQg Zm9yIGFueSBnaXZlbiBkYXRhYmFzZSBvYmplY3QuCisgICAgVGhpcyBmZWF0dXJlIGlzIGltcGxl bWVudGVkIGFzIGEgc2V0IG9mIGRpc3RpbmN0IGZ1bmN0aW9ucyBmb3IgZWFjaCBvYmplY3QgdHlw ZS4KKyAgIDwvcGFyYT4KKworICAgPHRhYmxlIGlkPSJmdW5jdGlvbnMtZ2V0LW9iamVjdC1kZGwt dGFibGUiPgorICAgIDx0aXRsZT5HZXQgT2JqZWN0IERETCBGdW5jdGlvbnM8L3RpdGxlPgorICAg IDx0Z3JvdXAgY29scz0iMSI+CisgICAgIDx0aGVhZD4KKyAgICAgIDxyb3c+CisgICAgICAgPGVu dHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2lnbmF0dXJlIj4K KyAgICAgICAgRnVuY3Rpb24KKyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAg IERlc2NyaXB0aW9uCisgICAgICAgPC9wYXJhPjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAg PC90aGVhZD4KKworICAgICA8dGJvZHk+CisgICAgICA8cm93PgorICAgICAgIDxlbnRyeSByb2xl PSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+CisgICAgICAg IDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcG9saWN5X2RkbDwvcHJpbWFy eT4KKyAgICAgICAgPC9pbmRleHRlcm0+CisgICAgICAgIDxmdW5jdGlvbj5wZ19nZXRfcG9saWN5 X2RkbDwvZnVuY3Rpb24+CisgICAgICAgICggPHBhcmFtZXRlcj50YWJsZTwvcGFyYW1ldGVyPiA8 dHlwZT5yZWdjbGFzczwvdHlwZT4sIDxwYXJhbWV0ZXI+cG9saWN5X25hbWU8L3BhcmFtZXRlcj4g PHR5cGU+bmFtZTwvdHlwZT4sIDxwYXJhbWV0ZXI+cHJldHR5PC9wYXJhbWV0ZXI+IDx0eXBlPmJv b2xlYW48L3R5cGU+ICkKKyAgICAgICAgPHJldHVybnZhbHVlPnRleHQ8L3JldHVybnZhbHVlPgor ICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgUmVjb25zdHJ1Y3RzIHRoZSBD UkVBVEUgUE9MSUNZIHN0YXRlbWVudCBmcm9tIHRoZSBzeXN0ZW0gY2F0YWxvZ3MgZm9yIGEgc3Bl Y2lmaWVkIHRhYmxlIGFuZCBwb2xpY3kgbmFtZS4KKyAgICAgICAgV2hlbiB0aGUgcHJldHR5IGZs YWcgaXMgc2V0IHRvIHRydWUsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgd2VsbC1mb3JtYXR0ZWQg RERMIHN0YXRlbWVudC4KKyAgICAgICAgVGhlIHJlc3VsdCBpcyBhIGNvbXByZWhlbnNpdmUgPGNv bW1hbmQ+Q1JFQVRFIFBPTElDWTwvY29tbWFuZD4gc3RhdGVtZW50LgorICAgICAgIDwvcGFyYT48 L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+CisgICA8 L3RhYmxlPgorCisgIDwvc2VjdDI+CisKICAgPC9zZWN0MT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL3BvbGljeS5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvcG9saWN5LmMKaW5k ZXggODMwNTY5NjBmZTQuLjFhYmUwYzQ0MzUzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21t YW5kcy9wb2xpY3kuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9wb2xpY3kuYwpAQCAtMTI4 LDYgKzEyOCwzMyBAQCBwYXJzZV9wb2xpY3lfY29tbWFuZChjb25zdCBjaGFyICpjbWRfbmFtZSkK IAlyZXR1cm4gcG9sY21kOwogfQogCisvKgorICogZ2V0X3BvbGljeV9jbWRfbmFtZSAtCisgKgkg aGVscGVyIGZ1bmN0aW9uIHRvIGNvbnZlcnQgY2hhciByZXByZXNlbnRhdGlvbiB0byBmdWxsIGNv bW1hbmQgc3RyaW5ncy4KKyAqCisgKiBjbWQgLSAgVmFsaWQgdmFsdWVzIGFyZSAnKicsICdyJywg J2EnLCAndycgYW5kICdkJy4KKyAqCisgKi8KK2NoYXIgKgorZ2V0X3BvbGljeV9jbWRfbmFtZShj aGFyIGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgJyonOgorCQkJcmV0dXJuICJB TEwiOworCQljYXNlIEFDTF9TRUxFQ1RfQ0hSOgorCQkJcmV0dXJuICJTRUxFQ1QiOworCQljYXNl IEFDTF9JTlNFUlRfQ0hSOgorCQkJcmV0dXJuICJJTlNFUlQiOworCQljYXNlIEFDTF9VUERBVEVf Q0hSOgorCQkJcmV0dXJuICJVUERBVEUiOworCQljYXNlIEFDTF9ERUxFVEVfQ0hSOgorCQkJcmV0 dXJuICJERUxFVEUiOworCQlkZWZhdWx0OgorCQkJZWxvZyhFUlJPUiwgInVucmVjb2duaXplZCBw b2xpY3kgY29tbWFuZCIpOworCX0KK30KKwogLyoKICAqIHBvbGljeV9yb2xlX2xpc3RfdG9fYXJy YXkKICAqCSBoZWxwZXIgZnVuY3Rpb24gdG8gY29udmVydCBhIGxpc3Qgb2YgUm9sZVNwZWNzIHRv IGFuIGFycmF5IG9mCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxz LmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMKaW5kZXggMDUwZWVmOTdhNGMu LjYxZmUzNTU5MGY2IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxz LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3J1bGV1dGlscy5jCkBAIC0zMywxMiArMzMs MTQgQEAKICNpbmNsdWRlICJjYXRhbG9nL3BnX29wY2xhc3MuaCIKICNpbmNsdWRlICJjYXRhbG9n L3BnX29wZXJhdG9yLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19wYXJ0aXRpb25lZF90YWJsZS5o IgorI2luY2x1ZGUgImNhdGFsb2cvcGdfcG9saWN5LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19w cm9jLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0LmgiCiAjaW5jbHVkZSAi Y2F0YWxvZy9wZ190cmlnZ2VyLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ190eXBlLmgiCiAjaW5j bHVkZSAiY29tbWFuZHMvZGVmcmVtLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdGFibGVzcGFjZS5o IgorI2luY2x1ZGUgImNvbW1hbmRzL3BvbGljeS5oIgogI2luY2x1ZGUgImNvbW1vbi9rZXl3b3Jk cy5oIgogI2luY2x1ZGUgImV4ZWN1dG9yL3NwaS5oIgogI2luY2x1ZGUgImZ1bmNhcGkuaCIKQEAg LTEzNzM4LDMgKzEzNzQwLDE4NyBAQCBnZXRfcmFuZ2VfcGFydGJvdW5kX3N0cmluZyhMaXN0ICpi b3VuZF9kYXR1bXMpCiAKIAlyZXR1cm4gYnVmLT5kYXRhOwogfQorCisvKgorICogZ2V0X2Zvcm1h dHRlZF9zdHJpbmcKKyAqCisgKiBSZXR1cm4gYSBmb3JtYXR0ZWQgdmVyc2lvbiBvZiB0aGUgc3Ry aW5nLgorICoKKyAqIHByZXR0eSAtIElmIHByZXR0eSBpcyB0cnVlLCB0aGUgb3V0cHV0IGluY2x1 ZGVzIHRhYnMgKFx0KSBhbmQgbmV3bGluZXMgKFxuKS4KKyAqIG5vT2ZUYWJDaGFycyAtIGluZGVu dCB3aXRoIHNwZWNpZmllZCBubyBvZiB0YWJzLgorICogZm10IC0gcHJpbnRmLXN0eWxlIGZvcm1h dCBzdHJpbmcgdXNlZCBieSBhcHBlbmRTdHJpbmdJbmZvVkEuCisgKi8KK3N0YXRpYyB2b2lkCitn ZXRfZm9ybWF0dGVkX3N0cmluZyhTdHJpbmdJbmZvIGJ1ZiwgYm9vbCBwcmV0dHksIGludCBub09m VGFiQ2hhcnMsIGNvbnN0IGNoYXIgKmZtdCwuLi4pCit7CisJdmFfbGlzdAkJYXJnczsKKworCWlm IChwcmV0dHkpCisJeworCQkvKiBJbmRlbnQgd2l0aCB0YWJzICovCisJCWZvciAoaW50IGkgPSAw OyBpIDwgbm9PZlRhYkNoYXJzOyBpKyspCisJCXsKKwkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmco YnVmLCAiXHQiKTsKKwkJfQorCX0KKwllbHNlCisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1Ziwg JyAnKTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJYXBwZW5kU3RyaW5nSW5mb1ZBKGJ1Ziwg Zm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwkvKiBJZiBwcmV0dHkgbW9kZSwgYXBwZW5k IG5ld2xpbmUgYXQgdGhlIGVuZCAqLworCWlmIChwcmV0dHkpCisJCWFwcGVuZFN0cmluZ0luZm9D aGFyKGJ1ZiwgJ1xuJyk7Cit9CisKKy8qCisgKiBwZ19nZXRfcG9saWN5X2RkbAorICoKKyAqIEdl bmVyYXRlIGEgQ1JFQVRFIFBPTElDWSBzdGF0ZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQgcG9saWN5 LgorICoKKyAqIHRhYmxlSUQgLSBUYWJsZSBJRCBvZiB0aGUgcG9saWN5LgorICogcG9saWN5TmFt ZSAtIE5hbWUgb2YgdGhlIHBvbGljeSBmb3Igd2hpY2ggdG8gZ2VuZXJhdGUgdGhlIERETC4KKyAq IHByZXR0eSAtIElmIHRydWUsIGZvcm1hdCB0aGUgRERMIHdpdGggaW5kZW50YXRpb24gYW5kIGxp bmUgYnJlYWtzLgorICovCitEYXR1bQorcGdfZ2V0X3BvbGljeV9kZGwoUEdfRlVOQ1RJT05fQVJH UykKK3sKKwlPaWQJCQl0YWJsZUlEID0gUEdfR0VUQVJHX09JRCgwKTsKKwlOYW1lCQlwb2xpY3lO YW1lID0gUEdfR0VUQVJHX05BTUUoMSk7CisJYm9vbAkJcHJldHR5ID0gUEdfR0VUQVJHX0JPT0wo Mik7CisJYm9vbAkJYXR0cklzTnVsbDsKKwlpbnQJCQlwcmV0dHlGbGFnczsKKwlEYXR1bQkJdmFs dWVEYXR1bTsKKwlIZWFwVHVwbGUJdHVwbGVQb2xpY3k7CisJUmVsYXRpb24JcGdQb2xpY3lSZWw7 CisJUmVsYXRpb24JdGFyZ2V0VGFibGU7CisJU2NhbktleURhdGEgc2tleVsyXTsKKwlTeXNTY2Fu RGVzYyBzc2NhbjsKKwlGb3JtX3BnX3BvbGljeSBwb2xpY3lGb3JtOworCisJU3RyaW5nSW5mb0Rh dGEgYnVmOworCisJaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisKKwl0YXJnZXRUYWJsZSA9IHJlbGF0 aW9uX29wZW4odGFibGVJRCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkvKiBGaW5kIHBvbGljeSB0byBi ZWdpbiBzY2FuICovCisJcGdQb2xpY3lSZWwgPSB0YWJsZV9vcGVuKFBvbGljeVJlbGF0aW9uSWQs IEFjY2Vzc1NoYXJlTG9jayk7CisKKwkvKiBTZXQga2V5IC0gcG9saWN5J3MgcmVsYXRpb24gaWQu ICovCisJU2NhbktleUluaXQoJnNrZXlbMF0sCisJCQkJQW51bV9wZ19wb2xpY3lfcG9scmVsaWQs CisJCQkJQlRFcXVhbFN0cmF0ZWd5TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0 dW0odGFibGVJRCkpOworCisJLyogU2V0IGtleSAtIHBvbGljeSdzIG5hbWUuICovCisJU2Nhbktl eUluaXQoJnNrZXlbMV0sCisJCQkJQW51bV9wZ19wb2xpY3lfcG9sbmFtZSwKKwkJCQlCVEVxdWFs U3RyYXRlZ3lOdW1iZXIsIEZfTkFNRUVRLAorCQkJCUNTdHJpbmdHZXREYXR1bShOYW1lU3RyKCpw b2xpY3lOYW1lKSkpOworCisJc3NjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdQb2xpY3lSZWws CisJCQkJCQkJICAgUG9saWN5UG9scmVsaWRQb2xuYW1lSW5kZXhJZCwgdHJ1ZSwgTlVMTCwgMiwK KwkJCQkJCQkgICBza2V5KTsKKworCXR1cGxlUG9saWN5ID0gc3lzdGFibGVfZ2V0bmV4dChzc2Nh bik7CisJLyogQ2hlY2sgdGhhdCB0aGUgcG9saWN5IGlzIGZvdW5kLCByYWlzZSBhbiBlcnJvciBp ZiBub3QuICovCisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKHR1cGxlUG9saWN5KSkKKwkJZXJlcG9y dChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5FRF9PQkpFQ1QpLAorCQkJCSBl cnJtc2coInBvbGljeSBcIiVzXCIgZm9yIHRhYmxlIFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsCisJ CQkJCQlOYW1lU3RyKCpwb2xpY3lOYW1lKSwKKwkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1l KHRhcmdldFRhYmxlKSkpKTsKKworCXBvbGljeUZvcm0gPSAoRm9ybV9wZ19wb2xpY3kpIEdFVFNU UlVDVCh0dXBsZVBvbGljeSk7CisKKwkvKiBCdWlsZCB0aGUgQ1JFQVRFIFBPTElDWSBzdGF0ZW1l bnQgKi8KKwlnZXRfZm9ybWF0dGVkX3N0cmluZygmYnVmLCBwcmV0dHksIDAsICJDUkVBVEUgUE9M SUNZICVzIE9OICVzIiwKKwkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKE5hbWVTdHIoKnBvbGljeU5h bWUpKSwKKwkJCQkJCSBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZSh0YXJnZXRUYWJsZSkpOworCisJ LyogQ2hlY2sgdGhlIHR5cGUgaXMgUEVSTUlTU0lWRSBvciBSRVNUUklDVElWRSAqLworCWdldF9m b3JtYXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0eSwgMSwKKwkJCQkJCSBwb2xpY3lGb3JtLT5wb2xw ZXJtaXNzaXZlID8gIkFTIFBFUk1JU1NJVkUiIDogIkFTIFJFU1RSSUNUSVZFIik7CisKKwkvKiBD aGVjayBjb21tYW5kIHRvIHdoaWNoIHRoZSBwb2xpY3kgYXBwbGllcyAqLworCWdldF9mb3JtYXR0 ZWRfc3RyaW5nKCZidWYsIHByZXR0eSwgMSwgIkZPUiAlcyIsCisJCQkJCQkgZ2V0X3BvbGljeV9j bWRfbmFtZShwb2xpY3lGb3JtLT5wb2xjbWQpKTsKKworCS8qIENoZWNrIGlmIHRoZSBwb2xpY3kg aGFzIGEgVE8gbGlzdCAqLworCXZhbHVlRGF0dW0gPSBoZWFwX2dldGF0dHIodHVwbGVQb2xpY3ks CisJCQkJCQkJICBBbnVtX3BnX3BvbGljeV9wb2xyb2xlcywKKwkJCQkJCQkgIFJlbGF0aW9uR2V0 RGVzY3IocGdQb2xpY3lSZWwpLAorCQkJCQkJCSAgJmF0dHJJc051bGwpOworCWlmICghYXR0cklz TnVsbCkKKwl7CisJCUFycmF5VHlwZSAgKnBvbGljeV9yb2xlcyA9IERhdHVtR2V0QXJyYXlUeXBl UENvcHkodmFsdWVEYXR1bSk7CisJCWludAkJCW5pdGVtcyA9IEFSUl9ESU1TKHBvbGljeV9yb2xl cylbMF07CisJCU9pZAkJICAgKnJvbGVzID0gKE9pZCAqKSBBUlJfREFUQV9QVFIocG9saWN5X3Jv bGVzKTsKKwkJU3RyaW5nSW5mb0RhdGEgcm9sZV9uYW1lczsKKworCQlpbml0U3RyaW5nSW5mbygm cm9sZV9uYW1lcyk7CisKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBuaXRlbXM7IGkrKykKKwkJewor CQkJaWYgKE9pZElzVmFsaWQocm9sZXNbaV0pKQorCQkJeworCQkJCWNoYXIJICAgKnJvbGVuYW1l ID0gR2V0VXNlck5hbWVGcm9tSWQocm9sZXNbaV0sIGZhbHNlKTsKKworCQkJCWlmIChpID4gMCkK KwkJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1lcywgIiwgIik7CisJCQkJYXBw ZW5kU3RyaW5nSW5mb1N0cmluZygmcm9sZV9uYW1lcywgcm9sZW5hbWUpOworCQkJfQorCQl9CisK KwkJaWYgKHJvbGVfbmFtZXMubGVuID4gMCkKKwkJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZidWYs IHByZXR0eSwgMSwgIlRPICVzIiwgcm9sZV9uYW1lcy5kYXRhKTsKKwl9CisKKwlwcmV0dHlGbGFn cyA9IEdFVF9QUkVUVFlfRkxBR1MocHJldHR5KTsKKwkvKiBDaGVjayBpZiB0aGUgcG9saWN5IGhh cyBhIFVTSU5HIGV4cHIgKi8KKwl2YWx1ZURhdHVtID0gaGVhcF9nZXRhdHRyKHR1cGxlUG9saWN5 LAorCQkJCQkJCSAgQW51bV9wZ19wb2xpY3lfcG9scXVhbCwKKwkJCQkJCQkgIFJlbGF0aW9uR2V0 RGVzY3IocGdQb2xpY3lSZWwpLAorCQkJCQkJCSAgJmF0dHJJc051bGwpOworCWlmICghYXR0cklz TnVsbCkKKwl7CisJCXRleHQJICAgKmV4cHJ0ZXh0ID0gRGF0dW1HZXRUZXh0UFAodmFsdWVEYXR1 bSk7CisJCXRleHQJICAgKnVzaW5nRXhwcmVzc2lvbiA9IHBnX2dldF9leHByX3dvcmtlcihleHBy dGV4dCwKKwkJCQkJCQkJCQkJCQkJIHBvbGljeUZvcm0tPnBvbHJlbGlkLAorCQkJCQkJCQkJCQkJ CQkgcHJldHR5RmxhZ3MpOworCisJCWdldF9mb3JtYXR0ZWRfc3RyaW5nKCZidWYsIHByZXR0eSwg MSwgIlVTSU5HICglcykiLAorCQkJCQkJCSB0ZXh0X3RvX2NzdHJpbmcodXNpbmdFeHByZXNzaW9u KSk7CisJfQorCisJLyogQ2hlY2sgaWYgdGhlIHBvbGljeSBoYXMgYSBXSVRIIENIRUNLIGV4cHIg Ki8KKwl2YWx1ZURhdHVtID0gaGVhcF9nZXRhdHRyKHR1cGxlUG9saWN5LAorCQkJCQkJCSAgQW51 bV9wZ19wb2xpY3lfcG9sd2l0aGNoZWNrLAorCQkJCQkJCSAgUmVsYXRpb25HZXREZXNjcihwZ1Bv bGljeVJlbCksCisJCQkJCQkJICAmYXR0cklzTnVsbCk7CisJaWYgKCFhdHRySXNOdWxsKQorCXsK KwkJdGV4dAkgICAqZXhwcnRleHQgPSBEYXR1bUdldFRleHRQUCh2YWx1ZURhdHVtKTsKKwkJdGV4 dAkgICAqY2hlY2tFeHByZXNzaW9uID0gcGdfZ2V0X2V4cHJfd29ya2VyKGV4cHJ0ZXh0LAorCQkJ CQkJCQkJCQkJCQkgcG9saWN5Rm9ybS0+cG9scmVsaWQsCisJCQkJCQkJCQkJCQkJCSBwcmV0dHlG bGFncyk7CisKKwkJZ2V0X2Zvcm1hdHRlZF9zdHJpbmcoJmJ1ZiwgcHJldHR5LCAxLCAiV0lUSCBD SEVDSyAoJXMpIiwKKwkJCQkJCQkgdGV4dF90b19jc3RyaW5nKGNoZWNrRXhwcmVzc2lvbikpOwor CX0KKworCS8qIFJlcGxhY2UgJ1xuJyB3aXRoICc7JyBpZiBuZXdsaW5lIGF0IHRoZSBlbmQgKi8K KwlpZiAoYnVmLmxlbiA+IDAgJiYgYnVmLmRhdGFbYnVmLmxlbiAtIDFdID09ICdcbicpCisJCWJ1 Zi5kYXRhW2J1Zi5sZW4gLSAxXSA9ICc7JzsKKwllbHNlCisJCWFwcGVuZFN0cmluZ0luZm9DaGFy KCZidWYsICc7Jyk7CisKKwkvKiBDbGVhbiB1cC4gKi8KKwlzeXN0YWJsZV9lbmRzY2FuKHNzY2Fu KTsKKwlyZWxhdGlvbl9jbG9zZSh0YXJnZXRUYWJsZSwgQWNjZXNzU2hhcmVMb2NrKTsKKwl0YWJs ZV9jbG9zZShwZ1BvbGljeVJlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCVBHX1JFVFVSTl9URVhU X1Aoc3RyaW5nX3RvX3RleHQoYnVmLmRhdGEpKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0Cmlu ZGV4IGI1MWQyYjE3Mzc5Li5kMjgwMzllNGMwOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0 YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0CkBA IC00MDIxLDYgKzQwMjEsOSBAQAogICBwcm9uYW1lID0+ICdwZ19nZXRfZnVuY3Rpb25fc3FsYm9k eScsIHByb3ZvbGF0aWxlID0+ICdzJywKICAgcHJvcmV0dHlwZSA9PiAndGV4dCcsIHByb2FyZ3R5 cGVzID0+ICdvaWQnLAogICBwcm9zcmMgPT4gJ3BnX2dldF9mdW5jdGlvbl9zcWxib2R5JyB9LAor eyBvaWQgPT4gJzg4MTEnLCBkZXNjciA9PiAnZ2V0IENSRUFURSBzdGF0ZW1lbnQgZm9yIHBvbGlj eScsCisgIHByb25hbWUgPT4gJ3BnX2dldF9wb2xpY3lfZGRsJywgcHJvcmV0dHlwZSA9PiAndGV4 dCcsCisgIHByb2FyZ3R5cGVzID0+ICdyZWdjbGFzcyBuYW1lIGJvb2wnLCBwcm9zcmMgPT4gJ3Bn X2dldF9wb2xpY3lfZGRsJyB9LAogCiB7IG9pZCA9PiAnMTY4NicsIGRlc2NyID0+ICdsaXN0IG9m IFNRTCBrZXl3b3JkcycsCiAgIHByb25hbWUgPT4gJ3BnX2dldF9rZXl3b3JkcycsIHByb2Nvc3Qg PT4gJzEwJywgcHJvcm93cyA9PiAnNTAwJywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1h bmRzL3BvbGljeS5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvcG9saWN5LmgKaW5kZXggZjA2YWEx ZGY0MzkuLjQwZTQ1YjczOGY0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jb21tYW5kcy9wb2xp Y3kuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9wb2xpY3kuaApAQCAtMzUsNCArMzUsNiBA QCBleHRlcm4gT2JqZWN0QWRkcmVzcyByZW5hbWVfcG9saWN5KFJlbmFtZVN0bXQgKnN0bXQpOwog CiBleHRlcm4gYm9vbCByZWxhdGlvbl9oYXNfcG9saWNpZXMoUmVsYXRpb24gcmVsKTsKIAorZXh0 ZXJuIGNoYXIgKmdldF9wb2xpY3lfY21kX25hbWUoY2hhciBjbWQpOworCiAjZW5kaWYJCQkJCQkJ LyogUE9MSUNZX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcm93 c2VjdXJpdHkub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yb3dzZWN1cml0eS5vdXQK aW5kZXggNWExNzJjNWQ5MWMuLjk5MmM4OGYyZTNmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3Jvd3NlY3VyaXR5Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3Jvd3NlY3VyaXR5Lm91dApAQCAtNDgyMSwxMSArNDgyMSwyMDMgQEAgcmVzZXQgcmxzX3Rl c3QuYmxhaDsKIGRyb3AgZnVuY3Rpb24gcmxzX2YodGV4dCk7CiBkcm9wIHRhYmxlIHJsc190LCB0 ZXN0X3Q7CiAtLQorLS0gVGVzdCBmb3IgcGdfZ2V0X3BvbGljeV9kZGwodGFibGVOYW1lLCBwb2xp Y3lOYW1lLCBwcmV0dHkpIGZ1bmN0aW9uLgorLS0KK0NSRUFURSBUQUJMRSBybHNfdGJsXzEgKAor ICAgIGRpZCAgICAgICAgIGludCBwcmltYXJ5IGtleSwKKyAgICBjaWQgICAgICAgICBpbnQsCisg ICAgZGxldmVsICAgICAgaW50IG5vdCBudWxsLAorICAgIGRhdXRob3IgICAgIG5hbWUsCisgICAg ZHRpdGxlICAgICAgdGV4dAorKTsKK0dSQU5UIEFMTCBPTiBybHNfdGJsXzEgVE8gcHVibGljOwor Q1JFQVRFIFRBQkxFIHJsc190YmxfMiAoCisgICAgcGd1c2VyICAgICAgbmFtZSBwcmltYXJ5IGtl eSwKKyAgICBzZWNsdiAgICAgICBpbnQKKyk7CitHUkFOVCBTRUxFQ1QgT04gcmxzX3RibF8yIFRP IHB1YmxpYzsKKy0tIFRlc3QgUEVSTUlTU0lWRSBhbmQgUkVTVFJJQ1RJVkUKK0NSRUFURSBQT0xJ Q1kgcmxzX3AxIE9OIHJsc190YmxfMSBBUyBQRVJNSVNTSVZFCisgICAgVVNJTkcgKGRsZXZlbCA8 PSAoU0VMRUNUIHNlY2x2IEZST00gcmxzX3RibF8yIFdIRVJFIHBndXNlciA9IGN1cnJlbnRfdXNl cikpOworQ1JFQVRFIFBPTElDWSBybHNfcDIgT04gcmxzX3RibF8xIEFTIFJFU1RSSUNUSVZFIFVT SU5HIChjaWQgPD4gNDQgQU5EIGNpZCA8IDUwKTsKKy0tIFRlc3QgRk9SIEFMTCB8IFNFTEVDVCB8 IElOU0VSVCB8IFVQREFURSB8IERFTEVURQorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04gcmxzX3Ri bF8xIEZPUiBBTEwgVVNJTkcgKGRhdXRob3IgPSBjdXJyZW50X3VzZXIpOworQ1JFQVRFIFBPTElD WSBybHNfcDQgT04gcmxzX3RibF8xIEZPUiBTRUxFQ1QgVVNJTkcgKGNpZCAlIDIgPSAwKTsKK0NS RUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKGNp ZCAlIDIgPSAxKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMSBGT1IgVVBEQVRF IFVTSU5HIChjaWQgJSAyID0gMCk7CitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiBybHNfdGJsXzEg Rk9SIERFTEVURSBVU0lORyAoY2lkIDwgOCk7CistLSBUZXN0IFRPIHsgcm9sZV9uYW1lIC4uLiB9 CitDUkVBVEUgUE9MSUNZIHJsc19wOCBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZGF2ZSwg cmVncmVzc19ybHNfYWxpY2UgVVNJTkcgKHRydWUpOworQ1JFQVRFIFBPTElDWSBybHNfcDkgT04g cmxzX3RibF8xIFRPIHJlZ3Jlc3NfcmxzX2V4ZW1wdF91c2VyIFdJVEggQ0hFQ0sgKGNpZCA9IChT RUxFQ1Qgc2VjbHYgRlJPTSBybHNfdGJsXzIpKTsKKy0tIFRlc3QgTlVMTCB2YWx1ZQorU0VMRUNU IHBnX2dldF9wb2xpY3lfZGRsKE5VTEwsICdybHNfcDEnLCBmYWxzZSk7CisgcGdfZ2V0X3BvbGlj eV9kZGwgCistLS0tLS0tLS0tLS0tLS0tLS0tCisgCisoMSByb3cpCisKK1NFTEVDVCBwZ19nZXRf cG9saWN5X2RkbCgndGFiMScsIE5VTEwsIGZhbHNlKTsKK0VSUk9SOiAgcmVsYXRpb24gInRhYjEi IGRvZXMgbm90IGV4aXN0CitMSU5FIDE6IFNFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgndGFiMScs IE5VTEwsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KK1NFTEVD VCBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCBOVUxMLCBmYWxzZSk7CisgcGdfZ2V0X3BvbGljeV9k ZGwgCistLS0tLS0tLS0tLS0tLS0tLS0tCisgCisoMSByb3cpCisKKy0tIFRhYmxlIGRvZXMgbm90 IGV4aXN0CitTRUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3RhYjEnLCAncmxzX3AxJywgZmFsc2Up OworRVJST1I6ICByZWxhdGlvbiAidGFiMSIgZG9lcyBub3QgZXhpc3QKK0xJTkUgMTogU0VMRUNU IHBnX2dldF9wb2xpY3lfZGRsKCd0YWIxJywgJ3Jsc19wMScsIGZhbHNlKTsKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIF4KKy0tIFBvbGljeSBkb2VzIG5vdCBleGlzdAorU0VMRUNU IHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncG9sMScsIGZhbHNlKTsKK0VSUk9SOiAg cG9saWN5ICJwb2wxIiBmb3IgdGFibGUgInJsc190YmxfMSIgZG9lcyBub3QgZXhpc3QKKy0tIFdp dGhvdXQgUHJldHR5IGZvcm1hdHRlZAorU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJs XzEnLCAncmxzX3AxJywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgIENSRUFURSBQT0xJQ1kgcmxzX3AxIE9OIHJsc190YmxfMSBBUyBQRVJNSVNTSVZFIEZPUiBB TEwgVVNJTkcgKChkbGV2ZWwgPD0gKCBTRUxFQ1QgcmxzX3RibF8yLnNlY2x2KworICAgIEZST00g cmxzX3RibF8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgIFdIRVJFIChybHNfdGJsXzIu cGd1c2VyID0gQ1VSUkVOVF9VU0VSKSkpKTsKKygxIHJvdykKKworU0VMRUNUIHBnX2dldF9wb2xp Y3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AyJywgZmFsc2UpOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICBDUkVBVEUgUE9MSUNZIHJsc19wMiBPTiBybHNfdGJsXzEgQVMgUkVTVFJJQ1RJ VkUgRk9SIEFMTCBVU0lORyAoKChjaWQgPD4gNDQpIEFORCAoY2lkIDwgNTApKSk7CisoMSByb3cp CisKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsIGZhbHNl KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2Rk bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorICBDUkVBVEUgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzEg QVMgUEVSTUlTU0lWRSBGT1IgQUxMIFVTSU5HICgoZGF1dGhvciA9IENVUlJFTlRfVVNFUikpOwor KDEgcm93KQorCitTRUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQn LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGlj eV9kZGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAgQ1JFQVRFIFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xIEFTIFBF Uk1JU1NJVkUgRk9SIFNFTEVDVCBVU0lORyAoKChjaWQgJSAyKSA9IDApKTsKKygxIHJvdykKKwor U0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A1JywgZmFsc2UpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnX2dldF9wb2xpY3lfZGRsICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorICBDUkVBVEUgUE9MSUNZIHJsc19wNSBPTiBybHNfdGJsXzEgQVMgUEVS TUlTU0lWRSBGT1IgSU5TRVJUIFdJVEggQ0hFQ0sgKCgoY2lkICUgMikgPSAxKSk7CisoMSByb3cp CisKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNicsIGZhbHNl KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorICBDUkVBVEUgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzEgQVMgUEVSTUlTU0lW RSBGT1IgVVBEQVRFIFVTSU5HICgoKGNpZCAlIDIpID0gMCkpOworKDEgcm93KQorCitTRUxFQ1Qg cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCBmYWxzZSk7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ1JFQVRFIFBPTElD WSBybHNfcDcgT04gcmxzX3RibF8xIEFTIFBFUk1JU1NJVkUgRk9SIERFTEVURSBVU0lORyAoKGNp ZCA8IDgpKTsKKygxIHJvdykKKworU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEn LCAncmxzX3A4JywgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwZ19nZXRfcG9saWN5X2RkbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyAgQ1JFQVRFIFBPTElDWSBybHNfcDggT04gcmxzX3RibF8xIEFT IFBFUk1JU1NJVkUgRk9SIEFMTCBUTyByZWdyZXNzX3Jsc19kYXZlLCByZWdyZXNzX3Jsc19hbGlj ZSBVU0lORyAodHJ1ZSk7CisoMSByb3cpCisKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxz X3RibF8xJywgJ3Jsc19wOScsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGdfZ2V0X3BvbGljeV9kZGwgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisgIENSRUFURSBQT0xJQ1kgcmxzX3A5IE9OIHJsc190YmxfMSBBUyBQRVJNSVNTSVZFIEZP UiBBTEwgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVDSyAoKGNpZCA9ICggU0VM RUNUIHJsc190YmxfMi5zZWNsdisKKyAgICBGUk9NIHJsc190YmxfMikpKTsKKygxIHJvdykKKwor LS0gV2l0aCBQcmV0dHkgZm9ybWF0dGVkCitccHNldCBmb3JtYXQgdW5hbGlnbmVkCitTRUxFQ1Qg cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCB0cnVlKTsKK3BnX2dldF9w b2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzEKKwlBUyBQRVJNSVNT SVZFCisJRk9SIEFMTAorCVVTSU5HIChkbGV2ZWwgPD0gKCggU0VMRUNUIHJsc190YmxfMi5zZWNs dgorICAgRlJPTSBybHNfdGJsXzIKKyAgV0hFUkUgcmxzX3RibF8yLnBndXNlciA9IENVUlJFTlRf VVNFUikpKTsKKygxIHJvdykKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywg J3Jsc19wMicsIHRydWUpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3Ay IE9OIHJsc190YmxfMQorCUFTIFJFU1RSSUNUSVZFCisJRk9SIEFMTAorCVVTSU5HIChjaWQgPD4g NDQgQU5EIGNpZCA8IDUwKTsKKygxIHJvdykKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbCgncmxz X3RibF8xJywgJ3Jsc19wMycsIHRydWUpOworcGdfZ2V0X3BvbGljeV9kZGwKK0NSRUFURSBQT0xJ Q1kgcmxzX3AzIE9OIHJsc190YmxfMQorCUFTIFBFUk1JU1NJVkUKKwlGT1IgQUxMCisJVVNJTkcg KGRhdXRob3IgPSBDVVJSRU5UX1VTRVIpOworKDEgcm93KQorU0VMRUNUIHBnX2dldF9wb2xpY3lf ZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0JywgdHJ1ZSk7CitwZ19nZXRfcG9saWN5X2RkbAorQ1JF QVRFIFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xCisJQVMgUEVSTUlTU0lWRQorCUZPUiBTRUxF Q1QKKwlVU0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCitTRUxFQ1QgcGdfZ2V0X3BvbGlj eV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnLCB0cnVlKTsKK3BnX2dldF9wb2xpY3lfZGRsCitD UkVBVEUgUE9MSUNZIHJsc19wNSBPTiBybHNfdGJsXzEKKwlBUyBQRVJNSVNTSVZFCisJRk9SIElO U0VSVAorCVdJVEggQ0hFQ0sgKChjaWQgJSAyKSA9IDEpOworKDEgcm93KQorU0VMRUNUIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A2JywgdHJ1ZSk7CitwZ19nZXRfcG9saWN5 X2RkbAorQ1JFQVRFIFBPTElDWSBybHNfcDYgT04gcmxzX3RibF8xCisJQVMgUEVSTUlTU0lWRQor CUZPUiBVUERBVEUKKwlVU0lORyAoKGNpZCAlIDIpID0gMCk7CisoMSByb3cpCitTRUxFQ1QgcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCB0cnVlKTsKK3BnX2dldF9wb2xp Y3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiBybHNfdGJsXzEKKwlBUyBQRVJNSVNTSVZF CisJRk9SIERFTEVURQorCVVTSU5HIChjaWQgPCA4KTsKKygxIHJvdykKK1NFTEVDVCBwZ19nZXRf cG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOCcsIHRydWUpOworcGdfZ2V0X3BvbGljeV9k ZGwKK0NSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMQorCUFTIFBFUk1JU1NJVkUKKwlG T1IgQUxMCisJVE8gcmVncmVzc19ybHNfZGF2ZSwgcmVncmVzc19ybHNfYWxpY2UKKwlVU0lORyAo dHJ1ZSk7CisoMSByb3cpCitTRUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdy bHNfcDknLCB0cnVlKTsKK3BnX2dldF9wb2xpY3lfZGRsCitDUkVBVEUgUE9MSUNZIHJsc19wOSBP TiBybHNfdGJsXzEKKwlBUyBQRVJNSVNTSVZFCisJRk9SIEFMTAorCVRPIHJlZ3Jlc3NfcmxzX2V4 ZW1wdF91c2VyCisJV0lUSCBDSEVDSyAoY2lkID0gKCggU0VMRUNUIHJsc190YmxfMi5zZWNsdgor ICAgRlJPTSBybHNfdGJsXzIpKSk7CisoMSByb3cpCistLSBDbGVhbiB1cCBvYmplY3RzIGNyZWF0 ZWQgZm9yIHRlc3RpbmcgcGdfZ2V0X3BvbGljeV9kZGwgZnVuY3Rpb24uCitEUk9QIFBPTElDWSBy bHNfcDEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMTsKK0RS T1AgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDQgT04gcmxz X3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJs c19wNiBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDcgT04gcmxzX3RibF8xOworRFJP UCBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wOSBPTiBybHNf dGJsXzE7CistLQogLS0gQ2xlYW4gdXAgb2JqZWN0cwogLS0KIFJFU0VUIFNFU1NJT04gQVVUSE9S SVpBVElPTjsKIERST1AgU0NIRU1BIHJlZ3Jlc3NfcmxzX3NjaGVtYSBDQVNDQURFOwotTk9USUNF OiAgZHJvcCBjYXNjYWRlcyB0byAzMCBvdGhlciBvYmplY3RzCitOT1RJQ0U6ICBkcm9wIGNhc2Nh ZGVzIHRvIDMyIG90aGVyIG9iamVjdHMKIERFVEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gZnVuY3Rp b24gZl9sZWFrKHRleHQpCiBkcm9wIGNhc2NhZGVzIHRvIHRhYmxlIHVhY2NvdW50CiBkcm9wIGNh c2NhZGVzIHRvIHRhYmxlIGNhdGVnb3J5CkBAIC00ODU2LDYgKzUwNDgsOCBAQCBkcm9wIGNhc2Nh ZGVzIHRvIHRhYmxlIGRlcDEKIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgZGVwMgogZHJvcCBjYXNj YWRlcyB0byB0YWJsZSBkb2JfdDEKIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgZG9iX3QyCitkcm9w IGNhc2NhZGVzIHRvIHRhYmxlIHJsc190YmxfMQorZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBybHNf dGJsXzIKIERST1AgVVNFUiByZWdyZXNzX3Jsc19hbGljZTsKIERST1AgVVNFUiByZWdyZXNzX3Js c19ib2I7CiBEUk9QIFVTRVIgcmVncmVzc19ybHNfY2Fyb2w7CmRpZmYgLS1naXQgYS9zcmMvdGVz dC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dz ZWN1cml0eS5zcWwKaW5kZXggMjFhYzBjYTUxZWUuLjc1Yzk5YjAxZTI3IDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL3NxbC9yb3dzZWN1cml0eS5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9zcWwvcm93c2VjdXJpdHkuc3FsCkBAIC0yNDAwLDYgKzI0MDAsODQgQEAgcmVzZXQgcmxzX3Rl c3QuYmxhaDsKIGRyb3AgZnVuY3Rpb24gcmxzX2YodGV4dCk7CiBkcm9wIHRhYmxlIHJsc190LCB0 ZXN0X3Q7CiAKKy0tCistLSBUZXN0IGZvciBwZ19nZXRfcG9saWN5X2RkbCh0YWJsZU5hbWUsIHBv bGljeU5hbWUsIHByZXR0eSkgZnVuY3Rpb24uCistLQorQ1JFQVRFIFRBQkxFIHJsc190YmxfMSAo CisgICAgZGlkICAgICAgICAgaW50IHByaW1hcnkga2V5LAorICAgIGNpZCAgICAgICAgIGludCwK KyAgICBkbGV2ZWwgICAgICBpbnQgbm90IG51bGwsCisgICAgZGF1dGhvciAgICAgbmFtZSwKKyAg ICBkdGl0bGUgICAgICB0ZXh0CispOworR1JBTlQgQUxMIE9OIHJsc190YmxfMSBUTyBwdWJsaWM7 CitDUkVBVEUgVEFCTEUgcmxzX3RibF8yICgKKyAgICBwZ3VzZXIgICAgICBuYW1lIHByaW1hcnkg a2V5LAorICAgIHNlY2x2ICAgICAgIGludAorKTsKK0dSQU5UIFNFTEVDVCBPTiBybHNfdGJsXzIg VE8gcHVibGljOworCistLSBUZXN0IFBFUk1JU1NJVkUgYW5kIFJFU1RSSUNUSVZFCitDUkVBVEUg UE9MSUNZIHJsc19wMSBPTiBybHNfdGJsXzEgQVMgUEVSTUlTU0lWRQorICAgIFVTSU5HIChkbGV2 ZWwgPD0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMiBXSEVSRSBwZ3VzZXIgPSBjdXJyZW50 X3VzZXIpKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3AyIE9OIHJsc190YmxfMSBBUyBSRVNUUklDVElW RSBVU0lORyAoY2lkIDw+IDQ0IEFORCBjaWQgPCA1MCk7CisKKy0tIFRlc3QgRk9SIEFMTCB8IFNF TEVDVCB8IElOU0VSVCB8IFVQREFURSB8IERFTEVURQorQ1JFQVRFIFBPTElDWSBybHNfcDMgT04g cmxzX3RibF8xIEZPUiBBTEwgVVNJTkcgKGRhdXRob3IgPSBjdXJyZW50X3VzZXIpOworQ1JFQVRF IFBPTElDWSBybHNfcDQgT04gcmxzX3RibF8xIEZPUiBTRUxFQ1QgVVNJTkcgKGNpZCAlIDIgPSAw KTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMSBGT1IgSU5TRVJUIFdJVEggQ0hF Q0sgKGNpZCAlIDIgPSAxKTsKK0NSRUFURSBQT0xJQ1kgcmxzX3A2IE9OIHJsc190YmxfMSBGT1Ig VVBEQVRFIFVTSU5HIChjaWQgJSAyID0gMCk7CitDUkVBVEUgUE9MSUNZIHJsc19wNyBPTiBybHNf dGJsXzEgRk9SIERFTEVURSBVU0lORyAoY2lkIDwgOCk7CisKKy0tIFRlc3QgVE8geyByb2xlX25h bWUgLi4uIH0KK0NSRUFURSBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMSBUTyByZWdyZXNzX3Js c19kYXZlLCByZWdyZXNzX3Jsc19hbGljZSBVU0lORyAodHJ1ZSk7CitDUkVBVEUgUE9MSUNZIHJs c19wOSBPTiBybHNfdGJsXzEgVE8gcmVncmVzc19ybHNfZXhlbXB0X3VzZXIgV0lUSCBDSEVDSyAo Y2lkID0gKFNFTEVDVCBzZWNsdiBGUk9NIHJsc190YmxfMikpOworCistLSBUZXN0IE5VTEwgdmFs dWUKK1NFTEVDVCBwZ19nZXRfcG9saWN5X2RkbChOVUxMLCAncmxzX3AxJywgZmFsc2UpOworU0VM RUNUIHBnX2dldF9wb2xpY3lfZGRsKCd0YWIxJywgTlVMTCwgZmFsc2UpOworU0VMRUNUIHBnX2dl dF9wb2xpY3lfZGRsKE5VTEwsIE5VTEwsIGZhbHNlKTsKKworCistLSBUYWJsZSBkb2VzIG5vdCBl eGlzdAorU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCd0YWIxJywgJ3Jsc19wMScsIGZhbHNlKTsK Ky0tIFBvbGljeSBkb2VzIG5vdCBleGlzdAorU0VMRUNUIHBnX2dldF9wb2xpY3lfZGRsKCdybHNf dGJsXzEnLCAncG9sMScsIGZhbHNlKTsKKworLS0gV2l0aG91dCBQcmV0dHkgZm9ybWF0dGVkCitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDEnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDMnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDQnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDYnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDcnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDgnLCBmYWxzZSk7CitT RUxFQ1QgcGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDknLCBmYWxzZSk7CisK Ky0tIFdpdGggUHJldHR5IGZvcm1hdHRlZAorXHBzZXQgZm9ybWF0IHVuYWxpZ25lZAorU0VMRUNU IHBnX2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3AxJywgdHJ1ZSk7CitTRUxFQ1Qg cGdfZ2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDInLCB0cnVlKTsKK1NFTEVDVCBw Z19nZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wMycsIHRydWUpOworU0VMRUNUIHBn X2dldF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A0JywgdHJ1ZSk7CitTRUxFQ1QgcGdf Z2V0X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDUnLCB0cnVlKTsKK1NFTEVDVCBwZ19n ZXRfcG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wNicsIHRydWUpOworU0VMRUNUIHBnX2dl dF9wb2xpY3lfZGRsKCdybHNfdGJsXzEnLCAncmxzX3A3JywgdHJ1ZSk7CitTRUxFQ1QgcGdfZ2V0 X3BvbGljeV9kZGwoJ3Jsc190YmxfMScsICdybHNfcDgnLCB0cnVlKTsKK1NFTEVDVCBwZ19nZXRf cG9saWN5X2RkbCgncmxzX3RibF8xJywgJ3Jsc19wOScsIHRydWUpOworCistLSBDbGVhbiB1cCBv YmplY3RzIGNyZWF0ZWQgZm9yIHRlc3RpbmcgcGdfZ2V0X3BvbGljeV9kZGwgZnVuY3Rpb24uCitE Uk9QIFBPTElDWSBybHNfcDEgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3AyIE9OIHJs c190YmxfMTsKK0RST1AgUE9MSUNZIHJsc19wMyBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBy bHNfcDQgT04gcmxzX3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A1IE9OIHJsc190YmxfMTsKK0RS T1AgUE9MSUNZIHJsc19wNiBPTiBybHNfdGJsXzE7CitEUk9QIFBPTElDWSBybHNfcDcgT04gcmxz X3RibF8xOworRFJPUCBQT0xJQ1kgcmxzX3A4IE9OIHJsc190YmxfMTsKK0RST1AgUE9MSUNZIHJs c19wOSBPTiBybHNfdGJsXzE7CisKIC0tCiAtLSBDbGVhbiB1cCBvYmplY3RzCiAtLQotLSAKMi41 MS4wCgo= --0000000000008c2d460641427c65--