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 1w9tQZ-001rgx-0D for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 23:32:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w9tQX-00CipZ-1V for pgsql-hackers@arkaria.postgresql.org; Mon, 06 Apr 2026 23:32:17 +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 1w9tQW-00CipQ-2a for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 23:32:17 +0000 Received: from mail-yx1-xb135.google.com ([2607:f8b0:4864:20::b135]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w9tQU-00000000w08-1tpf for pgsql-hackers@lists.postgresql.org; Mon, 06 Apr 2026 23:32:16 +0000 Received: by mail-yx1-xb135.google.com with SMTP id 956f58d0204a3-6501547d7edso4460591d50.0 for ; Mon, 06 Apr 2026 16:32:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775518334; cv=none; d=google.com; s=arc-20240605; b=Qg30iMRxjo9Bi7lCmMiTY8t/KCtYexGGqQUg5PQwHmWUjXGgl3vZVwwP/zAQAUMegb CyrUMomc1eQsoZbI8nh+pS3cbnOIFBzNzio0e8mNHbUlXzPToOQpPS/R81tRNqQ68CIV sjtuxwqm+TVZIHxiGh0BHEdljp+QvSfFrjV8+f6QPNQYtejpooEvLEHggP97VXqrFMiG FV4oj5mQ3CpKXIKAbm+caMLqEdWuVQHNeA0ZUPy6bHS82njDfne6uN/1PiSEHLNj+P5n I5bs0o9MrgU9rcjS0/i5qSn4Hn5xUvhl9olwNiH/ddhCjP6gXJ9TydRR7SzXHOshB9E/ YWAw== 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=RLf9YPXnBpy75mYkU7rYWKdPmsw/WQingSERxuA4w4M=; fh=4MvAQllgFHiq1jV9jP3LKk4pHGpZqmyXsGn2aPFpkJ4=; b=U2nLJiTZGiPTDHLUBuY1o9lntkiTg8yV6d8UYUuXTQ9etD3ry9XQ0APbcro/nbjJy0 FGAH0gabMcVdrcbbBUIpKFutT3Yq4pZBd59TZrdoM5ugM5w0mB6mMbHq5hHSleHAjAFd 3Q/iJ5dfty9xn4iOE7XOSrbVWPZXnLvwVJGJM2PFHfiJ718io0H/zplBoWmT5kuuju3B 8XKWj4gGLYuxOGjqNTnEQvvI2b7gxqisb+pkbVJ1sh9/tc6mc8Nn+uGNI6bimJZJIHz1 vlcXP53IWQO94rAVgDkm0La+crZUdUeNR95JFuBUjS6pmX4Afx0oJIbPcwgIw0iWrABp GDrA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775518334; x=1776123134; 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=RLf9YPXnBpy75mYkU7rYWKdPmsw/WQingSERxuA4w4M=; b=Bry4PIW8/1WUewbvRKodHpNOc9n+/Dgess5iNenO3CLlpZ9YNhmNM17vwCQCXWKLcK maVhc9r5iv8FTi//2IgbiHtQRytcmrsckC9sbWRV6eAbBI5qDqEVZWGnNXipVr2Vi7aW BvGio5r/bkvNgGQtiDA34XSPfo4M83uJErSVD9tpqE6XkVyeap3jMnBPVXQx43R9FjdX JGLI7wRNqTU/UvkQopnpqt6Rx5+JedhmkkWHrJSFp8hErRaO1dVzMkz7FnV23sxd21Q0 TkESzclBeRz9mERFKVsOMGpWeSysvxSqb5uQWx89dNUQIWPomLxwqxWC9OCoJknqrKBK vkWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775518334; x=1776123134; 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=RLf9YPXnBpy75mYkU7rYWKdPmsw/WQingSERxuA4w4M=; b=KlKSHTKQWSIoZe05yF41WflJM3xAgQW7bjkOLBiivWD/XwjAqFvGFH2YFG6s9+4jsX pzqOA1rjagr4TYL5hAzMpZ0uvj0YzWFgFCmv0OwyTpiv++wiUhwLXRnFFCom8GLGjZap Jq+LyOxBzYze9/r4NIsT67JkRTSa7/mJ69Od5zjh7+0xqnf6pDZD2/HbB3Zvv8qVVVh0 vHzN7BNr+jD55bTbENpHJLWgs321RHMjEMxinyWOsZLBetd98QYrEk99/zRMlfsq9QSh Odn8CL+szroi7NcYxx40Sdd1iJYtaDA7L/Gho3IlU7o5PkQuNdmiKOYKNOJw0j8c+VQR fUkQ== X-Forwarded-Encrypted: i=1; AJvYcCUxwuJyvWscuzNU0Bn9hTC7DFCW/Ebd62CYFKtLqJwpa7YYskMVQx3klMkBWLEEFd+b3iLv1li2+cVRyU8r@lists.postgresql.org X-Gm-Message-State: AOJu0YyY3o11nWwsGyy4jbzjvZKn2TmF4uNrB0R7WM1V1zkHUKYnrXyJ 4aIy2ZP5IC4/3m2SajHZKIrbx8XOQ7Jk3L9d4JKToABKX9fDRs8pUeUoQ+QZtqC719DlN37Tj1Y mfv2d4ZD1U/tcRaRQ0CHg9Pu+zni+t3k= X-Gm-Gg: AeBDietHXvLxFWnK0DOPX0tbG/KWGkEtkPgXDk8USCMPAv63m8yuIka6ZXh9mvl2zEq wIZyKWNjz3pD9E9JZXr7SFEleh0PwbgDfGMzvbUJjijToDDqK8+QzQts+jDPC1wjXrMY9ZO7bzv Lm2qkVqLfmKF7Lb5xypMr400SHEJF1NGnLHhxUxPAbTzVaEU7vbJ52HFhtQRuFCeeT8es63qZht mTgCPjGSKSlYlS6R96p7o4Y47LisJc2LeI05f+yZ45ROVmIYQgdBS3Q+s99MEvcGfy+eBf9ZBxR udvUfLsp8RG/8A6Tsn0huL8GhTapfWJ5m0JFbTjDewVTgjwkAQ== X-Received: by 2002:a05:690e:1309:b0:64e:e0fc:a318 with SMTP id 956f58d0204a3-650488bf74dmr12885273d50.66.1775518333523; Mon, 06 Apr 2026 16:32:13 -0700 (PDT) MIME-Version: 1.0 References: <8afecd87-d1e5-241c-5e3e-75e1c62c279b@enterprisedb.com> <1bc5e1e4-380b-213d-6e6a-d5e8f7f0c7f5@enterprisedb.com> <84ffb566-8038-ab35-c841-7a5e5728a247@enterprisedb.com> <525ea957-88ff-e2c6-2975-474c849aa234@ulb.be> <48a78946-f380-a279-e75f-711846e509f8@ulb.be> <4c443cf6-96af-0953-fd5b-bd2b5c0c6f00@ulb.be> <2516071.1699991181@sss.pgh.pa.us> <08b2dea8-6dca-06e4-a53d-3e6334e7645b@ulb.be> In-Reply-To: From: Haibo Yan Date: Mon, 6 Apr 2026 16:32:02 -0700 X-Gm-Features: AQROBzAPi8QO8rFKMmK4E4wXW-jHvxvxErs97Mwl8PQ1C10k9iES70iR54vWz20 Message-ID: Subject: Re: Implement missing join selectivity estimation for range types To: jian he Cc: vignesh C , Schoemans Maxime , Tom Lane , Damir Belyalov , PostgreSQL Hackers , SAKR Mahmoud , Diogo Repas , LUO Zhicheng , Tomas Vondra , Andrey Lepikhov Content-Type: multipart/mixed; boundary="000000000000903879064ed313b1" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000903879064ed313b1 Content-Type: multipart/alternative; boundary="000000000000903878064ed313af" --000000000000903878064ed313af Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Apr 6, 2026 at 3:12=E2=80=AFPM jian he wrote: > I cannot figure out why it aborts. > > as Tom mentioned in upthread about the test cases. > similar to src/test/regress/sql/stats_ext.sql check_estimated_rows > function. > we can test it by something: > > create or replace function check_estimated_rows(text) returns table (ok > bool) > language plpgsql as > $$ > declare > ln text; > tmp text[]; > first_row bool :=3D true; > begin > for ln in > execute format('explain analyze %s', $1) > loop > if first_row then > first_row :=3D false; > tmp :=3D regexp_match(ln, 'rows=3D(\d*) .* rows=3D(\d*)'); > return query select 0.2 < tmp[1]::float8 / tmp[2]::float8 > and tmp[1]::float8 / tmp[2]::float8 < 5; > end if; > end loop; > end; > $$; > > select * from check_estimated_rows($$select * from test_range_join_1, > test_range_join_2 where ir1 && ir2$$); > select * from check_estimated_rows($$select * from test_range_join_1, > test_range_join_2 where ir1 << ir2$$); > select * from check_estimated_rows($$select * from test_range_join_1, > test_range_join_2 where ir1 >> ir2$$); > > Do you need 3 tables to do the test? because we need to actually run > the query then compare the estimated row > and actually returned rows. > If you really execute the query with 3 table joins, it will take a lot of > time. > So two tables join with where quql should be fine? > > /* Fast-forwards i and j to start of iteration */ > + for (i =3D 0; range_cmp_bound_values(typcache, &hist1[i], &hist2[0]) < = 0; > i++); > + for (j =3D 0; range_cmp_bound_values(typcache, &hist2[j], &hist1[0]) < = 0; > j++); > + > + /* Do the estimation on overlapping regions */ > + while (i < nhist1 && j < nhist2) > + { > + double cur_sel1, > + cur_sel2; > + RangeBound cur_sync; > + > + if (range_cmp_bound_values(typcache, &hist1[i], &hist2[j]) < 0) > + cur_sync =3D hist1[i++]; > + else if (range_cmp_bound_values(typcache, &hist1[i], &hist2[j]) > 0) > + cur_sync =3D hist2[j++]; > + else > + { > + /* If equal, skip one */ > + cur_sync =3D hist1[i]; > + > > this part range_cmp_bound_values "if else if" part computed twice, you > can just do > ` > int cmp; > cmp =3D range_cmp_bound_values(typcache, &hist1[i], &hist2[j]); > if cmp <0 then > else if cmp > 0 then > else then > ` > > also. I think you can put the following into main while loop. > + for (i =3D 0; range_cmp_bound_values(typcache, &hist1[i], &hist2[0]) < = 0; > i++); > + for (j =3D 0; range_cmp_bound_values(typcache, &hist2[j], &hist1[0]) < = 0; > j++); > > split range and multirange into 2 patches might be a good idea. > seems: same function (calc_hist_join_selectivity) with same function > signature in src/backend/utils/adt/multirangetypes_selfuncs.c > and src/backend/utils/adt/rangetypes_selfuncs.c, > previously mail complaints not resolved. > > > > Hi,all I'd like to revive the discussion on improving selectivity estimation for range/range joins. Attached is the v5 patch which teaches rangejoinsel to use range bound histograms for estimating the <<, >>, and && operators. Currently, the planner often falls back to a hardcoded default (like 0.005), which can lead to poor join ordering in complex queries. In this version, I have intentionally excluded &< and &>. a &< b essentially maps to upper(a) <=3D upper(b). a &> b essentially maps to lower(a) >=3D lower(b). Since these operators include equality (<=3D / >=3D) rather than strict inequality (< / >), their estimation is slightly more nuanced. I believe focusing on the strict inequality and overlap operators first allows us to deliver a clean, converged, and significantly beneficial improvement. We can discuss the best approach for the remaining operators once this foundation is in place. Test Results My local tests show that the planner now correctly identifies cases with zero or full selectivity, which were previously misestimated. ---------------------------------------------------------------------- CREATE TABLE t1 (id int, r int4range); CREATE TABLE t2 (id int, r int4range); INSERT INTO t1 SELECT g, int4range(g * 2 - 1, g * 2) FROM generate_series(1, 1000) g; INSERT INTO t2 SELECT g, int4range(10000 + g * 200, 10000 + g * 200 + 100) FROM generate_series(1, 1000) g; ANALYZE t1, t2; ---------------------------------------------------------------------- Real Selectivity: ---------------------------------------------------------------------- SELECT avg((t1.r << t2.r)::int) AS p_ll, -- Expected: 1.0 avg((t1.r >> t2.r)::int) AS p_rr, -- Expected: 0.0 avg((t1.r && t2.r)::int) AS p_ov -- Expected: 0.0 FROM t1, t2; -- Result: p_ll =3D 1.0, p_rr =3D 0.0, p_ov =3D 0.0 ---------------------------------------------------------------------- Planner Improvements: With the patch, the EXPLAIN output reflects these probabilities accurately: For << (High Selectivity): The planner correctly estimates rows=3D1000000 (1000 * 1000 * 1.0). ---------------------------------------------------------------------- Nested Loop (cost=3D29.50..15080.75 rows=3D1000000 width=3D61) Join Filter: (t1.r << t2.r) ---------------------------------------------------------------------- For && and >> (Near-Zero Selectivity): The planner now correctly predicts rows=3D1 instead of using the default multiplier. ---------------------------------------------------------------------- Nested Loop (cost=3D0.00..15036.50 rows=3D1 width=3D36) Join Filter: (t1.r && t2.r) This improved estimation allows the optimizer to make much better decisions regarding join order and nesting when range columns are involved. I look forward to your feedback. Regards, Haibo --000000000000903878064ed313af Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Mon, Apr 6, 2026 at 3:12=E2=80=AFPM ji= an he <jian.universality@= gmail.com> wrote:
I cannot figure out w= hy it aborts.

as Tom mentioned in upthread about the test cases.
similar to src/test/regress/sql/stats_ext.sql check_estimated_rows function= .
we can test it by something:

create or replace function check_estimated_rows(text) returns table (ok boo= l)
language plpgsql as
$$
declare
=C2=A0 =C2=A0 ln text;
=C2=A0 =C2=A0 tmp text[];
=C2=A0 =C2=A0 first_row bool :=3D true;
begin
=C2=A0 =C2=A0 for ln in
=C2=A0 =C2=A0 =C2=A0 =C2=A0 execute format('explain analyze %s', $1= )
=C2=A0 =C2=A0 loop
=C2=A0 =C2=A0 =C2=A0 =C2=A0 if first_row then
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 first_row :=3D false;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp :=3D regexp_match(ln, 'ro= ws=3D(\d*) .* rows=3D(\d*)');
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return query select 0.2 < tmp[= 1]::float8 / tmp[2]::float8
and tmp[1]::float8 / tmp[2]::float8 < 5;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 end if;
=C2=A0 =C2=A0 end loop;
end;
$$;

select * from check_estimated_rows($$select * from test_range_join_1,
test_range_join_2 where ir1 && ir2$$);
select * from check_estimated_rows($$select * from test_range_join_1,
test_range_join_2 where ir1 << ir2$$);
select * from check_estimated_rows($$select * from test_range_join_1,
test_range_join_2 where ir1 >> ir2$$);

Do you need 3 tables to do the test? because we need to actually run
the query then compare the estimated row
and actually returned rows.
If you really execute the query with 3 table joins, it will take a lot of t= ime.
So two tables join with where quql should be fine?

/* Fast-forwards i and j to start of iteration */
+ for (i =3D 0; range_cmp_bound_values(typcache, &hist1[i], &hist2[= 0]) < 0; i++);
+ for (j =3D 0; range_cmp_bound_values(typcache, &hist2[j], &hist1[= 0]) < 0; j++);
+
+ /* Do the estimation on overlapping regions */
+ while (i < nhist1 && j < nhist2)
+ {
+ double cur_sel1,
+ cur_sel2;
+ RangeBound cur_sync;
+
+ if (range_cmp_bound_values(typcache, &hist1[i], &hist2[j]) < 0= )
+ cur_sync =3D hist1[i++];
+ else if (range_cmp_bound_values(typcache, &hist1[i], &hist2[j]) &= gt; 0)
+ cur_sync =3D hist2[j++];
+ else
+ {
+ /* If equal, skip one */
+ cur_sync =3D hist1[i];
+

this part range_cmp_bound_values "if else if" part computed twice= , you
can just do
`
int cmp;
cmp =3D range_cmp_bound_values(typcache, &hist1[i], &hist2[j]);
if cmp <0=C2=A0 then
else if cmp > 0 then
else then
`

also. I think you can put the following into=C2=A0 main while loop.
+ for (i =3D 0; range_cmp_bound_values(typcache, &hist1[i], &hist2[= 0]) < 0; i++);
+ for (j =3D 0; range_cmp_bound_values(typcache, &hist2[j], &hist1[= 0]) < 0; j++);

split range and multirange into 2 patches might be a good idea.
seems: same function (calc_hist_join_selectivity) with same function
signature in src/backend/utils/adt/multirangetypes_selfuncs.c
and src/backend/utils/adt/rangetypes_selfuncs.c,
previously mail complaints not resolved.



Hi,all
I'd like to revive the discussion on imp= roving selectivity estimation for range/range joins.
Attached is the v5 = patch which teaches rangejoinsel to use range bound histograms for estimati= ng the <<, >>, and && operators. Currently, the planner= often falls back to a hardcoded default (like 0.005), which can lead to po= or join ordering in complex queries.
In this version, I have intentional= ly excluded &< and &>.
a &< b essentially maps to u= pper(a) <=3D upper(b).
a &> b essentially maps to lower(a) >= ;=3D lower(b).
Since these operators include equality (<=3D / >=3D= ) rather than strict inequality (< / >), their estimation is slightly= more nuanced. I believe focusing on the strict inequality and overlap oper= ators first allows us to deliver a clean, converged, and significantly bene= ficial improvement. We can discuss the best approach for the remaining oper= ators once this foundation is in place.
Test Results
My local tests s= how that the planner now correctly identifies cases with zero or full selec= tivity, which were previously misestimated.
---------------------------= -------------------------------------------
CREATE TABLE t1 (id int, r i= nt4range);
CREATE TABLE t2 (id int, r int4range);
INSERT INTO t1 SELE= CT g, int4range(g * 2 - 1, g * 2) FROM generate_series(1, 1000) g;
INSER= T INTO t2 SELECT g, int4range(10000 + g * 200, 10000 + g * 200 + 100) FROM = generate_series(1, 1000) g;
ANALYZE t1, t2;
-------------------------= ---------------------------------------------

Real Selectivity:
-= ---------------------------------------------------------------------
SE= LECT
=C2=A0 =C2=A0 avg((t1.r << t2.r)::int) AS p_ll, -- Expected:= 1.0
=C2=A0 =C2=A0 avg((t1.r >> t2.r)::int) AS p_rr, -- Expected: = 0.0
=C2=A0 =C2=A0 avg((t1.r && t2.r)::int) AS p_ov =C2=A0-- Expe= cted: 0.0
FROM t1, t2;
-- Result: p_ll =3D 1.0, p_rr =3D 0.0, p_ov = =3D 0.0
----------------------------------------------------------------= ------

Planner Improvements:
With the patch, the EXPLAIN output r= eflects these probabilities accurately:
For << (High Selectivity):=
The planner correctly estimates rows=3D1000000 (1000 * 1000 * 1.0).
= ----------------------------------------------------------------------
N= ested Loop (cost=3D29.50..15080.75 rows=3D1000000 width=3D61)
=C2=A0 Joi= n Filter: (t1.r << t2.r)
-----------------------------------------= -----------------------------
For && and >> (Near-Zero Sel= ectivity):
The planner now correctly predicts rows=3D1 instead of using = the default multiplier.
------------------------------------------------= ----------------------
Nested Loop (cost=3D0.00..15036.50 rows=3D1 width= =3D36)
=C2=A0 Join Filter: (t1.r && t2.r)
This improved estim= ation allows the optimizer to make much better decisions regarding join ord= er and nesting when range columns are involved.
I look forward to your f= eedback.
Regards,
Haibo=C2=A0
--000000000000903878064ed313af-- --000000000000903879064ed313b1 Content-Type: application/octet-stream; name="v5-0001-Improve-range-range-join-selectivity-estimation.patch" Content-Disposition: attachment; filename="v5-0001-Improve-range-range-join-selectivity-estimation.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnntqaof0 RnJvbSBhYzFhMGYyM2Y3ZGViM2E5YTE3YmI4ZTE1MDYwMWVlOWFhYWFmYTQ2IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IE1vbiwgNiBBcHIgMjAyNiAwOTozMDoxMCAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjVdIEltcHJv dmUgcmFuZ2UvcmFuZ2Ugam9pbiBzZWxlY3Rpdml0eSBlc3RpbWF0aW9uCgpUZWFjaCByYW5nZWpv aW5zZWwgdG8gZXN0aW1hdGUgc2VsZWN0ZWQgcmFuZ2UvcmFuZ2Ugam9pbiBvcGVyYXRvcnMgdXNp bmcKcmFuZ2UgaGlzdG9ncmFtIHN0YXRpc3RpY3MgaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgdG8g Zml4ZWQgZGVmYXVsdHMuCgpUaGlzIGltcHJvdmVzIHBsYW5uZXIgcm93IGVzdGltYXRlcyBmb3Ig b3BlcmF0b3JzIHN1Y2ggYXMgPDwsID4+LCAmJiwKZXNwZWNpYWxseSB3aGVuIHRoZSB0d28gcmFu Z2UgY29sdW1ucyBoYXZlIGNsZWFybHkgc2VwYXJhdGVkIG9yIHN0cm9uZ2x5Cm92ZXJsYXBwaW5n IGRpc3RyaWJ1dGlvbnMuCgpSZWdyZXNzaW9uIHRlc3RzIGNvdmVyIHBsYW4gY2hhbmdlcyBmb3Ig cmVwcmVzZW50YXRpdmUgcmFuZ2Ugam9pbiBjYXNlcy4KLS0tCiBzcmMvYmFja2VuZC91dGlscy9h ZHQvcmFuZ2V0eXBlc19zZWxmdW5jcy5jIHwgMzAxICsrKysrKysrKysrKysrKysrKysrCiBzcmMv aW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdCAgICAgICAgIHwgICA2ICstCiBzcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0ICAgICAgICAgICAgIHwgICA1ICsKIHNyYy90ZXN0L3Jl Z3Jlc3MvZXhwZWN0ZWQvcmFuZ2V0eXBlcy5vdXQgICAgfCAxMTQgKysrKysrKysKIHNyYy90ZXN0 L3JlZ3Jlc3Mvc3FsL3JhbmdldHlwZXMuc3FsICAgICAgICAgfCAgNTMgKysrKwogNSBmaWxlcyBj aGFuZ2VkLCA0NzYgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC91dGlscy9hZHQvcmFuZ2V0eXBlc19zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3JhbmdldHlwZXNfc2VsZnVuY3MuYwppbmRleCA3NWYxZTc1NjdkNS4uOTdhZTE5 ZmJjZDIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yYW5nZXR5cGVzX3NlbGZ1 bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JhbmdldHlwZXNfc2VsZnVuY3MuYwpA QCAtMTIyMSwzICsxMjIxLDMwNCBAQCBjYWxjX2hpc3Rfc2VsZWN0aXZpdHlfY29udGFpbnMoVHlw ZUNhY2hlRW50cnkgKnR5cGNhY2hlLAogCiAJcmV0dXJuIHN1bV9mcmFjOwogfQorCisvKgorICog RXN0aW1hdGUgam9pbiBzZWxlY3Rpdml0eSBQKFggPCBZKSB1c2luZyByYW5nZWJvdW5kIGhpc3Rv Z3JhbXMuCisgKgorICogQmFzZWQgb246IERpb2dvIFJlcGFzLCBaaGljaGVuZyBMdW8sIE1heGlt ZSBTY2hvZW1hbnMsIE1haG1vdWQgU2FrciwgMjAyMgorICogIlNlbGVjdGl2aXR5IEVzdGltYXRp b24gb2YgSW5lcXVhbGl0eSBKb2lucyBJbiBEYXRhYmFzZXMiCisgKiBodHRwczovL2RvaS5vcmcv MTAuNDg1NTAvYXJYaXYuMjIwNi4wNzM5NgorICoKKyAqIGhpc3QxIGFuZCBoaXN0MiBhcmUgYXJy YXlzIG9mIFJhbmdlQm91bmQgZW50cmllcyBmcm9tIHRoZSBib3VuZHMgaGlzdG9ncmFtcworICog b2YgdHdvIHJhbmdlLXR5cGVkIGF0dHJpYnV0ZXMgWCBhbmQgWSwgcmVzcGVjdGl2ZWx5LiAgRWFj aCBhcnJheSBoYXMgYXQKKyAqIGxlYXN0IDIgZW50cmllcyAob25lIGhpc3RvZ3JhbSBiaW4pLiAg VGhlIGVudHJpZXMgY2FycnkgZnVsbCBib3VuZCBtZXRhZGF0YQorICogKGxvd2VyL3VwcGVyIGZs YWcsIGluY2x1c2l2ZS9leGNsdXNpdmUpLCBhbmQgYWxsIGNvbXBhcmlzb25zIHVzZQorICogcmFu Z2VfY21wX2JvdW5kcygpIHNvIHRoYXQgYm91bmQgc2VtYW50aWNzIGFyZSBwcmVzZXJ2ZWQuCisg KgorICogVGhlIGFsZ29yaXRobSBtb2RlbHMgZWFjaCBhdHRyaWJ1dGUncyBkaXN0cmlidXRpb24g YXMgYSBwaWVjZXdpc2UgZnVuY3Rpb24KKyAqIGRlcml2ZWQgZnJvbSBpdHMgaGlzdG9ncmFtLCB0 aGVuIGNvbXB1dGVzOgorICogICBQKFggPCBZKSA9IDAuNSAqIHN1bSggKEZfWChwcmV2KSArIEZf WChjdXIpKSAqIChGX1koY3VyKSAtIEZfWShwcmV2KSkgKQorICogYnkgcGFyYWxsZWwtc2Nhbm5p bmcgYm90aCBoaXN0b2dyYW1zLgorICoKKyAqIFRoZSBpbml0aWFsIGZhc3QtZm9yd2FyZCBsb29w cyBza2lwIGhpc3RvZ3JhbSBlbnRyaWVzIHRoYXQgZmFsbCBlbnRpcmVseQorICogYmVmb3JlIHRo ZSBvdGhlciBoaXN0b2dyYW0ncyByYW5nZSwgc28gdGhlIG1haW4gbG9vcCBvbmx5IHByb2Nlc3Nl cyB0aGUKKyAqIG92ZXJsYXBwaW5nIHJlZ2lvbi4gIEJvdW5kcyBjaGVja3MgYXJlIHJlcXVpcmVk IGJlY2F1c2UgdGhlIGhpc3RvZ3JhbXMgbWF5CisgKiBiZSBjb21wbGV0ZWx5IGRpc2pvaW50IChl LmcuLCBhbGwgb2YgWCBpcyBiZWxvdyBhbGwgb2YgWSkuCisgKi8KK3N0YXRpYyBkb3VibGUKK2Nh bGNfaGlzdF9qb2luX3NlbGVjdGl2aXR5KFR5cGVDYWNoZUVudHJ5ICp0eXBjYWNoZSwKKwkJCQkJ CSAgIGNvbnN0IFJhbmdlQm91bmQgKmhpc3QxLCBpbnQgbmhpc3QxLAorCQkJCQkJICAgY29uc3Qg UmFuZ2VCb3VuZCAqaGlzdDIsIGludCBuaGlzdDIpCit7CisJaW50CQkJaSwKKwkJCQlqOworCWRv dWJsZQkJc2VsZWN0aXZpdHkgPSAwLjA7CisJZG91YmxlCQlwcmV2X3NlbDEgPSAtMS4wOwkvKiBu ZWdhdGl2ZSBzZW50aW5lbCBza2lwcyBmaXJzdCBpdGVyICovCisJZG91YmxlCQlwcmV2X3NlbDIg PSAwLjA7CisKKwlBc3NlcnQobmhpc3QxID4gMSk7CisJQXNzZXJ0KG5oaXN0MiA+IDEpOworCisJ LyoKKwkgKiBGYXN0LWZvcndhcmQgcGFzdCBoaXN0MSBlbnRyaWVzIHRoYXQgYXJlIGVudGlyZWx5 IGJlbG93IGhpc3QyWzBdLCBhbmQKKwkgKiB2aWNlIHZlcnNhLiAgQm91bmRzIGNoZWNrcyBwcmV2 ZW50IG91dC1vZi1ib3VuZHMgYWNjZXNzIHdoZW4gdGhlCisJICogaGlzdG9ncmFtcyBhcmUgZnVs bHkgZGlzam9pbnQuCisJICovCisJZm9yIChpID0gMDsgaSA8IG5oaXN0MSAmJgorCQkgcmFuZ2Vf Y21wX2JvdW5kcyh0eXBjYWNoZSwgJmhpc3QxW2ldLCAmaGlzdDJbMF0pIDwgMDsgaSsrKQorCQk7 CisJZm9yIChqID0gMDsgaiA8IG5oaXN0MiAmJgorCQkgcmFuZ2VfY21wX2JvdW5kcyh0eXBjYWNo ZSwgJmhpc3QyW2pdLCAmaGlzdDFbMF0pIDwgMDsgaisrKQorCQk7CisKKwkvKgorCSAqIEhhbmRs ZSBmdWxseS1zZXBhcmF0ZWQgaGlzdG9ncmFtcy4gIFdoZW4gYWxsIGJvdW5kcyBpbiBoaXN0MSBh cmUgYmVsb3cKKwkgKiBhbGwgYm91bmRzIGluIGhpc3QyLCBQKFggPCBZKSBpcyB+MS4wLiAgV2hl biBhbGwgb2YgaGlzdDIgaXMgYmVsb3cKKwkgKiBoaXN0MSwgUChYIDwgWSkgaXMgfjAuMC4gIFdl IHJldHVybiBpbW1lZGlhdGVseSByYXRoZXIgdGhhbiBmYWxsaW5nCisJICogaW50byB0aGUgb3Zl cmxhcCB3YWxrIHdpdGggaW52YWxpZCBpbmRpY2VzLgorCSAqLworCWlmIChpID49IG5oaXN0MSkK KwkJcmV0dXJuIDEuMDsKKwlpZiAoaiA+PSBuaGlzdDIpCisJCXJldHVybiAwLjA7CisKKwkvKiBX YWxrIHRoZSBvdmVybGFwcGluZyByZWdpb24gb2YgYm90aCBoaXN0b2dyYW1zICovCisJd2hpbGUg KGkgPCBuaGlzdDEgJiYgaiA8IG5oaXN0MikKKwl7CisJCWRvdWJsZQkJY3VyX3NlbDEsCisJCQkJ CWN1cl9zZWwyOworCQlSYW5nZUJvdW5kCWN1cl9zeW5jOworCisJCWlmIChyYW5nZV9jbXBfYm91 bmRzKHR5cGNhY2hlLCAmaGlzdDFbaV0sICZoaXN0MltqXSkgPCAwKQorCQkJY3VyX3N5bmMgPSBo aXN0MVtpKytdOworCQllbHNlIGlmIChyYW5nZV9jbXBfYm91bmRzKHR5cGNhY2hlLCAmaGlzdDFb aV0sICZoaXN0MltqXSkgPiAwKQorCQkJY3VyX3N5bmMgPSBoaXN0MltqKytdOworCQllbHNlCisJ CXsKKwkJCS8qIEVxdWFsIGJvdW5kczogYWR2YW5jZSBib3RoICovCisJCQljdXJfc3luYyA9IGhp c3QxW2ldOworCQkJaSsrOworCQkJaisrOworCQl9CisJCWN1cl9zZWwxID0gY2FsY19oaXN0X3Nl bGVjdGl2aXR5X3NjYWxhcih0eXBjYWNoZSwgJmN1cl9zeW5jLAorCQkJCQkJCQkJCQkJaGlzdDEs IG5oaXN0MSwgZmFsc2UpOworCQljdXJfc2VsMiA9IGNhbGNfaGlzdF9zZWxlY3Rpdml0eV9zY2Fs YXIodHlwY2FjaGUsICZjdXJfc3luYywKKwkJCQkJCQkJCQkJCWhpc3QyLCBuaGlzdDIsIGZhbHNl KTsKKworCQkvKiBTa2lwIHRoZSBmaXJzdCBpdGVyYXRpb24gKG5vIHByZXZpb3VzIHBvaW50IHll dCkgKi8KKwkJaWYgKHByZXZfc2VsMSA+PSAwKQorCQkJc2VsZWN0aXZpdHkgKz0gKHByZXZfc2Vs MSArIGN1cl9zZWwxKSAqIChjdXJfc2VsMiAtIHByZXZfc2VsMik7CisKKwkJcHJldl9zZWwxID0g Y3VyX3NlbDE7CisJCXByZXZfc2VsMiA9IGN1cl9zZWwyOworCX0KKworCS8qIFAoWCA8IFkpID0g MC41ICogU3VtKC4uLikgKi8KKwlzZWxlY3Rpdml0eSAvPSAyOworCisJLyogSW5jbHVkZSByZW1h aW5kZXIgb2YgaGlzdDIgaWYgaGlzdDEgd2FzIGV4aGF1c3RlZCBmaXJzdCAqLworCWlmIChqIDwg bmhpc3QyKQorCQlzZWxlY3Rpdml0eSArPSAxIC0gcHJldl9zZWwyOworCisJcmV0dXJuIHNlbGVj dGl2aXR5OworfQorCisvKgorICogcmFuZ2Vqb2luc2VsIC0tIGpvaW4gc2VsZWN0aXZpdHkgZm9y IHJhbmdlLXZzLXJhbmdlIG9wZXJhdG9ycworICoKKyAqIFN1cHBvcnRzOiA8PCwgPj4sICYmCisg KiBUaGVzZSBvcGVyYXRvcnMgbWFwIGRpcmVjdGx5IHRvIHN0cmljdCBib3VuZCBjb21wYXJpc29u cyBQKFggPCBZKSwKKyAqIHdoaWNoIGNhbGNfaGlzdF9qb2luX3NlbGVjdGl2aXR5KCkgZXN0aW1h dGVzIGZyb20gYm91bmQgaGlzdG9ncmFtcy4KKyAqIE90aGVyIHJhbmdlIG9wZXJhdG9ycyBhcmUg bGVmdCB0byB0aGVpciBleGlzdGluZyBnZW5lcmljIGVzdGltYXRvcnMuCisgKi8KK0RhdHVtCity YW5nZWpvaW5zZWwoUEdfRlVOQ1RJT05fQVJHUykKK3sKKwlQbGFubmVySW5mbyAqcm9vdCA9IChQ bGFubmVySW5mbyAqKSBQR19HRVRBUkdfUE9JTlRFUigwKTsKKwlPaWQJCQlvcGVyYXRvciA9IFBH X0dFVEFSR19PSUQoMSk7CisJTGlzdAkgICAqYXJncyA9IChMaXN0ICopIFBHX0dFVEFSR19QT0lO VEVSKDIpOworCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBQ R19HRVRBUkdfUE9JTlRFUig0KTsKKwlWYXJpYWJsZVN0YXREYXRhIHZhcmRhdGExOworCVZhcmlh YmxlU3RhdERhdGEgdmFyZGF0YTI7CisJU2VsZWN0aXZpdHkgc2VsZWM7CisJQXR0U3RhdHNTbG90 IGhpc3QxOworCUF0dFN0YXRzU2xvdCBoaXN0MjsKKwlBdHRTdGF0c1Nsb3Qgc3Nsb3Q7CisJYm9v bAkJaGF2ZV9oaXN0MSA9IGZhbHNlOworCWJvb2wJCWhhdmVfaGlzdDIgPSBmYWxzZTsKKwlUeXBl Q2FjaGVFbnRyeSAqdHlwY2FjaGU7CisJRm9ybV9wZ19zdGF0aXN0aWMgc3RhdHMxOworCUZvcm1f cGdfc3RhdGlzdGljIHN0YXRzMjsKKwlkb3VibGUJCWVtcHR5X2ZyYWMxOworCWRvdWJsZQkJZW1w dHlfZnJhYzI7CisJZG91YmxlCQludWxsX2ZyYWMxOworCWRvdWJsZQkJbnVsbF9mcmFjMjsKKwlp bnQJCQluaGlzdDE7CisJaW50CQkJbmhpc3QyOworCVJhbmdlQm91bmQgKmhpc3QxX2xvd2VyOwor CVJhbmdlQm91bmQgKmhpc3QxX3VwcGVyOworCVJhbmdlQm91bmQgKmhpc3QyX2xvd2VyOworCVJh bmdlQm91bmQgKmhpc3QyX3VwcGVyOworCWJvb2wJCWVtcHR5OworCWludAkJCWk7CisKKwl7CisJ CWJvb2wJam9pbl9pc19yZXZlcnNlZDsKKworCQlnZXRfam9pbl92YXJpYWJsZXMocm9vdCwgYXJn cywgc2ppbmZvLCAmdmFyZGF0YTEsICZ2YXJkYXRhMiwKKwkJCQkJCSAgICZqb2luX2lzX3JldmVy c2VkKTsKKwl9CisKKwlzZWxlYyA9IGRlZmF1bHRfcmFuZ2Vfc2VsZWN0aXZpdHkob3BlcmF0b3Ip OworCisJLyoKKwkgKiBBY3F1aXJlIGhpc3RvZ3JhbSBzdGF0cyBmb3IgYm90aCBzaWRlcy4gIEVh Y2ggc2xvdCBpcyB0cmFja2VkCisJICogaW5kZXBlbmRlbnRseSBzbyB3ZSBjYW4gcmVsZWFzZSBl eGFjdGx5IHdoYXQgd2FzIGFjcXVpcmVkIG9uIGFueQorCSAqIGZhaWx1cmUgcGF0aC4KKwkgKi8K KwlpZiAoIUhlYXBUdXBsZUlzVmFsaWQodmFyZGF0YTEuc3RhdHNUdXBsZSkgfHwKKwkJIUhlYXBU dXBsZUlzVmFsaWQodmFyZGF0YTIuc3RhdHNUdXBsZSkpCisJCWdvdG8gY2xlYW51cDsKKworCWlm ICh2YXJkYXRhMS52YXJ0eXBlICE9IHZhcmRhdGEyLnZhcnR5cGUpCisJCWdvdG8gY2xlYW51cDsK KworCW1lbXNldCgmaGlzdDEsIDAsIHNpemVvZihoaXN0MSkpOworCW1lbXNldCgmaGlzdDIsIDAs IHNpemVvZihoaXN0MikpOworCisJaWYgKCFnZXRfYXR0c3RhdHNzbG90KCZoaXN0MSwgdmFyZGF0 YTEuc3RhdHNUdXBsZSwKKwkJCQkJCSAgU1RBVElTVElDX0tJTkRfQk9VTkRTX0hJU1RPR1JBTSwg SW52YWxpZE9pZCwKKwkJCQkJCSAgQVRUU1RBVFNTTE9UX1ZBTFVFUykpCisJCWdvdG8gY2xlYW51 cDsKKwloYXZlX2hpc3QxID0gdHJ1ZTsKKworCWlmICghZ2V0X2F0dHN0YXRzc2xvdCgmaGlzdDIs IHZhcmRhdGEyLnN0YXRzVHVwbGUsCisJCQkJCQkgIFNUQVRJU1RJQ19LSU5EX0JPVU5EU19ISVNU T0dSQU0sIEludmFsaWRPaWQsCisJCQkJCQkgIEFUVFNUQVRTU0xPVF9WQUxVRVMpKQorCQlnb3Rv IGNsZWFudXA7CisJaGF2ZV9oaXN0MiA9IHRydWU7CisKKwkvKiBJbml0aWFsaXplIHR5cGUgY2Fj aGUgKi8KKwl0eXBjYWNoZSA9IHJhbmdlX2dldF90eXBjYWNoZShmY2luZm8sIHZhcmRhdGExLnZh cnR5cGUpOworCisJLyogTG9vayB1cCBOVUxMIGFuZCBlbXB0eS1yYW5nZSBmcmFjdGlvbnMgKi8K KwlzdGF0czEgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRhMS5zdGF0c1R1 cGxlKTsKKwlzdGF0czIgPSAoRm9ybV9wZ19zdGF0aXN0aWMpIEdFVFNUUlVDVCh2YXJkYXRhMi5z dGF0c1R1cGxlKTsKKworCW51bGxfZnJhYzEgPSBzdGF0czEtPnN0YW51bGxmcmFjOworCW51bGxf ZnJhYzIgPSBzdGF0czItPnN0YW51bGxmcmFjOworCisJLyogVHJ5IHRvIGdldCBmcmFjdGlvbiBv ZiBlbXB0eSByYW5nZXMgZm9yIHRoZSBmaXJzdCB2YXJpYWJsZSAqLworCWlmIChnZXRfYXR0c3Rh dHNzbG90KCZzc2xvdCwgdmFyZGF0YTEuc3RhdHNUdXBsZSwKKwkJCQkJCSBTVEFUSVNUSUNfS0lO RF9SQU5HRV9MRU5HVEhfSElTVE9HUkFNLAorCQkJCQkJIEludmFsaWRPaWQsIEFUVFNUQVRTU0xP VF9OVU1CRVJTKSkKKwl7CisJCWlmIChzc2xvdC5ubnVtYmVycyAhPSAxKQorCQkJZWxvZyhFUlJP UiwgImludmFsaWQgZW1wdHkgZnJhY3Rpb24gc3RhdGlzdGljIik7CisJCWVtcHR5X2ZyYWMxID0g c3Nsb3QubnVtYmVyc1swXTsKKwkJZnJlZV9hdHRzdGF0c3Nsb3QoJnNzbG90KTsKKwl9CisJZWxz ZQorCXsKKwkJZW1wdHlfZnJhYzEgPSAwLjA7CisJfQorCisJLyogVHJ5IHRvIGdldCBmcmFjdGlv biBvZiBlbXB0eSByYW5nZXMgZm9yIHRoZSBzZWNvbmQgdmFyaWFibGUgKi8KKwlpZiAoZ2V0X2F0 dHN0YXRzc2xvdCgmc3Nsb3QsIHZhcmRhdGEyLnN0YXRzVHVwbGUsCisJCQkJCQkgU1RBVElTVElD X0tJTkRfUkFOR0VfTEVOR1RIX0hJU1RPR1JBTSwKKwkJCQkJCSBJbnZhbGlkT2lkLCBBVFRTVEFU U1NMT1RfTlVNQkVSUykpCisJeworCQlpZiAoc3Nsb3Qubm51bWJlcnMgIT0gMSkKKwkJCWVsb2co RVJST1IsICJpbnZhbGlkIGVtcHR5IGZyYWN0aW9uIHN0YXRpc3RpYyIpOworCQllbXB0eV9mcmFj MiA9IHNzbG90Lm51bWJlcnNbMF07CisJCWZyZWVfYXR0c3RhdHNzbG90KCZzc2xvdCk7CisJfQor CWVsc2UKKwl7CisJCWVtcHR5X2ZyYWMyID0gMC4wOworCX0KKworCS8qIENvbnZlcnQgcmFuZ2Ug aGlzdG9ncmFtcyB0byBzZXBhcmF0ZSBsb3dlci91cHBlciBib3VuZCBhcnJheXMgKi8KKwluaGlz dDEgPSBoaXN0MS5udmFsdWVzOworCWhpc3QxX2xvd2VyID0gKFJhbmdlQm91bmQgKikgcGFsbG9j KHNpemVvZihSYW5nZUJvdW5kKSAqIG5oaXN0MSk7CisJaGlzdDFfdXBwZXIgPSAoUmFuZ2VCb3Vu ZCAqKSBwYWxsb2Moc2l6ZW9mKFJhbmdlQm91bmQpICogbmhpc3QxKTsKKwlmb3IgKGkgPSAwOyBp IDwgbmhpc3QxOyBpKyspCisJeworCQlyYW5nZV9kZXNlcmlhbGl6ZSh0eXBjYWNoZSwgRGF0dW1H ZXRSYW5nZVR5cGVQKGhpc3QxLnZhbHVlc1tpXSksCisJCQkJCQkgICZoaXN0MV9sb3dlcltpXSwg Jmhpc3QxX3VwcGVyW2ldLCAmZW1wdHkpOworCQlpZiAoZW1wdHkpCisJCQllbG9nKEVSUk9SLCAi Ym91bmRzIGhpc3RvZ3JhbSBjb250YWlucyBhbiBlbXB0eSByYW5nZSIpOworCX0KKworCW5oaXN0 MiA9IGhpc3QyLm52YWx1ZXM7CisJaGlzdDJfbG93ZXIgPSAoUmFuZ2VCb3VuZCAqKSBwYWxsb2Mo c2l6ZW9mKFJhbmdlQm91bmQpICogbmhpc3QyKTsKKwloaXN0Ml91cHBlciA9IChSYW5nZUJvdW5k ICopIHBhbGxvYyhzaXplb2YoUmFuZ2VCb3VuZCkgKiBuaGlzdDIpOworCWZvciAoaSA9IDA7IGkg PCBuaGlzdDI7IGkrKykKKwl7CisJCXJhbmdlX2Rlc2VyaWFsaXplKHR5cGNhY2hlLCBEYXR1bUdl dFJhbmdlVHlwZVAoaGlzdDIudmFsdWVzW2ldKSwKKwkJCQkJCSAgJmhpc3QyX2xvd2VyW2ldLCAm aGlzdDJfdXBwZXJbaV0sICZlbXB0eSk7CisJCWlmIChlbXB0eSkKKwkJCWVsb2coRVJST1IsICJi b3VuZHMgaGlzdG9ncmFtIGNvbnRhaW5zIGFuIGVtcHR5IHJhbmdlIik7CisJfQorCisJLyogRXN0 aW1hdGUgc2VsZWN0aXZpdHkgYmFzZWQgb24gdGhlIG9wZXJhdG9yICovCisJc3dpdGNoIChvcGVy YXRvcikKKwl7CisJCWNhc2UgT0lEX1JBTkdFX09WRVJMQVBfT1A6CisKKwkJCS8qCisJCQkgKiBB ICYmIEIgaWZmIE5PVChBIDw8IEIpIEFORCBOT1QoQSA+PiBCKQorCQkJICogPSAxIC0gUChBLnVw cGVyIDwgQi5sb3dlcikgLSBQKEIudXBwZXIgPCBBLmxvd2VyKQorCQkJICovCisJCQlzZWxlYyA9 IDE7CisJCQlzZWxlYyAtPSBjYWxjX2hpc3Rfam9pbl9zZWxlY3Rpdml0eSh0eXBjYWNoZSwKKwkJ CQkJCQkJCQkJCWhpc3QxX3VwcGVyLCBuaGlzdDEsCisJCQkJCQkJCQkJCQloaXN0Ml9sb3dlciwg bmhpc3QyKTsKKwkJCXNlbGVjIC09IGNhbGNfaGlzdF9qb2luX3NlbGVjdGl2aXR5KHR5cGNhY2hl LAorCQkJCQkJCQkJCQkJaGlzdDJfdXBwZXIsIG5oaXN0MiwKKwkJCQkJCQkJCQkJCWhpc3QxX2xv d2VyLCBuaGlzdDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPSURfUkFOR0VfTEVGVF9PUDoKKwkJ CS8qIEEgPDwgQiBpZmYgdXBwZXIoQSkgPCBsb3dlcihCKSAqLworCQkJc2VsZWMgPSBjYWxjX2hp c3Rfam9pbl9zZWxlY3Rpdml0eSh0eXBjYWNoZSwKKwkJCQkJCQkJCQkJICAgaGlzdDFfdXBwZXIs IG5oaXN0MSwKKwkJCQkJCQkJCQkJICAgaGlzdDJfbG93ZXIsIG5oaXN0Mik7CisJCQlicmVhazsK KworCQljYXNlIE9JRF9SQU5HRV9SSUdIVF9PUDoKKwkJCS8qIEEgPj4gQiBpZmYgdXBwZXIoQikg PCBsb3dlcihBKSAqLworCQkJc2VsZWMgPSBjYWxjX2hpc3Rfam9pbl9zZWxlY3Rpdml0eSh0eXBj YWNoZSwKKwkJCQkJCQkJCQkJICAgaGlzdDJfdXBwZXIsIG5oaXN0MiwKKwkJCQkJCQkJCQkJICAg aGlzdDFfbG93ZXIsIG5oaXN0MSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogVW5z dXBwb3J0ZWQgb3BlcmF0b3I7IGtlZXAgdGhlIGRlZmF1bHQgc2VsZWN0aXZpdHkgKi8KKwkJCWdv dG8gY2xlYW51cDsKKwl9CisKKwkvKiBUaGUgaGlzdG9ncmFtLWJhc2VkIHNlbGVjdGl2aXR5IGFw cGxpZXMgdG8gbm9uLWVtcHR5IHJhbmdlcyBvbmx5ICovCisJc2VsZWMgKj0gKDEgLSBlbXB0eV9m cmFjMSkgKiAoMSAtIGVtcHR5X2ZyYWMyKTsKKworCS8qCisJICogRm9yIHRoZSBzdXBwb3J0ZWQg b3BlcmF0b3JzICg8PCwgPj4sICYmKSwgZW1wdHkgcmFuZ2VzIGFsd2F5cyBwcm9kdWNlCisJICog ZmFsc2UsIHNvIG5vIGVtcHR5LWZyYWN0aW9uIGFkanVzdG1lbnQgaXMgbmVlZGVkLgorCSAqLwor CisJLyogQWxsIHJhbmdlIG9wZXJhdG9ycyBhcmUgc3RyaWN0ICovCisJc2VsZWMgKj0gKDEgLSBu dWxsX2ZyYWMxKSAqICgxIC0gbnVsbF9mcmFjMik7CisKK2NsZWFudXA6CisJaWYgKGhhdmVfaGlz dDIpCisJCWZyZWVfYXR0c3RhdHNzbG90KCZoaXN0Mik7CisJaWYgKGhhdmVfaGlzdDEpCisJCWZy ZWVfYXR0c3RhdHNzbG90KCZoaXN0MSk7CisKKwlSZWxlYXNlVmFyaWFibGVTdGF0cyh2YXJkYXRh MSk7CisJUmVsZWFzZVZhcmlhYmxlU3RhdHModmFyZGF0YTIpOworCisJQ0xBTVBfUFJPQkFCSUxJ VFkoc2VsZWMpOworCisJUEdfUkVUVVJOX0ZMT0FUOCgoZmxvYXQ4KSBzZWxlYyk7Cit9CmRpZmYg LS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX29wZXJhdG9yLmRhdCBiL3NyYy9pbmNsdWRl L2NhdGFsb2cvcGdfb3BlcmF0b3IuZGF0CmluZGV4IDE0NjVmMTMxMjBhLi41ZWE0NDM0ZjlmYSAx MDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQKKysrIGIvc3Jj L2luY2x1ZGUvY2F0YWxvZy9wZ19vcGVyYXRvci5kYXQKQEAgLTMwOTQsNyArMzA5NCw3IEBACiAg IG9wcm5hbWUgPT4gJyYmJywgb3BybGVmdCA9PiAnYW55cmFuZ2UnLCBvcHJyaWdodCA9PiAnYW55 cmFuZ2UnLAogICBvcHJyZXN1bHQgPT4gJ2Jvb2wnLCBvcHJjb20gPT4gJyYmKGFueXJhbmdlLGFu eXJhbmdlKScsCiAgIG9wcmNvZGUgPT4gJ3JhbmdlX292ZXJsYXBzJywgb3BycmVzdCA9PiAncmFu Z2VzZWwnLAotICBvcHJqb2luID0+ICdhcmVham9pbnNlbCcgfSwKKyAgb3Byam9pbiA9PiAncmFu Z2Vqb2luc2VsJyB9LAogeyBvaWQgPT4gJzM4ODknLCBvaWRfc3ltYm9sID0+ICdPSURfUkFOR0Vf Q09OVEFJTlNfRUxFTV9PUCcsCiAgIGRlc2NyID0+ICdjb250YWlucycsCiAgIG9wcm5hbWUgPT4g J0A+Jywgb3BybGVmdCA9PiAnYW55cmFuZ2UnLCBvcHJyaWdodCA9PiAnYW55ZWxlbWVudCcsCkBA IC0zMTIyLDEyICszMTIyLDEyIEBACiAgIG9wcm5hbWUgPT4gJzw8Jywgb3BybGVmdCA9PiAnYW55 cmFuZ2UnLCBvcHJyaWdodCA9PiAnYW55cmFuZ2UnLAogICBvcHJyZXN1bHQgPT4gJ2Jvb2wnLCBv cHJjb20gPT4gJz4+KGFueXJhbmdlLGFueXJhbmdlKScsCiAgIG9wcmNvZGUgPT4gJ3JhbmdlX2Jl Zm9yZScsIG9wcnJlc3QgPT4gJ3Jhbmdlc2VsJywKLSAgb3Byam9pbiA9PiAnc2NhbGFybHRqb2lu c2VsJyB9LAorICBvcHJqb2luID0+ICdyYW5nZWpvaW5zZWwnIH0sCiB7IG9pZCA9PiAnMzg5NCcs IG9pZF9zeW1ib2wgPT4gJ09JRF9SQU5HRV9SSUdIVF9PUCcsIGRlc2NyID0+ICdpcyByaWdodCBv ZicsCiAgIG9wcm5hbWUgPT4gJz4+Jywgb3BybGVmdCA9PiAnYW55cmFuZ2UnLCBvcHJyaWdodCA9 PiAnYW55cmFuZ2UnLAogICBvcHJyZXN1bHQgPT4gJ2Jvb2wnLCBvcHJjb20gPT4gJzw8KGFueXJh bmdlLGFueXJhbmdlKScsCiAgIG9wcmNvZGUgPT4gJ3JhbmdlX2FmdGVyJywgb3BycmVzdCA9PiAn cmFuZ2VzZWwnLAotICBvcHJqb2luID0+ICdzY2FsYXJndGpvaW5zZWwnIH0sCisgIG9wcmpvaW4g PT4gJ3Jhbmdlam9pbnNlbCcgfSwKIHsgb2lkID0+ICczODk1Jywgb2lkX3N5bWJvbCA9PiAnT0lE X1JBTkdFX09WRVJMQVBTX0xFRlRfT1AnLAogICBkZXNjciA9PiAnb3ZlcmxhcHMgb3IgaXMgbGVm dCBvZicsCiAgIG9wcm5hbWUgPT4gJyY8Jywgb3BybGVmdCA9PiAnYW55cmFuZ2UnLCBvcHJyaWdo dCA9PiAnYW55cmFuZ2UnLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9j LmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggM2VhMTdmYzU2Mjku LmMxNmFhOGNlYzg0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2MuZGF0 CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTEyNzg3LDYgKzEyNzg3 LDExIEBACiAgIHByb25hbWUgPT4gJ2Vycm9yX29uX251bGwnLCBwcm9pc3N0cmljdCA9PiAnZics IHByb3JldHR5cGUgPT4gJ2FueWVsZW1lbnQnLAogICBwcm9hcmd0eXBlcyA9PiAnYW55ZWxlbWVu dCcsIHByb3NyYyA9PiAncGdfZXJyb3Jfb25fbnVsbCcgfSwKIAoreyBvaWQgPT4gJzgzNTUnLCBk ZXNjciA9PiAnam9pbiBzZWxlY3Rpdml0eSBmb3IgcmFuZ2Ugb3BlcmF0b3JzJywKKyAgcHJvbmFt ZSA9PiAncmFuZ2Vqb2luc2VsJywgcHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICdm bG9hdDgnLAorICBwcm9hcmd0eXBlcyA9PiAnaW50ZXJuYWwgb2lkIGludGVybmFsIGludDIgaW50 ZXJuYWwnLAorICBwcm9zcmMgPT4gJ3Jhbmdlam9pbnNlbCcgfSwKKwogeyBvaWQgPT4gJzYzMjEn LCBkZXNjciA9PiAnbGlzdCBvZiBhdmFpbGFibGUgV0FMIHN1bW1hcnkgZmlsZXMnLAogICBwcm9u YW1lID0+ICdwZ19hdmFpbGFibGVfd2FsX3N1bW1hcmllcycsIHByb3Jvd3MgPT4gJzEwMCcsIHBy b3JldHNldCA9PiAndCcsCiAgIHByb3ZvbGF0aWxlID0+ICd2JywgcHJvcmV0dHlwZSA9PiAncmVj b3JkJywgcHJvYXJndHlwZXMgPT4gJycsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4 cGVjdGVkL3JhbmdldHlwZXMub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9yYW5nZXR5 cGVzLm91dAppbmRleCBlMDYyYTRlNWMyYy4uMmZjNWI3NzBmOTAgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcmFuZ2V0eXBlcy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9yYW5nZXR5cGVzLm91dApAQCAtMjAzMywzICsyMDMzLDExNyBAQCBzZWxlY3Qg KiBmcm9tIHRleHRfc3VwcG9ydF90ZXN0IHdoZXJlIHQgPEAgdGV4dHJhbmdlX3N1cHAoJ2EnLCAn ZCcpOwogCiBkcm9wIHRhYmxlIHRleHRfc3VwcG9ydF90ZXN0OwogZHJvcCB0eXBlIHRleHRyYW5n ZV9zdXBwOworLS0KKy0tIHRlc3Qgc2VsZWN0aXZpdHkgb2YgcmFuZ2Ugam9pbiBvcGVyYXRvcnMK Ky0tCitjcmVhdGUgdGFibGUgdGVzdF9yYW5nZV9qb2luXzEgKGlyMSBpbnQ0cmFuZ2UpOworY3Jl YXRlIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8yIChpcjIgaW50NHJhbmdlKTsKK2NyZWF0ZSB0YWJs ZSB0ZXN0X3JhbmdlX2pvaW5fMyAoaXIzIGludDRyYW5nZSk7CitpbnNlcnQgaW50byB0ZXN0X3Jh bmdlX2pvaW5fMSBzZWxlY3QgaW50NHJhbmdlKGcsIGcrMTApIGZyb20gZ2VuZXJhdGVfc2VyaWVz KDEsIDEwMDApIGc7CitpbnNlcnQgaW50byB0ZXN0X3JhbmdlX2pvaW5fMSBzZWxlY3QgaW50NHJh bmdlKGcsIGcrMTAwKSBmcm9tIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwLCAxMCkgZzsKK2luc2Vy dCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl8yIHNlbGVjdCBpbnQ0cmFuZ2UoZywgZysxMCkgZnJvbSBn ZW5lcmF0ZV9zZXJpZXMoMSwgNTAwKSBnOworaW5zZXJ0IGludG8gdGVzdF9yYW5nZV9qb2luXzIg c2VsZWN0IGludDRyYW5nZShnLCBnKzEwMCkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwgNTAwLCAx MCkgZzsKK2luc2VydCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl8zIHNlbGVjdCBpbnQ0cmFuZ2UoZywg ZysxMCkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMoNTAxLCAxMDAwKSBnOworaW5zZXJ0IGludG8gdGVz dF9yYW5nZV9qb2luXzMgc2VsZWN0IGludDRyYW5nZShnLCBnKzEwMCkgZnJvbSBnZW5lcmF0ZV9z ZXJpZXMoNTAxLCAxMDAwLCAxMCkgZzsKK2FuYWx5emUgdGVzdF9yYW5nZV9qb2luXzE7CithbmFs eXplIHRlc3RfcmFuZ2Vfam9pbl8yOworYW5hbHl6ZSB0ZXN0X3JhbmdlX2pvaW5fMzsKKy0tIHJl b3JkZXIgam9pbnMgYmFzZWQgb24gY29tcHV0ZWQgc2VsZWN0aXZpdHkKK2V4cGxhaW4gKGNvc3Rz IG9mZikgc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF9yYW5nZV9qb2luXzEsIHRlc3RfcmFuZ2Vf am9pbl8yLCB0ZXN0X3JhbmdlX2pvaW5fMyB3aGVyZSBpcjEgJiYgaXIyIGFuZCBpcjIgJiYgaXIz OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgQWdncmVnYXRlCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAo dGVzdF9yYW5nZV9qb2luXzEuaXIxICYmIHRlc3RfcmFuZ2Vfam9pbl8yLmlyMikKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pvaW5fMQorICAgICAgICAgLT4gIE1hdGVyaWFs aXplCisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAgICAg IEpvaW4gRmlsdGVyOiAodGVzdF9yYW5nZV9qb2luXzIuaXIyICYmIHRlc3RfcmFuZ2Vfam9pbl8z LmlyMykKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pv aW5fMgorICAgICAgICAgICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGVzdF9yYW5nZV9qb2luXzMKKygxMCByb3dz KQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCBjb3VudCgqKSBmcm9tIHRlc3RfcmFuZ2Vf am9pbl8xLCB0ZXN0X3JhbmdlX2pvaW5fMiwgdGVzdF9yYW5nZV9qb2luXzMgd2hlcmUgaXIxIDw8 IGlyMiBhbmQgaXIyIDw8IGlyMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZp bHRlcjogKHRlc3RfcmFuZ2Vfam9pbl8yLmlyMiA8PCB0ZXN0X3JhbmdlX2pvaW5fMy5pcjMpCisg ICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgIEpvaW4gRmlsdGVyOiAodGVz dF9yYW5nZV9qb2luXzEuaXIxIDw8IHRlc3RfcmFuZ2Vfam9pbl8yLmlyMikKKyAgICAgICAgICAg ICAgIC0+ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pvaW5fMQorICAgICAgICAgICAgICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gdGVzdF9y YW5nZV9qb2luXzIKKyAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIHRlc3RfcmFuZ2Vfam9pbl8zCisoMTAgcm93cykKKworZXhwbGFpbiAoY29z dHMgb2ZmKSBzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fMSwgdGVzdF9yYW5n ZV9qb2luXzIsIHRlc3RfcmFuZ2Vfam9pbl8zIHdoZXJlIGlyMSA+PiBpcjIgYW5kIGlyMiA+PiBp cjM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdh dGUKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6ICh0ZXN0X3Jhbmdl X2pvaW5fMS5pcjEgPj4gdGVzdF9yYW5nZV9qb2luXzIuaXIyKQorICAgICAgICAgLT4gIE5lc3Rl ZCBMb29wCisgICAgICAgICAgICAgICBKb2luIEZpbHRlcjogKHRlc3RfcmFuZ2Vfam9pbl8yLmly MiA+PiB0ZXN0X3JhbmdlX2pvaW5fMy5pcjMpCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gdGVzdF9yYW5nZV9qb2luXzIKKyAgICAgICAgICAgICAgIC0+ICBNYXRlcmlhbGl6ZQorICAg ICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlc3RfcmFuZ2Vfam9pbl8zCisgICAg ICAgICAtPiAgU2VxIFNjYW4gb24gdGVzdF9yYW5nZV9qb2luXzEKKyg5IHJvd3MpCisKK2Ryb3Ag dGFibGUgdGVzdF9yYW5nZV9qb2luXzE7Citkcm9wIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8yOwor ZHJvcCB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fMzsKKy0tCistLSB0ZXN0IHJhbmdlIGpvaW4gc2Vs ZWN0aXZpdHkgd2l0aCBmdWxseSBkaXNqb2ludCBoaXN0b2dyYW1zCistLSAoZXhlcmNpc2VzIHRo ZSBib3VuZHMtY2hlY2sgbG9naWMgd2hlbiBoaXN0b2dyYW1zIGRvIG5vdCBvdmVybGFwKQorLS0K K2NyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fbG8gKHIgaW50NHJhbmdlKTsKK2NyZWF0ZSB0 YWJsZSB0ZXN0X3JhbmdlX2pvaW5faGkgKHIgaW50NHJhbmdlKTsKKy0tIGxvdyByYW5nZXM6IFsx LDExKSwgWzIsMTIpLCAuLi4gWzUwMCw1MTApCitpbnNlcnQgaW50byB0ZXN0X3JhbmdlX2pvaW5f bG8gc2VsZWN0IGludDRyYW5nZShnLCBnKzEwKSBmcm9tIGdlbmVyYXRlX3NlcmllcygxLCA1MDAp IGc7CistLSBoaWdoIHJhbmdlczogWzEwMDAxLDEwMDExKSwgWzEwMDAyLDEwMDEyKSwgLi4uIFsx MDUwMCwxMDUxMCkKK2luc2VydCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl9oaSBzZWxlY3QgaW50NHJh bmdlKGcsIGcrMTApIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEwMDAxLCAxMDUwMCkgZzsKK2FuYWx5 emUgdGVzdF9yYW5nZV9qb2luX2xvOworYW5hbHl6ZSB0ZXN0X3JhbmdlX2pvaW5faGk7CistLSBs byA8PCBoaSBzaG91bGQgcHJvZHVjZSBhIGxhcmdlIHNlbGVjdGl2aXR5IChtb3N0IHBhaXJzIG1h dGNoKQorLS0gbG8gPj4gaGkgc2hvdWxkIHByb2R1Y2UgYSBuZWFyLXplcm8gc2VsZWN0aXZpdHkK Ky0tIGxvICYmIGhpIHNob3VsZCBwcm9kdWNlIGEgbmVhci16ZXJvIHNlbGVjdGl2aXR5IChubyBv dmVybGFwKQorLS0gVGhlc2Ugc2hvdWxkIG5vdCBjcmFzaCBhbmQgc2hvdWxkIHByb2R1Y2Ugc3Rh YmxlIHBsYW5zLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0 X3JhbmdlX2pvaW5fbG8gYSwgdGVzdF9yYW5nZV9qb2luX2hpIGIgd2hlcmUgYS5yIDw8IGIucjsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dy ZWdhdGUKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChhLnIgPDwg Yi5yKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlc3RfcmFuZ2Vfam9pbl9sbyBhCisgICAg ICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZXN0 X3JhbmdlX2pvaW5faGkgYgorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3Qg Y291bnQoKikgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fbG8gYSwgdGVzdF9yYW5nZV9qb2luX2hpIGIg d2hlcmUgYS5yID4+IGIucjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgSm9p biBGaWx0ZXI6IChhLnIgPj4gYi5yKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHRlc3RfcmFu Z2Vfam9pbl9sbyBhCisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pvaW5faGkgYgorKDYgcm93cykKKworZXhwbGFpbiAo Y29zdHMgb2ZmKSBzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fbG8gYSwgdGVz dF9yYW5nZV9qb2luX2hpIGIgd2hlcmUgYS5yICYmIGIucjsKKyAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBOZXN0ZWQg TG9vcAorICAgICAgICAgSm9pbiBGaWx0ZXI6IChhLnIgJiYgYi5yKQorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIHRlc3RfcmFuZ2Vfam9pbl9sbyBhCisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUK KyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiB0ZXN0X3JhbmdlX2pvaW5faGkgYgorKDYg cm93cykKKworZHJvcCB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fbG87Citkcm9wIHRhYmxlIHRlc3Rf cmFuZ2Vfam9pbl9oaTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3JhbmdldHlw ZXMuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvcmFuZ2V0eXBlcy5zcWwKaW5kZXggNWM0YjAz MzdiN2EuLmY2OTEwOWRhMzM0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yYW5n ZXR5cGVzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9yYW5nZXR5cGVzLnNxbApAQCAt NzA4LDMgKzcwOCw1NiBAQCBzZWxlY3QgKiBmcm9tIHRleHRfc3VwcG9ydF90ZXN0IHdoZXJlIHQg PEAgdGV4dHJhbmdlX3N1cHAoJ2EnLCAnZCcpOwogZHJvcCB0YWJsZSB0ZXh0X3N1cHBvcnRfdGVz dDsKIAogZHJvcCB0eXBlIHRleHRyYW5nZV9zdXBwOworCistLQorLS0gdGVzdCBzZWxlY3Rpdml0 eSBvZiByYW5nZSBqb2luIG9wZXJhdG9ycworLS0KK2NyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pv aW5fMSAoaXIxIGludDRyYW5nZSk7CitjcmVhdGUgdGFibGUgdGVzdF9yYW5nZV9qb2luXzIgKGly MiBpbnQ0cmFuZ2UpOworY3JlYXRlIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8zIChpcjMgaW50NHJh bmdlKTsKKworaW5zZXJ0IGludG8gdGVzdF9yYW5nZV9qb2luXzEgc2VsZWN0IGludDRyYW5nZShn LCBnKzEwKSBmcm9tIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwKSBnOworaW5zZXJ0IGludG8gdGVz dF9yYW5nZV9qb2luXzEgc2VsZWN0IGludDRyYW5nZShnLCBnKzEwMCkgZnJvbSBnZW5lcmF0ZV9z ZXJpZXMoMSwgMTAwMCwgMTApIGc7CitpbnNlcnQgaW50byB0ZXN0X3JhbmdlX2pvaW5fMiBzZWxl Y3QgaW50NHJhbmdlKGcsIGcrMTApIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMCkgZzsKK2lu c2VydCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl8yIHNlbGVjdCBpbnQ0cmFuZ2UoZywgZysxMDApIGZy b20gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwMCwgMTApIGc7CitpbnNlcnQgaW50byB0ZXN0X3Jhbmdl X2pvaW5fMyBzZWxlY3QgaW50NHJhbmdlKGcsIGcrMTApIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDUw MSwgMTAwMCkgZzsKK2luc2VydCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl8zIHNlbGVjdCBpbnQ0cmFu Z2UoZywgZysxMDApIGZyb20gZ2VuZXJhdGVfc2VyaWVzKDUwMSwgMTAwMCwgMTApIGc7CisKK2Fu YWx5emUgdGVzdF9yYW5nZV9qb2luXzE7CithbmFseXplIHRlc3RfcmFuZ2Vfam9pbl8yOworYW5h bHl6ZSB0ZXN0X3JhbmdlX2pvaW5fMzsKKworLS0gcmVvcmRlciBqb2lucyBiYXNlZCBvbiBjb21w dXRlZCBzZWxlY3Rpdml0eQorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgY291bnQoKikgZnJv bSB0ZXN0X3JhbmdlX2pvaW5fMSwgdGVzdF9yYW5nZV9qb2luXzIsIHRlc3RfcmFuZ2Vfam9pbl8z IHdoZXJlIGlyMSAmJiBpcjIgYW5kIGlyMiAmJiBpcjM7CitleHBsYWluIChjb3N0cyBvZmYpIHNl bGVjdCBjb3VudCgqKSBmcm9tIHRlc3RfcmFuZ2Vfam9pbl8xLCB0ZXN0X3JhbmdlX2pvaW5fMiwg dGVzdF9yYW5nZV9qb2luXzMgd2hlcmUgaXIxIDw8IGlyMiBhbmQgaXIyIDw8IGlyMzsKK2V4cGxh aW4gKGNvc3RzIG9mZikgc2VsZWN0IGNvdW50KCopIGZyb20gdGVzdF9yYW5nZV9qb2luXzEsIHRl c3RfcmFuZ2Vfam9pbl8yLCB0ZXN0X3JhbmdlX2pvaW5fMyB3aGVyZSBpcjEgPj4gaXIyIGFuZCBp cjIgPj4gaXIzOworCitkcm9wIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl8xOworZHJvcCB0YWJsZSB0 ZXN0X3JhbmdlX2pvaW5fMjsKK2Ryb3AgdGFibGUgdGVzdF9yYW5nZV9qb2luXzM7CisKKy0tCist LSB0ZXN0IHJhbmdlIGpvaW4gc2VsZWN0aXZpdHkgd2l0aCBmdWxseSBkaXNqb2ludCBoaXN0b2dy YW1zCistLSAoZXhlcmNpc2VzIHRoZSBib3VuZHMtY2hlY2sgbG9naWMgd2hlbiBoaXN0b2dyYW1z IGRvIG5vdCBvdmVybGFwKQorLS0KK2NyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5fbG8gKHIg aW50NHJhbmdlKTsKK2NyZWF0ZSB0YWJsZSB0ZXN0X3JhbmdlX2pvaW5faGkgKHIgaW50NHJhbmdl KTsKKworLS0gbG93IHJhbmdlczogWzEsMTEpLCBbMiwxMiksIC4uLiBbNTAwLDUxMCkKK2luc2Vy dCBpbnRvIHRlc3RfcmFuZ2Vfam9pbl9sbyBzZWxlY3QgaW50NHJhbmdlKGcsIGcrMTApIGZyb20g Z2VuZXJhdGVfc2VyaWVzKDEsIDUwMCkgZzsKKy0tIGhpZ2ggcmFuZ2VzOiBbMTAwMDEsMTAwMTEp LCBbMTAwMDIsMTAwMTIpLCAuLi4gWzEwNTAwLDEwNTEwKQoraW5zZXJ0IGludG8gdGVzdF9yYW5n ZV9qb2luX2hpIHNlbGVjdCBpbnQ0cmFuZ2UoZywgZysxMCkgZnJvbSBnZW5lcmF0ZV9zZXJpZXMo MTAwMDEsIDEwNTAwKSBnOworCithbmFseXplIHRlc3RfcmFuZ2Vfam9pbl9sbzsKK2FuYWx5emUg dGVzdF9yYW5nZV9qb2luX2hpOworCistLSBsbyA8PCBoaSBzaG91bGQgcHJvZHVjZSBhIGxhcmdl IHNlbGVjdGl2aXR5IChtb3N0IHBhaXJzIG1hdGNoKQorLS0gbG8gPj4gaGkgc2hvdWxkIHByb2R1 Y2UgYSBuZWFyLXplcm8gc2VsZWN0aXZpdHkKKy0tIGxvICYmIGhpIHNob3VsZCBwcm9kdWNlIGEg bmVhci16ZXJvIHNlbGVjdGl2aXR5IChubyBvdmVybGFwKQorLS0gVGhlc2Ugc2hvdWxkIG5vdCBj cmFzaCBhbmQgc2hvdWxkIHByb2R1Y2Ugc3RhYmxlIHBsYW5zLgorZXhwbGFpbiAoY29zdHMgb2Zm KSBzZWxlY3QgY291bnQoKikgZnJvbSB0ZXN0X3JhbmdlX2pvaW5fbG8gYSwgdGVzdF9yYW5nZV9q b2luX2hpIGIgd2hlcmUgYS5yIDw8IGIucjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IGNv dW50KCopIGZyb20gdGVzdF9yYW5nZV9qb2luX2xvIGEsIHRlc3RfcmFuZ2Vfam9pbl9oaSBiIHdo ZXJlIGEuciA+PiBiLnI7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCBjb3VudCgqKSBmcm9t IHRlc3RfcmFuZ2Vfam9pbl9sbyBhLCB0ZXN0X3JhbmdlX2pvaW5faGkgYiB3aGVyZSBhLnIgJiYg Yi5yOworCitkcm9wIHRhYmxlIHRlc3RfcmFuZ2Vfam9pbl9sbzsKK2Ryb3AgdGFibGUgdGVzdF9y YW5nZV9qb2luX2hpOwotLSAKMi41Mi4wCgo= --000000000000903879064ed313b1--