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 1vyBVr-00HWHj-0y for pgsql-performance@arkaria.postgresql.org; Thu, 05 Mar 2026 16:25:23 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vyBVp-000OdD-1z for pgsql-performance@arkaria.postgresql.org; Thu, 05 Mar 2026 16:25:22 +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 1vyBVo-000Od5-2m for pgsql-performance@lists.postgresql.org; Thu, 05 Mar 2026 16:25:21 +0000 Received: from mail-ed1-x529.google.com ([2a00:1450:4864:20::529]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vyBVm-00000000Yly-2BUl for pgsql-performance@lists.postgresql.org; Thu, 05 Mar 2026 16:25:20 +0000 Received: by mail-ed1-x529.google.com with SMTP id 4fb4d7f45d1cf-660b497acd1so3134098a12.0 for ; Thu, 05 Mar 2026 08:25:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1772727915; cv=none; d=google.com; s=arc-20240605; b=PAOgRvJcbE8V2E2J7tw5OBy0Vkn0nnqXbX4f6oIrSsJyRuTGONBVRoWTKY+wSZO5N5 EeH5QhFnD5w726zNZcDPMWIkPBp0M6KTj045KrMQj9YievA1VBBAs5zv6vvLBr9LvRNY Pn9DecOAOY+A5sloKVEi6CDUGe/tKasqBFBCkQezivZPoLk7W4THj6bCSV4oLB4LGICF Mo7qZe4USFwcKZAQYTMJHlaSuUUCon7SCbARMHJmRwBCmkNFNsEDf9xVoGkyno2Ugkid cdVEGDSRbPOz6LSYQ7MVCXOmcbLTXecLETSF0CL6/jKitvq2dNbEgSTgATdl8i5xwqeP hUMQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=wUf1nPDwpDNZpryfEyg2nLqvSL1TiKSZhdkAgVQ6/iM=; fh=z/JQ2tSXVGoYKKvtD/yyy3g3xqdpsR82Ngoo7GcsvL4=; b=iWPOJz7se3OTtdgVwglJMvH26Z9ucBADYVWv3EcnEpGFYEBHscbX3pHVjPN4wF92+p DKJPun6IsS/ZuAmevk6peAIqbXA447yXD2x6KOs/gzYYzxzF3+/uw5ipTFFsRAxURhOc 4EXIEqeI3dLwYFZRy7nmZESz9LIg94JvPKTvZqp10MjGAhFYDV3Q0i4M/c+cskpmbtBk j4J0wr0GzSpVd89So+lK0zveX05jvekDjebt0gbpdif11EI9egLQsyjQlPXB2QEjdNmG t5Tq2HRBmkituiVFnfAeLDjnOLSxXPyg/ybKS2nEFzt2EhGm5kgXp+McoMlrYedv0i3B EauA==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1772727915; x=1773332715; darn=lists.postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=wUf1nPDwpDNZpryfEyg2nLqvSL1TiKSZhdkAgVQ6/iM=; b=POFehe5XlP97ZUZFuH3Qg+YZpHmPn9Evg50U3/d5o+Am+e7epwjc/N9fVSC3P3z/vB hwbU4GFjnuKxH1VNZOI0SVaQ73PZd7KOsA5wAfRJ9PUjfVHFp5BM9d3HtPAIWLTztCX3 VgPzwOcVh079Y8okdGz/l+VF9gVD5wsrRZHRRbijdUhGhlDlERQW1vlbbU815MI0aD0W BuQc+bob5RBv18UBKoTeSBhilKAVVUENaLS7KgqR3fZ/xZLI0r5ZiSn9xsWfkKgJOSoQ +RzUJm/AsTWRcQMEbg6WvyLiUWf4W3T0EjZcS4z3ozEILtTawy36HHc9Vt07ckBsAXOn SmyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772727915; x=1773332715; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=wUf1nPDwpDNZpryfEyg2nLqvSL1TiKSZhdkAgVQ6/iM=; b=OH31Fpfce1F/Ab/eBOTxwkY8OLHs5VdtXcUtllWL/DrD/g11RcPhoSiqaKiWKVBktm 1Y40L7YdVRZ3Sy7pZqkE8TgHU1AVhtGncHpVIteB55h2Y27vhxuUmPkJLuUtFLcRwkSY dO42bC43NGvj7sf5q9BNoncF/PNPUjjywhAh1x+RdlAGu7v3UEJkPVSnjP4/AHk1Al+K J9PLrcy70VF0XfTQmbVGhCBIbCBy0K5pOr45v3e2CWaFzyoobKbB59sJWDs+uhJFSVDp RstY0Ut2q4q3gKb0Ly9WXTDKpZbRivIyIQ2NaX8rSdkPgOMnLzzwxMBsDvcXhjtwCpLg 2gCA== X-Gm-Message-State: AOJu0YyE/ivBbvMgsNpYrO4hlig+FA05SQuRvp75kX534pOY8iznBwnK b+h0u1sGcJDUj4sVBEXVyutPoNGslH+zDx63VDeORz7uq8TcFpLcs01jPy3pZhRUa3cZg3SM2ju gjHG8eNHkGbRnz9FGXK6HrhVqVl4+TcoI1yso X-Gm-Gg: ATEYQzzDBH7z8VSCaEmqd/WcnsyTgwXMaR0pEzqPV7wNiDqE2XCBcRgLh31743HG1/O aTVn7hQea2edEf/yniDWlBujMXmnnp9cm+K0ubp8AlqvrVQUrxIiEdC+o9G9GI5EWhSN9nB2f/w 4h/7cMc/dXuL4K+VuUNmRnfOeux9qToehs7maj3i03ppXSwG8s4J6GFQdh1XCwVuXMq27m9u0MC LzfOx9jOQzkdDGBOOkNen+mn694jyTn4IbiFjB+GTM6ALOlo/venDjWRWBX/uE7pBQH3Vq2mB76 7dOcMpXQ X-Received: by 2002:a17:906:f5a8:b0:b93:c5a9:a5e2 with SMTP id a640c23a62f3a-b93f1176dafmr417006966b.6.1772727915072; Thu, 05 Mar 2026 08:25:15 -0800 (PST) MIME-Version: 1.0 From: Mauro Gatti Date: Thu, 5 Mar 2026 17:25:02 +0100 X-Gm-Features: AaiRm511j9gX_-LIbg2s5iD1tjvqBC5j1inuPyR_fwxr8ablh31nzg4KUMGOIek Message-ID: Subject: Planner join order regression from PG 15 to PG 16+: 70ms -> 1440ms (self-contained reproducer included) To: pgsql-performance@lists.postgresql.org Content-Type: multipart/mixed; boundary="000000000000a98a86064c49611b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000a98a86064c49611b Content-Type: multipart/alternative; boundary="000000000000a98a80064c496119" --000000000000a98a80064c496119 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi all, I'm reporting a planner regression that started in PostgreSQL 16 and persists through 18. The same query on identical data runs in ~70ms on PG 15 but ~1440ms on PG 16/17/18, due to a different join order chosen by the planner. I've attached a fully self-contained reproducer script (DDL + data generation + query) with anonymised schema names. ## Environment - PG 15.17: ~70ms execution time (good plan) - PG 18.3: ~1440ms execution time (bad plan) - OS: RHEL 9.7 - Architecture: x86_64 - Both servers: identical hardware, identical postgresql.conf, identical data, freshly ANALYZEd ## Summary of the problem The query joins 5 tables (with 2 self-joins) using composite keys. All joins use Nested Loop with Index Scan. The planner estimates rows=3D1 at every join level, but actuals are 105-345 rows. In PG 15, the planner happens to choose a join order where the self-join to `product_options` (aliased as opt2) is at the outermost level with 216 loops. In PG 16+, the planner nests this same self-join *inside* the `option_rules` loop, causing 17,325 loops instead of 216 =E2=80=94 an 80x increase in index scans (~2.8M buffer hits vs trivial). The estimated costs are nearly identical in both versions (~14), so a small change in cost model tips the planner to a different (and much worse) join order. ## Key observations from EXPLAIN ANALYZE ### PG 15 (good plan) product_options opt2 Index Scan: loops=3D216, rows_per_loop=3D279 Total index searches: 216 Execution Time: 70.053 ms ### PG 18 (bad plan) product_options opt2 Index Scan: loops=3D17,325, rows_per_loop=3D209 Total index searches: 17,325 Buffers: shared hit=3D2,825,460 Execution Time: 1440.238 ms The only difference is join order. All other nodes use the same indexes and produce the same row counts. ## Workaround SET LOCAL join_collapse_limit =3D 1; This forces the written join order and restores PG 15 performance. I also tried: - Increased statistics_target to 1000 on all filter columns -> no effect - Extended statistics (ndistinct, mcv) on the 5-column composite key -> no effect - ANALYZE after both changes -> no effect None of these improved the row estimates enough to change the planner's join order decision. ## Reproducer The attached SQL script (reproducer_pg16_join_regression.sql) is fully self-contained: 1. Creates 4 tables with anonymised names 2. Generates ~14M rows with realistic distributions (WARNING 3+ GB of data): - product_options: ~1.39M rows - pricelist_options: ~11.9M rows - option_rules: ~628K rows - tax_codes: 88 rows 3. Creates all indexes 4. Runs ANALYZE 5. Executes the query with EXPLAIN (ANALYZE, BUFFERS, VERBOSE) Expected results: - PG 15: ~70ms, product_options opt2 scanned 216 times - PG 16+: ~1400ms, product_options opt2 scanned ~17K times The script also includes the workaround query (with join_collapse_limit =3D 1) for comparison. ## EXPLAIN ANALYZE output =E2=80=94 PG 15 Nested Loop Left Join (cost=3D4.53..14.03 rows=3D1 width=3D618) (actual time=3D0.904..69.853 rows=3D216 loops=3D1) -> Nested Loop Left Join (cost=3D4.10..11.35 rows=3D1 width=3D506) (actual time=3D0.523..40.812 rows=3D216 loops=3D1) -> Nested Loop Left Join (cost=3D3.67..8.66 rows=3D1 width=3D416) (actual time=3D0.462..31.734 rows=3D216 loops=3D1) -> Nested Loop (cost=3D3.25..5.98 rows=3D1 width=3D332) (actual time=3D0.204..21.633 rows=3D165 loops=3D1) -> Index Scan using pk_product_options on product_options (actual time=3D0.063..0.190 rows=3D345 loops=3D1) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') -> Merge Right Join (cost=3D2.82..3.31 rows=3D1 width=3D220= ) (actual time=3D0.003..0.051 rows=3D165 loops=3D345) -> Index Scan using pk_tax_codes on tax_codes (actual time=3D0.001..0.002 rows=3D9 loops=3D345) -> Sort (cost=3D2.67..2.68 rows=3D1 width=3D90) (actual time=3D0.000..0.006 rows=3D165 loops=3D345) Sort Key: pricelist_options.tax_id Sort Method: quicksort Memory: 48kB -> Index Scan using ix_pricelist_options_1 on pricelist_options (actual time=3D0.030..0.081 rows=3D165 loops=3D1) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001' AND pricelist_id =3D 100) Join Filter: (pricelist_options.brand_id =3D option_rules.brand_id AND ...) Rows Removed by Join Filter: 17220 -> Index Scan using pk_option_rules on option_rules (actual time=3D0.014..0.040 rows=3D105 loops=3D165) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') Join Filter: (pl_check.pricelist_id =3D pricelist_options.pricelist_id AND ...) Rows Removed by Join Filter: 28925 -> Index Scan using ix_pricelist_options_1 on pricelist_options pl_check (actual time=3D0.009..0.022 rows=3D134 loops=3D216) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001' AND pricelist_id =3D 100) -- *** opt2 joined LAST, at outermost level *** -> Index Scan using pk_product_options on product_options opt2 (actual time=3D0.013..0.101 rows=3D279 loops=3D216) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') Planning Time: 4.259 ms Execution Time: 70.053 ms ## EXPLAIN ANALYZE output =E2=80=94 PG 18 Nested Loop Left Join (cost=3D4.80..13.99 rows=3D1 width=3D618) (actual time=3D8.639..1439.956 rows=3D216 loops=3D1) Buffers: shared hit=3D2863489 -> Nested Loop (cost=3D4.37..11.31 rows=3D1 width=3D528) (actual time=3D8.630..1436.943 rows=3D216 loops=3D1) Buffers: shared hit=3D2862852 Join Filter: (pricelist_options.option_type =3D product_options.option_type AND ...) Rows Removed by Join Filter: 34033 -> Nested Loop Left Join (cost=3D3.94..8.64 rows=3D1 width=3D416) (actual time=3D8.608..1422.736 rows=3D216 loops=3D1) Buffers: shared hit=3D2836032 Join Filter: (pricelist_options.option_code =3D option_rules.option_code AND ...) Rows Removed by Join Filter: 17220 -> Merge Right Join (cost=3D3.09..3.31 rows=3D1 width=3D220) (actual time=3D0.145..0.305 rows=3D165 loops=3D1) Buffers: shared hit=3D12 -> Index Scan using pk_tax_codes on tax_codes (actual time=3D0.017..0.020 rows=3D9 loops=3D1) Buffers: shared hit=3D3 -> Sort (cost=3D2.67..2.68 rows=3D1 width=3D90) (actual time=3D0.121..0.158 rows=3D165 loops=3D1) Sort Key: pricelist_options.tax_id Sort Method: quicksort Memory: 45kB Buffers: shared hit=3D9 -> Index Scan using ix_pricelist_options_1 on pricelist_options (actual time=3D0.023..0.073 rows=3D165 loops=3D1) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001' AND pricelist_id =3D 100) Buffers: shared hit=3D9 -- *** opt2 joined INSIDE the option_rules loop *** -> Nested Loop Left Join (cost=3D0.85..5.32 rows=3D1 width=3D19= 6) (actual time=3D0.060..8.612 rows=3D105 loops=3D165) Buffers: shared hit=3D2836020 -> Index Scan using pk_option_rules on option_rules (actual time=3D0.015..0.043 rows=3D105 loops=3D165) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') Index Searches: 165 Buffers: shared hit=3D10560 -- *** THIS IS THE PROBLEM NODE *** -> Index Scan using pk_product_options on product_options opt2 (actual time=3D0.013..0.061 rows=3D209 loops=3D17325) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') Index Searches: 17325 Buffers: shared hit=3D2825460 -> Index Scan using pk_product_options on product_options (actual time=3D0.013..0.049 rows=3D158 loops=3D216) Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC' AND model_year =3D 'YR' AND model_code =3D 'ABC' AND version_code =3D 'VER-001') Index Searches: 216 Buffers: shared hit=3D26820 -> Index Scan using ix_pricelist_options_1 on pricelist_options pl_check (actual time=3D0.013..0.013 rows=3D0.49 loops=3D216) Index Cond: (brand_id =3D option_rules.brand_id AND line_code =3D option_rules.line_code AND model_year =3D option_rules.model_year AND model_code =3D option_rules.model_code AND version_code =3D option_rules.version_code AND pricelist_id =3D 100) Filter: (option_type =3D option_rules.sec_option_type AND option_code =3D option_rules.sec_option_code) Rows Removed by Filter: 49 Index Searches: 105 Buffers: shared hit=3D637 Planning Time: 4.293 ms Execution Time: 1440.238 ms ## Questions for the community 1. Was there a specific commit in the PG 16 cycle that changed how the planner evaluates join orderings for LEFT JOINs, possibly related to the Right Anti Join work or outer join commutation? 2. Given that extended statistics (ndistinct, mcv) on the composite key didn't improve the row estimates, is there a planned improvement to how the planner estimates multi-table join cardinality with correlated composite keys? 3. Is there a way to improve the planner's estimate without resorting to join_collapse_limit =3D 1? Thank you for your time. Happy to provide any additional information. Best regards, Mauro Gatti mauro.gt70@gmail.com --000000000000a98a80064c496119 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi all,

I'm reporting a planner regression that= started in PostgreSQL 16 and
persists through 18. The same query on ide= ntical data runs in ~70ms on
PG 15 but ~1440ms on PG 16/17/18, due to a = different join order chosen
by the planner.

I've attached a f= ully self-contained reproducer script (DDL + data
generation + query) wi= th anonymised schema names.


## Environment

- PG 15.17: ~7= 0ms execution time (good plan)
- PG 18.3: ~1440ms execution time (bad pl= an)
- OS: RHEL 9.7
- Architecture: x86_64
- Both servers: identica= l hardware, identical postgresql.conf,
=C2=A0 identical data, freshly AN= ALYZEd


## Summary of the problem

The query joins 5 tables= (with 2 self-joins) using composite keys.
All joins use Nested Loop wit= h Index Scan. The planner estimates
rows=3D1 at every join level, but ac= tuals are 105-345 rows.

In PG 15, the planner happens to choose a jo= in order where the
self-join to `product_options` (aliased as opt2) is a= t the outermost
level with 216 loops.

In PG 16+, the planner nest= s this same self-join *inside* the
`option_rules` loop, causing 17,325 l= oops instead of 216 =E2=80=94 an 80x
increase in index scans (~2.8M buff= er hits vs trivial).

The estimated costs are nearly identical in bot= h versions (~14),
so a small change in cost model tips the planner to a = different
(and much worse) join order.


## Key observations fr= om EXPLAIN ANALYZE

### PG 15 (good plan)

=C2=A0 product_optio= ns opt2 Index Scan:
=C2=A0 =C2=A0 loops=3D216, rows_per_loop=3D279
= =C2=A0 =C2=A0 Total index searches: 216

=C2=A0 Execution Time: 70.05= 3 ms

### PG 18 (bad plan)

=C2=A0 product_options opt2 Index S= can:
=C2=A0 =C2=A0 loops=3D17,325, rows_per_loop=3D209
=C2=A0 =C2=A0 = Total index searches: 17,325
=C2=A0 =C2=A0 Buffers: shared hit=3D2,825,4= 60

=C2=A0 Execution Time: 1440.238 ms

The only difference is = join order. All other nodes use the same
indexes and produce the same ro= w counts.


## Workaround

=C2=A0 SET LOCAL join_collapse_li= mit =3D 1;

This forces the written join order and restores PG 15 per= formance.

I also tried:
- Increased statistics_target to 1000 on = all filter columns -> no effect
- Extended statistics (ndistinct, mcv= ) on the 5-column composite
=C2=A0 key -> no effect
- ANALYZE afte= r both changes -> no effect

None of these improved the row estima= tes enough to change the
planner's join order decision.


#= # Reproducer

The attached SQL script (reproducer_pg16_join_regressio= n.sql) is
fully self-contained:

=C2=A0 1. Creates 4 tables with a= nonymised names
=C2=A0 2. Generates ~14M rows with realistic distributi= ons (WARNING 3+ GB of data):
=C2=A0 =C2=A0 =C2=A0- product_options: =C2= =A0 ~1.39M rows
=C2=A0 =C2=A0 =C2=A0- pricelist_options: ~11.9M rows
= =C2=A0 =C2=A0 =C2=A0- option_rules: =C2=A0 =C2=A0 =C2=A0~628K rows
=C2= =A0 =C2=A0 =C2=A0- tax_codes: =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A088 rows
= =C2=A0 3. Creates all indexes
=C2=A0 4. Runs ANALYZE
=C2=A0 5. Execut= es the query with EXPLAIN (ANALYZE, BUFFERS, VERBOSE)

Expected resul= ts:
=C2=A0 - PG 15: ~70ms, product_options opt2 scanned 216 times
=C2= =A0 - PG 16+: ~1400ms, product_options opt2 scanned ~17K times

The s= cript also includes the workaround query (with
join_collapse_limit =3D 1= ) for comparison.


## EXPLAIN ANALYZE output =E2=80=94 PG 15
<= br>Nested Loop Left Join =C2=A0(cost=3D4.53..14.03 rows=3D1 width=3D618)=C2=A0 (actual time=3D0.904..69.853 rows=3D216 loops=3D1)
=C2=A0 -> = =C2=A0Nested Loop Left Join =C2=A0(cost=3D4.10..11.35 rows=3D1 width=3D506)=
=C2=A0 =C2=A0 =C2=A0 (actual time=3D0.523..40.812 rows=3D216 loops=3D1)=
=C2=A0 =C2=A0 =C2=A0 -> =C2=A0Nested Loop Left Join =C2=A0(cost=3D3.= 67..8.66 rows=3D1 width=3D416)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actua= l time=3D0.462..31.734 rows=3D216 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 -> =C2=A0Nested Loop =C2=A0(cost=3D3.25..5.98 rows=3D1 width=3D3= 32)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.20= 4..21.633 rows=3D165 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 -> =C2=A0Index Scan using pk_product_options
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 on product_options=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual = time=3D0.063..0.190 rows=3D345 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id =3D 10 AND line_co= de =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D = 9;ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 AND version_code =3D 'VER-001')
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> =C2=A0Merge Right Join =C2=A0(cost=3D2.82= ..3.31 rows=3D1 width=3D220)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.003..0.051 rows=3D165 loops=3D345)=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> =C2= =A0Index Scan using pk_tax_codes on tax_codes
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.001..= 0.002 rows=3D9 loops=3D345)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 -> =C2=A0Sort =C2=A0(cost=3D2.67..2.68 rows=3D1 wid= th=3D90)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 (actual time=3D0.000..0.006 rows=3D165 loops=3D345)
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Sort= Key: pricelist_options.tax_id
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Sort Method: quicksort =C2=A0Memory: 48= kB
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 -> =C2=A0Index Scan using ix_pricelist_options_1
=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 on pricelist_options
=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 (actual time=3D0.03= 0..0.081 rows=3D165 loops=3D1)
=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 Index Cond: (brand_id =3D= 10
=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 AND line_code =3D 'ABC'
=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 AND model_year =3D 'YR'
=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 AND model_code =3D 'ABC'
=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 AND version_= code =3D 'VER-001'
=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 AND pricelist_id =3D 1= 00)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Join Filter: (pricelist_options.b= rand_id =3D
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 option_rules.brand= _id AND ...)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Rows Removed by Join Fil= ter: 17220
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> =C2=A0Index Scan usi= ng pk_option_rules on option_rules
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 (actual time=3D0.014..0.040 rows=3D105 loops=3D165)
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id =3D 10 AND= line_code =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D 'ABC&#= 39;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND version_= code =3D 'VER-001')
=C2=A0 =C2=A0 =C2=A0 Join Filter: (pl_check.= pricelist_id =3D
=C2=A0 =C2=A0 =C2=A0 =C2=A0 pricelist_options.pricelist= _id AND ...)
=C2=A0 =C2=A0 =C2=A0 Rows Removed by Join Filter: 28925
= =C2=A0 =C2=A0 =C2=A0 -> =C2=A0Index Scan using ix_pricelist_options_1=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 on pricelist_options pl_check=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.009..0.022 rows=3D134 = loops=3D216)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id = =3D 10 AND line_code =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D 'ABC'=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND version_code =3D 'VER= -001' AND pricelist_id =3D 100)
=C2=A0 -- *** opt2 joined LAST, at o= utermost level ***
=C2=A0 -> =C2=A0Index Scan using pk_product_option= s
=C2=A0 =C2=A0 =C2=A0 =C2=A0 on product_options opt2
=C2=A0 =C2=A0 = =C2=A0 (actual time=3D0.013..0.101 rows=3D279 loops=3D216)
=C2=A0 =C2=A0= =C2=A0 Index Cond: (brand_id =3D 10 AND line_code =3D 'ABC'
=C2= =A0 =C2=A0 =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D= 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 AND version_code =3D 'VER= -001')

Planning Time: 4.259 ms
Execution Time: 70.053 ms
<= br>
## EXPLAIN ANALYZE output =E2=80=94 PG 18

Nested Loop Left Jo= in =C2=A0(cost=3D4.80..13.99 rows=3D1 width=3D618)
=C2=A0 (actual time= =3D8.639..1439.956 rows=3D216 loops=3D1)
=C2=A0 Buffers: shared hit=3D28= 63489
=C2=A0 -> =C2=A0Nested Loop =C2=A0(cost=3D4.37..11.31 rows=3D1 = width=3D528)
=C2=A0 =C2=A0 =C2=A0 (actual time=3D8.630..1436.943 rows=3D= 216 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 Buffers: shared hit=3D2862852
=C2= =A0 =C2=A0 =C2=A0 Join Filter: (pricelist_options.option_type =3D
=C2=A0= =C2=A0 =C2=A0 =C2=A0 product_options.option_type AND ...)
=C2=A0 =C2=A0= =C2=A0 Rows Removed by Join Filter: 34033
=C2=A0 =C2=A0 =C2=A0 -> = =C2=A0Nested Loop Left Join =C2=A0(cost=3D3.94..8.64 rows=3D1 width=3D416)<= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D8.608..1422.736 rows= =3D216 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffers: shared hit= =3D2836032
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Join Filter: (pricelist_op= tions.option_code =3D
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 option_r= ules.option_code AND ...)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Rows Remove= d by Join Filter: 17220
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> =C2=A0M= erge Right Join =C2=A0(cost=3D3.09..3.31 rows=3D1 width=3D220)
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.145..0.305 rows= =3D165 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffe= rs: shared hit=3D12
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -&g= t; =C2=A0Index Scan using pk_tax_codes on tax_codes
=C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.017..0.020 rows= =3D9 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 Buffers: shared hit=3D3
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 -> =C2=A0Sort =C2=A0(cost=3D2.67..2.68 rows=3D1 width=3D90)
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time= =3D0.121..0.158 rows=3D165 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 Sort Key: pricelist_options.tax_id
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Sort Method: quicks= ort =C2=A0Memory: 45kB
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 Buffers: shared hit=3D9
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> =C2=A0Index Scan using ix_pricelist_opti= ons_1
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 on pricelist_options
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.023..0.073 r= ows=3D165 loops=3D1)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id =3D 10
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND l= ine_code =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND model_year =3D 'YR'
= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 AND model_code =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND version_code = =3D 'VER-001'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND pricelist_id =3D 100)
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffers:= shared hit=3D9
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -- *** opt2 joined IN= SIDE the option_rules loop ***
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -> = =C2=A0Nested Loop Left Join =C2=A0(cost=3D0.85..5.32 rows=3D1 width=3D196)<= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.060..8= .612 rows=3D105 loops=3D165)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 Buffers: shared hit=3D2836020
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 -> =C2=A0Index Scan using pk_option_rules on option_rules<= br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual t= ime=3D0.015..0.043 rows=3D105 loops=3D165)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id =3D 10 AND line_co= de =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D = 9;ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 AND version_code =3D 'VER-001')
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Searches: 165
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffers: shared hit=3D= 10560
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -- *** THIS IS TH= E PROBLEM NODE ***
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ->= ; =C2=A0Index Scan using pk_product_options
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 on product_options opt2
=C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.0= 13..0.061 rows=3D209 loops=3D17325)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Cond: (brand_id =3D 10 AND line_code =3D = 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code =3D 'ABC&#= 39;
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 AND version_code =3D 'VER-001')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Searches: 17325
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffers: shared hit=3D2825= 460
=C2=A0 =C2=A0 =C2=A0 -> =C2=A0Index Scan using pk_product_options= on product_options
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (actual time=3D0.= 013..0.049 rows=3D158 loops=3D216)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 In= dex Cond: (brand_id =3D 10 AND line_code =3D 'ABC'
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND model_year =3D 'YR' AND model_code= =3D 'ABC'
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AND version= _code =3D 'VER-001')
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Index Se= arches: 216
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Buffers: shared hit=3D268= 20
=C2=A0 -> =C2=A0Index Scan using ix_pricelist_options_1
=C2=A0 = =C2=A0 =C2=A0 =C2=A0 on pricelist_options pl_check
=C2=A0 =C2=A0 =C2=A0 = (actual time=3D0.013..0.013 rows=3D0.49 loops=3D216)
=C2=A0 =C2=A0 =C2= =A0 Index Cond: (brand_id =3D option_rules.brand_id
=C2=A0 =C2=A0 =C2=A0= =C2=A0 AND line_code =3D option_rules.line_code
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 AND model_year =3D option_rules.model_year
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 AND model_code =3D option_rules.model_code
=C2=A0 =C2=A0 =C2=A0 = =C2=A0 AND version_code =3D option_rules.version_code
=C2=A0 =C2=A0 =C2= =A0 =C2=A0 AND pricelist_id =3D 100)
=C2=A0 =C2=A0 =C2=A0 Filter: (optio= n_type =3D option_rules.sec_option_type
=C2=A0 =C2=A0 =C2=A0 =C2=A0 AND = option_code =3D option_rules.sec_option_code)
=C2=A0 =C2=A0 =C2=A0 Rows = Removed by Filter: 49
=C2=A0 =C2=A0 =C2=A0 Index Searches: 105
=C2=A0= =C2=A0 =C2=A0 Buffers: shared hit=3D637

Planning Time: 4.293 ms
= Execution Time: 1440.238 ms


## Questions for the community
1. Was there a specific commit in the PG 16 cycle that changed how
=C2= =A0 =C2=A0the planner evaluates join orderings for LEFT JOINs, possibly
= =C2=A0 =C2=A0related to the Right Anti Join work or outer join commutation?=

2. Given that extended statistics (ndistinct, mcv) on the composite=
=C2=A0 =C2=A0key didn't improve the row estimates, is there a plann= ed
=C2=A0 =C2=A0improvement to how the planner estimates multi-table joi= n
=C2=A0 =C2=A0cardinality with correlated composite keys?

3. Is = there a way to improve the planner's estimate without
=C2=A0 =C2=A0r= esorting to join_collapse_limit =3D 1?

Thank you for your time. Happ= y to provide any additional information.

Best regards,

Mauro Gatti
--000000000000a98a80064c496119-- --000000000000a98a86064c49611b Content-Type: application/octet-stream; name="reproducer_pg16_join_regression.sql" Content-Disposition: attachment; filename="reproducer_pg16_join_regression.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mmdocvr90 LS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0KLS0gUG9zdGdyZVNRTCAxNisgUGxhbm5lciBSZWdyZXNz aW9uIFJlcHJvZHVjZXIKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gCi0tIERFU0NSSVBUSU9O OgotLSAgIFRoaXMgc2NyaXB0IGNyZWF0ZXMgYSBzeW50aGV0aWMgZGF0YXNldCB0aGF0IGRlbW9u c3RyYXRlcyBhIGpvaW4gb3JkZXJpbmcKLS0gICByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gUG9z dGdyZVNRTCAxNi4gVGhlIHNhbWUgcXVlcnkgcnVucyBpbiB+NzBtcyBvbgotLSAgIFBHIDE1IGJ1 dCB+MTQwMG1zIG9uIFBHIDE2LzE3LzE4IGR1ZSB0byB0aGUgcGxhbm5lciBjaG9vc2luZyBhCi0t ICAgc2lnbmlmaWNhbnRseSB3b3JzZSBqb2luIG9yZGVyLgotLQotLSBUQUJMRVM6Ci0tICAgcHJv ZHVjdF9vcHRpb25zICAgICh+MS4zOU0gcm93cykgLSBtYXN0ZXIgb3B0aW9ucyBjYXRhbG9ndWUK LS0gICBwcmljZWxpc3Rfb3B0aW9ucyAgKH4xMS44TSByb3dzKSAtIG9wdGlvbnMgd2l0aGluIHBy aWNlIGxpc3RzCi0tICAgb3B0aW9uX3J1bGVzICAgICAgICh+NjI4SyByb3dzKSAgLSBydWxlcyBs aW5raW5nIHByaW1hcnnihpJzZWNvbmRhcnkgb3B0aW9ucwotLSAgIHRheF9jb2RlcyAgICAgICAg ICAoODggcm93cykgICAgIC0gVkFUL3RheCBjb2RlIGxvb2t1cAotLQotLSBVU0FHRToKLS0gICBw c3FsIC1mIHJlcHJvZHVjZXJfcGcxNl9qb2luX3JlZ3Jlc3Npb24uc3FsCi0tICAgKFRha2VzIGEg ZmV3IG1pbnV0ZXMgdG8gZ2VuZXJhdGUgfjE0TSByb3dzKQotLQotLSBFWFBFQ1RFRCBCRUhBVklP VVI6Ci0tICAgUEcgMTU6ICBFeGVjdXRpb24gdGltZSB+NzBtcyAgICh0YmxhdW5vcHRpb25hbHMw MDExIHNjYW5uZWQgMjE2IHRpbWVzKQotLSAgIFBHIDE2KzogRXhlY3V0aW9uIHRpbWUgfjE0MDBt cyAodGJsYXVub3B0aW9uYWxzMDAxMSBzY2FubmVkIDE3LDMyNSB0aW1lcykKLS0KLS0gVGhlIHJl Z3Jlc3Npb24gaXMgY2F1c2VkIGJ5IHRoZSBwbGFubmVyIGNob29zaW5nIGEgZGlmZmVyZW50IGpv aW4gb3JkZXIuCi0tIFNldHRpbmcgam9pbl9jb2xsYXBzZV9saW1pdCA9IDEgcmVzdG9yZXMgUEcg MTUgcGVyZm9ybWFuY2Ugb24gUEcgMTYrLgotLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLS0gQ2xl YW4gdXAgaWYgcmUtcnVubmluZwpEUk9QIFRBQkxFIElGIEVYSVNUUyBwcmljZWxpc3Rfb3B0aW9u cyBDQVNDQURFOwpEUk9QIFRBQkxFIElGIEVYSVNUUyBvcHRpb25fcnVsZXMgQ0FTQ0FERTsKRFJP UCBUQUJMRSBJRiBFWElTVFMgcHJvZHVjdF9vcHRpb25zIENBU0NBREU7CkRST1AgVEFCTEUgSUYg RVhJU1RTIHRheF9jb2RlcyBDQVNDQURFOwoKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gMS4g U0NIRU1BIERFRklOSVRJT04KLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkNSRUFURSBUQUJMRSB0 YXhfY29kZXMgKAogICAgdGF4X2lkICAgICAgICAgIGludGVnZXIgICAgICAgTk9UIE5VTEwsCiAg ICBkZXNjcmlwdGlvbiAgICAgdmFyY2hhcigxMDApLAogICAgdGF4X3JhdGUgICAgICAgIG51bWVy aWMoNSwyKSwKICAgIGNyZWF0ZWRfYXQgICAgICB0aW1lc3RhbXAgICAgIERFRkFVTFQgbm93KCks CiAgICBjcmVhdGVkX2J5X2NvbXBhbnkgaW50ZWdlciAgICBERUZBVUxUIDEsCiAgICBjcmVhdGVk X2J5X3VzZXIgaW50ZWdlciAgICAgICBERUZBVUxUIDEsCiAgICBtb2RpZmllZF9hdCAgICAgdGlt ZXN0YW1wICAgICBERUZBVUxUIG5vdygpLAogICAgbW9kaWZpZWRfYnlfdXNlciBpbnRlZ2VyICAg ICAgREVGQVVMVCAxLAogICAgb3BlcmF0aW9uX3R5cGUgIHZhcmNoYXIoMTApLAogICAgcm93X3Zl cnNpb24gICAgIGJpZ2ludCAgICAgICAgREVGQVVMVCAxLAogICAgbG9uZ19kZXNjcmlwdGlvbiB2 YXJjaGFyKDIwMCksCiAgICB0YXhfYmFzZSAgICAgICAgbnVtZXJpYyg1LDIpLAogICAgZmxhZ18x ICAgICAgICAgIGJvb2xlYW4gICAgICAgREVGQVVMVCBmYWxzZSwKICAgIGZsYWdfMiAgICAgICAg ICBib29sZWFuICAgICAgIERFRkFVTFQgZmFsc2UsCiAgICBmbGFnXzMgICAgICAgICAgYm9vbGVh biAgICAgICBERUZBVUxUIGZhbHNlLAogICAgZmxhZ180ICAgICAgICAgIGJvb2xlYW4gICAgICAg REVGQVVMVCBmYWxzZSwKICAgIGZsYWdfNSAgICAgICAgICBib29sZWFuICAgICAgIERFRkFVTFQg ZmFsc2UsCiAgICBmbGFnXzYgICAgICAgICAgYm9vbGVhbiAgICAgICBERUZBVUxUIGZhbHNlLAog ICAgZmxhZ183ICAgICAgICAgIGJvb2xlYW4gICAgICAgREVGQVVMVCBmYWxzZSwKICAgIGZsYWdf OCAgICAgICAgICBib29sZWFuICAgICAgIERFRkFVTFQgZmFsc2UsCiAgICBmbGFnXzkgICAgICAg ICAgYm9vbGVhbiAgICAgICBERUZBVUxUIGZhbHNlLAogICAgQ09OU1RSQUlOVCBwa190YXhfY29k ZXMgUFJJTUFSWSBLRVkgKHRheF9pZCkKKTsKCkNSRUFURSBUQUJMRSBwcm9kdWN0X29wdGlvbnMg KAogICAgYnJhbmRfaWQgICAgICAgIGludGVnZXIgICAgICAgTk9UIE5VTEwsCiAgICBsaW5lX2Nv ZGUgICAgICAgdmFyY2hhcigyMCkgICBOT1QgTlVMTCwKICAgIG1vZGVsX3llYXIgICAgICB2YXJj aGFyKDEwKSAgIE5PVCBOVUxMLAogICAgbW9kZWxfY29kZSAgICAgIHZhcmNoYXIoMjApICAgTk9U IE5VTEwsCiAgICB2ZXJzaW9uX2NvZGUgICAgdmFyY2hhcigzMCkgICBOT1QgTlVMTCwKICAgIG9w dGlvbl90eXBlICAgICB2YXJjaGFyKDEwKSAgIE5PVCBOVUxMLAogICAgb3B0aW9uX2NvZGUgICAg IHZhcmNoYXIoMjApICAgTk9UIE5VTEwsCiAgICBjcmVhdGVkX2F0ICAgICAgdGltZXN0YW1wICAg ICBERUZBVUxUIG5vdygpLAogICAgY3JlYXRlZF9ieV9jb21wYW55IGludGVnZXIgICAgREVGQVVM VCAxLAogICAgY3JlYXRlZF9ieV91c2VyIGludGVnZXIgICAgICAgREVGQVVMVCAxLAogICAgbW9k aWZpZWRfYXQgICAgIHRpbWVzdGFtcCAgICAgREVGQVVMVCBub3coKSwKICAgIG1vZGlmaWVkX2J5 X3VzZXIgaW50ZWdlciAgICAgIERFRkFVTFQgMSwKICAgIHByb2RfZW5kX2RhdGUgICBkYXRlLAog ICAgcm93X3ZlcnNpb24gICAgIGJpZ2ludCAgICAgICAgREVGQVVMVCAxLAogICAgaXNfY29udHJh Y3QgICAgIGJvb2xlYW4gICAgICAgREVGQVVMVCBmYWxzZSwKICAgIG5vdGVfaWQgICAgICAgICBp bnRlZ2VyLAogICAgZGVzY3JpcHRpb24gICAgIHZhcmNoYXIoMjAwKSwKICAgIENPTlNUUkFJTlQg cGtfcHJvZHVjdF9vcHRpb25zIFBSSU1BUlkgS0VZIChicmFuZF9pZCwgbGluZV9jb2RlLCBtb2Rl bF95ZWFyLCBtb2RlbF9jb2RlLCB2ZXJzaW9uX2NvZGUsIG9wdGlvbl90eXBlLCBvcHRpb25fY29k ZSkKKTsKCkNSRUFURSBUQUJMRSBwcmljZWxpc3Rfb3B0aW9ucyAoCiAgICBwcmljZWxpc3RfaWQg ICAgaW50ZWdlciAgICAgICBOT1QgTlVMTCwKICAgIGJyYW5kX2lkICAgICAgICBpbnRlZ2VyICAg ICAgIE5PVCBOVUxMLAogICAgbGluZV9jb2RlICAgICAgIHZhcmNoYXIoMjApICAgTk9UIE5VTEws CiAgICBtb2RlbF95ZWFyICAgICAgdmFyY2hhcigxMCkgICBOT1QgTlVMTCwKICAgIG1vZGVsX2Nv ZGUgICAgICB2YXJjaGFyKDIwKSAgIE5PVCBOVUxMLAogICAgdmVyc2lvbl9jb2RlICAgIHZhcmNo YXIoMzApICAgTk9UIE5VTEwsCiAgICBvcHRpb25fdHlwZSAgICAgdmFyY2hhcigxMCkgICBOT1Qg TlVMTCwKICAgIG9wdGlvbl9jb2RlICAgICB2YXJjaGFyKDIwKSAgIE5PVCBOVUxMLAogICAgcHJp Y2VfaW5jbCAgICAgIG51bWVyaWMoMTIsMiksCiAgICBwcmljZV9leGNsICAgICAgbnVtZXJpYygx MiwyKSwKICAgIGRlYWxlcl9uZXRfZXhjbCBudW1lcmljKDEyLDIpLAogICAgdGF4X2lkICAgICAg ICAgIGludGVnZXIsCiAgICBtb2RpZmllZF9hdCAgICAgdGltZXN0YW1wICAgICBERUZBVUxUIG5v dygpLAogICAgY3JlYXRlZF9ieV9jb21wYW55IGludGVnZXIgICAgREVGQVVMVCAxLAogICAgY3Jl YXRlZF9ieV91c2VyIGludGVnZXIgICAgICAgREVGQVVMVCAxLAogICAgY3JlYXRlZF9hdCAgICAg IHRpbWVzdGFtcCAgICAgREVGQVVMVCBub3coKSwKICAgIG1vZGlmaWVkX2J5X3VzZXIgaW50ZWdl ciAgICAgIERFRkFVTFQgMSwKICAgIHJvd192ZXJzaW9uICAgICBiaWdpbnQgICAgICAgIERFRkFV TFQgMSwKICAgIGlzX3Zpc2libGUgICAgICBib29sZWFuICAgICAgIERFRkFVTFQgdHJ1ZSwKICAg IHNvcnRfb3JkZXIgICAgICBpbnRlZ2VyLAogICAgQ09OU1RSQUlOVCBwa19wcmljZWxpc3Rfb3B0 aW9ucyBQUklNQVJZIEtFWSAocHJpY2VsaXN0X2lkLCBicmFuZF9pZCwgbGluZV9jb2RlLCBtb2Rl bF95ZWFyLCBtb2RlbF9jb2RlLCB2ZXJzaW9uX2NvZGUsIG9wdGlvbl90eXBlLCBvcHRpb25fY29k ZSkKKTsKCkNSRUFURSBUQUJMRSBvcHRpb25fcnVsZXMgKAogICAgYnJhbmRfaWQgICAgICAgIGlu dGVnZXIgICAgICAgTk9UIE5VTEwsCiAgICBsaW5lX2NvZGUgICAgICAgdmFyY2hhcigyMCkgICBO T1QgTlVMTCwKICAgIG1vZGVsX3llYXIgICAgICB2YXJjaGFyKDEwKSAgIE5PVCBOVUxMLAogICAg bW9kZWxfY29kZSAgICAgIHZhcmNoYXIoMjApICAgTk9UIE5VTEwsCiAgICB2ZXJzaW9uX2NvZGUg ICAgdmFyY2hhcigzMCkgICBOT1QgTlVMTCwKICAgIG9wdGlvbl90eXBlICAgICB2YXJjaGFyKDEw KSAgIE5PVCBOVUxMLAogICAgb3B0aW9uX2NvZGUgICAgIHZhcmNoYXIoMjApICAgTk9UIE5VTEws CiAgICBzZWNfb3B0aW9uX3R5cGUgdmFyY2hhcigxMCksCiAgICBjb25zdHJhaW50X3R5cGUgdmFy Y2hhcigxMCksCiAgICBjcmVhdGVkX2J5X3VzZXIgaW50ZWdlciAgICAgICBERUZBVUxUIDEsCiAg ICBzZWNfb3B0aW9uX2NvZGUgdmFyY2hhcigyMCksCiAgICBjcmVhdGVkX2F0ICAgICAgdGltZXN0 YW1wICAgICBERUZBVUxUIG5vdygpLAogICAgY3JlYXRlZF9ieV9jb21wYW55IGludGVnZXIgICAg REVGQVVMVCAxLAogICAgbW9kaWZpZWRfYXQgICAgIHRpbWVzdGFtcCAgICAgREVGQVVMVCBub3co KSwKICAgIG1vZGlmaWVkX2J5X3VzZXIgaW50ZWdlciAgICAgIERFRkFVTFQgMSwKICAgIHJvd192 ZXJzaW9uICAgICBiaWdpbnQgICAgICAgIERFRkFVTFQgMSwKICAgIHNlcV9udW1iZXIgICAgICBp bnRlZ2VyICAgICAgIE5PVCBOVUxMLAogICAgQ09OU1RSQUlOVCBwa19vcHRpb25fcnVsZXMgUFJJ TUFSWSBLRVkgKGJyYW5kX2lkLCBsaW5lX2NvZGUsIG1vZGVsX3llYXIsIG1vZGVsX2NvZGUsIHZl cnNpb25fY29kZSwgb3B0aW9uX3R5cGUsIG9wdGlvbl9jb2RlLCBzZXFfbnVtYmVyKQopOwoKLS0g PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KLS0gMi4gSU5ERVggQ1JFQVRJT04gKG1hdGNoZXMgcHJvZHVj dGlvbikKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCi0tIENvbXBvc2l0ZSBpbmRleCBvbiBwcmlj ZWxpc3Rfb3B0aW9ucyB1c2VkIGZvciBmaWx0ZXJlZCBsb29rdXBzCi0tIChicmFuZF9pZCwgbGlu ZV9jb2RlLCBtb2RlbF95ZWFyLCBtb2RlbF9jb2RlLCB2ZXJzaW9uX2NvZGUsIHByaWNlbGlzdF9p ZCkKQ1JFQVRFIElOREVYIGl4X3ByaWNlbGlzdF9vcHRpb25zXzEgT04gcHJpY2VsaXN0X29wdGlv bnMgKAogICAgYnJhbmRfaWQsIGxpbmVfY29kZSwgbW9kZWxfeWVhciwgbW9kZWxfY29kZSwgdmVy c2lvbl9jb2RlLCBwcmljZWxpc3RfaWQKKTsKCi0tID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIDMu IERBVEEgR0VORVJBVElPTgotLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLS0gS2V5IGRpbWVuc2lv bnMgKGRlcml2ZWQgZnJvbSBwcm9kdWN0aW9uIHN0YXRpc3RpY3MpOgotLSAgIDE4ICBkaXN0aW5j dCBicmFuZF9pZCB2YWx1ZXMKLS0gICAxMDQgZGlzdGluY3QgbGluZV9jb2RlIHZhbHVlcyAobm90 IGFsbCBicmFuZHMgaGF2ZSBhbGwgbGluZXMpCi0tICAgMTggIGRpc3RpbmN0IG1vZGVsX3llYXIg dmFsdWVzCi0tICAgMTYxIGRpc3RpbmN0IG1vZGVsX2NvZGUgdmFsdWVzCi0tICAgNTk3OCBkaXN0 aW5jdCB2ZXJzaW9uX2NvZGUgdmFsdWVzCi0tICAgNCAgIGRpc3RpbmN0IG9wdGlvbl90eXBlIHZh bHVlcwotLSAgIH4xNDE5MSBkaXN0aW5jdCBvcHRpb25fY29kZSB2YWx1ZXMgKH4yLjQgcGVyIHZl cnNpb24pCi0tICAgfjEyIHByaWNlbGlzdHMgcGVyIHZlcnNpb24KLS0gICA4OCAgdGF4IGNvZGVz Ci0tCi0tIFRhcmdldCByb3cgY291bnRzOgotLSAgIHByb2R1Y3Rfb3B0aW9uczogICB+MSwzOTAs NTg1ICAofjIzMiBvcHRpb25zIHBlciB2ZXJzaW9uKQotLSAgIHByaWNlbGlzdF9vcHRpb25zOiB+ MTEsODM2LDQ0MCAofjE2NSBwcmljZWxpc3QgZW50cmllcyBwZXIgdmVyc2lvbiBwZXIgcHJpY2Vs aXN0KQotLSAgIG9wdGlvbl9ydWxlczogICAgICB+NjI3LDY5MCAgICh+MTA1IHJ1bGVzIHBlciB2 ZXJzaW9uKQotLSAgIHRheF9jb2RlczogICAgICAgICA4OAoKXGVjaG8gJz09PSBHZW5lcmF0aW5n IHRheF9jb2RlcyAoODggcm93cykgPT09JwoKSU5TRVJUIElOVE8gdGF4X2NvZGVzICh0YXhfaWQs IGRlc2NyaXB0aW9uLCB0YXhfcmF0ZSwgb3BlcmF0aW9uX3R5cGUsIGxvbmdfZGVzY3JpcHRpb24s IHRheF9iYXNlKQpTRUxFQ1QKICAgIGcgQVMgdGF4X2lkLAogICAgJ1RheCBjb2RlICcgfHwgZyBB UyBkZXNjcmlwdGlvbiwKICAgIENBU0UKICAgICAgICBXSEVOIGcgPD0gMjAgVEhFTiByb3VuZCgo cmFuZG9tKCkgKiAyNSk6Om51bWVyaWMsIDIpCiAgICAgICAgRUxTRSAwCiAgICBFTkQgQVMgdGF4 X3JhdGUsCiAgICBDQVNFIChnICUgMykKICAgICAgICBXSEVOIDAgVEhFTiAnU1REJwogICAgICAg IFdIRU4gMSBUSEVOICdSRUQnCiAgICAgICAgRUxTRSAnRVhNJwogICAgRU5EIEFTIG9wZXJhdGlv bl90eXBlLAogICAgJ0V4dGVuZGVkIGRlc2NyaXB0aW9uIGZvciB0YXggY29kZSAnIHx8IGcgQVMg bG9uZ19kZXNjcmlwdGlvbiwKICAgIDEwMC4wMCBBUyB0YXhfYmFzZQpGUk9NIGdlbmVyYXRlX3Nl cmllcygxLCA4OCkgZzsKClxlY2hvICc9PT0gR2VuZXJhdGluZyB2ZXJzaW9uIGRpbWVuc2lvbiAo NTk3OCB2ZXJzaW9ucykgPT09JwoKLS0gQ3JlYXRlIGEgdGVtcG9yYXJ5IHRhYmxlIHdpdGggYWxs IHZlcnNpb24gY29tYmluYXRpb25zCi0tIFdlIHVzZSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmU6 IGJyYW5kIOKGkiBsaW5lIOKGkiBtb2RlbF95ZWFyIOKGkiBtb2RlbCDihpIgdmVyc2lvbgotLSB0 byBtaW1pYyB0aGUgY29ycmVsYXRlZCBuYXR1cmUgb2YgdGhlIHJlYWwgZGF0YQpEUk9QIFRBQkxF IElGIEVYSVNUUyBfdmVyc2lvbnM7CkNSRUFURSBURU1QT1JBUlkgVEFCTEUgX3ZlcnNpb25zICgK ICAgIHZlcnNpb25faWQgIHNlcmlhbCBQUklNQVJZIEtFWSwKICAgIGJyYW5kX2lkICAgIGludGVn ZXIsCiAgICBsaW5lX2NvZGUgICB2YXJjaGFyKDIwKSwKICAgIG1vZGVsX3llYXIgIHZhcmNoYXIo MTApLAogICAgbW9kZWxfY29kZSAgdmFyY2hhcigyMCksCiAgICB2ZXJzaW9uX2NvZGUgdmFyY2hh cigzMCkKKTsKCi0tIEdlbmVyYXRlIDU5NzggdmVyc2lvbnMgd2l0aCByZWFsaXN0aWMgaGllcmFy Y2hpY2FsIGRpc3RyaWJ1dGlvbgotLSB+MTggYnJhbmRzLCBlYWNoIHdpdGggdmFyeWluZyBudW1i ZXJzIG9mIGxpbmVzL21vZGVscy92ZXJzaW9ucwpJTlNFUlQgSU5UTyBfdmVyc2lvbnMgKGJyYW5k X2lkLCBsaW5lX2NvZGUsIG1vZGVsX3llYXIsIG1vZGVsX2NvZGUsIHZlcnNpb25fY29kZSkKU0VM RUNUCiAgICBicmFuZF9pZCwKICAgIGxpbmVfY29kZSwKICAgIG1vZGVsX3llYXIsCiAgICBtb2Rl bF9jb2RlLAogICAgdmVyc2lvbl9jb2RlCkZST00gKAogICAgU0VMRUNUCiAgICAgICAgKChnIC0g MSkgJSAxOCkgKyAxIEFTIGJyYW5kX2lkLAogICAgICAgICdMTicgfHwgbHBhZCgoKChnIC0gMSkg LyAxOCkgJSAxMDQgKyAxKTo6dGV4dCwgMywgJzAnKSBBUyBsaW5lX2NvZGUsCiAgICAgICAgJ01Z JyB8fCBscGFkKCgoKGcgLSAxKSAvICgxOCAqIDEwNCkpICUgMTggKyAxKTo6dGV4dCwgMiwgJzAn KSBBUyBtb2RlbF95ZWFyLAogICAgICAgICdNRCcgfHwgbHBhZCgoKChnIC0gMSkgLyAoMTggKiA2 KSkgJSAxNjEgKyAxKTo6dGV4dCwgMywgJzAnKSBBUyBtb2RlbF9jb2RlLAogICAgICAgICdWRVIt JyB8fCBscGFkKGc6OnRleHQsIDUsICcwJykgQVMgdmVyc2lvbl9jb2RlLAogICAgICAgIGcKICAg IEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDU5NzgpIGcKKSBzdWI7CgotLSBFbnN1cmUgb3VyICJ0 YXJnZXQiIHZlcnNpb24gZXhpc3RzIHdpdGgga25vd24gaWRlbnRpZmllcnMKLS0gVGhpcyBpcyB0 aGUgdmVyc2lvbiB0aGF0IHdpbGwgYmUgcXVlcmllZCBpbiB0aGUgcmVwcm9kdWNlcgotLSAobWFw cyB0byBicmFuZF9pZD0xMCwgbGluZV9jb2RlPSdBQkMnLCBtb2RlbF95ZWFyPSdZUicsCi0tICBt b2RlbF9jb2RlPSdBQkMnLCB2ZXJzaW9uX2NvZGU9J1ZFUi0wMDEnKQpVUERBVEUgX3ZlcnNpb25z ClNFVCBicmFuZF9pZCA9IDEwLAogICAgbGluZV9jb2RlID0gJ0FCQycsCiAgICBtb2RlbF95ZWFy ID0gJ1lSJywKICAgIG1vZGVsX2NvZGUgPSAnQUJDJywKICAgIHZlcnNpb25fY29kZSA9ICdWRVIt MDAxJwpXSEVSRSB2ZXJzaW9uX2lkID0gMTsKClxlY2hvICc9PT0gR2VuZXJhdGluZyBwcm9kdWN0 X29wdGlvbnMgKH4xLjM5TSByb3dzKSA9PT0nClxlY2hvICcgICAgVGhpcyBtYXkgdGFrZSBhIG1p bnV0ZS4uLicKCi0tIH4yMzIgb3B0aW9ucyBwZXIgdmVyc2lvbiwgdXNpbmcgNCBvcHRpb24gdHlw ZXMgd2l0aCB2YXJ5aW5nIG9wdGlvbiBjb2RlcwotLSBUYXJnZXQgdmVyc2lvbiAodmVyc2lvbl9p ZD0xKSBnZXRzIGV4YWN0bHkgMzQ1IG9wdGlvbnMgdG8gbWF0Y2ggcHJvZHVjdGlvbgpJTlNFUlQg SU5UTyBwcm9kdWN0X29wdGlvbnMgKGJyYW5kX2lkLCBsaW5lX2NvZGUsIG1vZGVsX3llYXIsIG1v ZGVsX2NvZGUsIHZlcnNpb25fY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRp b25fdHlwZSwgb3B0aW9uX2NvZGUsIGRlc2NyaXB0aW9uLCBub3RlX2lkKQpTRUxFQ1QKICAgIHYu YnJhbmRfaWQsCiAgICB2LmxpbmVfY29kZSwKICAgIHYubW9kZWxfeWVhciwKICAgIHYubW9kZWxf Y29kZSwKICAgIHYudmVyc2lvbl9jb2RlLAogICAgb3B0X3R5cGUsCiAgICBvcHRfY29kZSwKICAg ICdPcHRpb24gJyB8fCBvcHRfdHlwZSB8fCAnLScgfHwgb3B0X2NvZGUgQVMgZGVzY3JpcHRpb24s CiAgICAocmFuZG9tKCkgKiAxMDApOjppbnRlZ2VyIEFTIG5vdGVfaWQKRlJPTSBfdmVyc2lvbnMg dgpDUk9TUyBKT0lOIExBVEVSQUwgKAogICAgU0VMRUNUCiAgICAgICAgJ1QnIHx8ICgoZyAtIDEp ICUgNCArIDEpIEFTIG9wdF90eXBlLAogICAgICAgICdPUFQnIHx8IGxwYWQoZzo6dGV4dCwgNSwg JzAnKSBBUyBvcHRfY29kZQogICAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwKICAgICAgICBDQVNF IFdIRU4gdi52ZXJzaW9uX2lkID0gMSBUSEVOIDM0NSBFTFNFIDIzMiBFTkQKICAgICkgZwopIG9w dHMob3B0X3R5cGUsIG9wdF9jb2RlKTsKClxlY2hvICc9PT0gR2VuZXJhdGluZyBvcHRpb25fcnVs ZXMgKH42MjhLIHJvd3MpID09PScKXGVjaG8gJyAgICBUaGlzIG1heSB0YWtlIGEgbWludXRlLi4u JwoKLS0gfjEwNSBydWxlcyBwZXIgdmVyc2lvbiwgbGlua2luZyBwcmltYXJ5IG9wdGlvbnMgdG8g c2Vjb25kYXJ5IG9wdGlvbnMKLS0gRWFjaCBydWxlIHBvaW50cyBmcm9tIG9uZSBvcHRpb24gKHR5 cGUrY29kZSkgdG8gYW5vdGhlciAoc2VjX3R5cGUrc2VjX2NvZGUpCi0tIFRhcmdldCB2ZXJzaW9u IGdldHMgZXhhY3RseSAxMDUgcnVsZXMgdG8gbWF0Y2ggcHJvZHVjdGlvbgpJTlNFUlQgSU5UTyBv cHRpb25fcnVsZXMgKGJyYW5kX2lkLCBsaW5lX2NvZGUsIG1vZGVsX3llYXIsIG1vZGVsX2NvZGUs IHZlcnNpb25fY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fdHlwZSwgb3B0 aW9uX2NvZGUsIHNlY19vcHRpb25fdHlwZSwgc2VjX29wdGlvbl9jb2RlLAogICAgICAgICAgICAg ICAgICAgICAgICAgIGNvbnN0cmFpbnRfdHlwZSwgc2VxX251bWJlcikKU0VMRUNUCiAgICB2LmJy YW5kX2lkLAogICAgdi5saW5lX2NvZGUsCiAgICB2Lm1vZGVsX3llYXIsCiAgICB2Lm1vZGVsX2Nv ZGUsCiAgICB2LnZlcnNpb25fY29kZSwKICAgIHJ1bGUub3B0X3R5cGUsCiAgICBydWxlLm9wdF9j b2RlLAogICAgcnVsZS5zZWNfb3B0X3R5cGUsCiAgICBydWxlLnNlY19vcHRfY29kZSwKICAgIENB U0UgKGcgJSAzKSBXSEVOIDAgVEhFTiAnUkVRJyBXSEVOIDEgVEhFTiAnRVhDJyBFTFNFICdJTkMn IEVORCwKICAgIGcgQVMgc2VxX251bWJlcgpGUk9NIF92ZXJzaW9ucyB2CkNST1NTIEpPSU4gTEFU RVJBTCAoCiAgICBTRUxFQ1QKICAgICAgICBnLAogICAgICAgICdUJyB8fCAoKGcgLSAxKSAlIDQg KyAxKSBBUyBvcHRfdHlwZSwKICAgICAgICAnT1BUJyB8fCBscGFkKCgoZyAtIDEpICUgODAgKyAx KTo6dGV4dCwgNSwgJzAnKSBBUyBvcHRfY29kZSwKICAgICAgICAtLSBTZWNvbmRhcnkgb3B0aW9u IHJlZmVyZW5jZXMgYSBkaWZmZXJlbnQgb3B0aW9uIGZyb20gdGhlIHNhbWUgdmVyc2lvbgogICAg ICAgICdUJyB8fCAoKChnIC0gMSkgKyAyKSAlIDQgKyAxKSBBUyBzZWNfb3B0X3R5cGUsCiAgICAg ICAgJ09QVCcgfHwgbHBhZCgoKGcgLSAxKSAlIDgwICsgODEpOjp0ZXh0LCA1LCAnMCcpIEFTIHNl Y19vcHRfY29kZQogICAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwKICAgICAgICBDQVNFIFdIRU4g di52ZXJzaW9uX2lkID0gMSBUSEVOIDEwNSBFTFNFIDEwNSBFTkQKICAgICkgZwopIHJ1bGU7Cgpc ZWNobyAnPT09IEdlbmVyYXRpbmcgcHJpY2VsaXN0X29wdGlvbnMgKH4xMS44TSByb3dzKSA9PT0n ClxlY2hvICcgICAgVGhpcyB3aWxsIHRha2Ugc2V2ZXJhbCBtaW51dGVzLi4uJwoKLS0gfjEyIHBy aWNlbGlzdHMgcGVyIHZlcnNpb24sIGVhY2ggd2l0aCB+MTY1IGVudHJpZXMKLS0gVGFyZ2V0IHZl cnNpb24gKyBwcmljZWxpc3RfaWQ9MTAwIGdldHMgZXhhY3RseSAxNjUgcm93cwotLSBXZSBhc3Np Z24gdGF4X2lkIGZyb20gdGhlIDg4IGF2YWlsYWJsZSB0YXggY29kZXMKSU5TRVJUIElOVE8gcHJp Y2VsaXN0X29wdGlvbnMgKHByaWNlbGlzdF9pZCwgYnJhbmRfaWQsIGxpbmVfY29kZSwgbW9kZWxf eWVhciwgbW9kZWxfY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25f Y29kZSwgb3B0aW9uX3R5cGUsIG9wdGlvbl9jb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcHJpY2VfaW5jbCwgcHJpY2VfZXhjbCwgZGVhbGVyX25ldF9leGNsLAogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgdGF4X2lkLCBpc192aXNpYmxlLCBzb3J0X29yZGVyKQpTRUxF Q1QKICAgIHBsLnByaWNlbGlzdF9pZCwKICAgIHYuYnJhbmRfaWQsCiAgICB2LmxpbmVfY29kZSwK ICAgIHYubW9kZWxfeWVhciwKICAgIHYubW9kZWxfY29kZSwKICAgIHYudmVyc2lvbl9jb2RlLAog ICAgcGwub3B0X3R5cGUsCiAgICBwbC5vcHRfY29kZSwKICAgIHJvdW5kKChyYW5kb20oKSAqIDEw MDAwKTo6bnVtZXJpYywgMikgQVMgcHJpY2VfaW5jbCwKICAgIHJvdW5kKChyYW5kb20oKSAqIDkw MDApOjpudW1lcmljLCAyKSBBUyBwcmljZV9leGNsLAogICAgcm91bmQoKHJhbmRvbSgpICogNzAw MCk6Om51bWVyaWMsIDIpIEFTIGRlYWxlcl9uZXRfZXhjbCwKICAgIChnICUgODgpICsgMSBBUyB0 YXhfaWQsCiAgICB0cnVlIEFTIGlzX3Zpc2libGUsCiAgICBnIEFTIHNvcnRfb3JkZXIKRlJPTSBf dmVyc2lvbnMgdgpDUk9TUyBKT0lOIExBVEVSQUwgKAogICAgU0VMRUNUCiAgICAgICAgZywKICAg ICAgICAtLSAxMiBwcmljZWxpc3RzOiBmb3IgdGFyZ2V0IHZlcnNpb24sIG9uZSBvZiB0aGVtIGlz IHByaWNlbGlzdCAxMDAKICAgICAgICBDQVNFCiAgICAgICAgICAgIFdIRU4gdi52ZXJzaW9uX2lk ID0gMSBUSEVOIChnIC0gMSkgLyAxNjUgKyA5NSAgIC0tIHByaWNlbGlzdHMgOTUuLjEwNiwgaW5j bHVkZXMgMTAwCiAgICAgICAgICAgIEVMU0UgKGcgLSAxKSAvIDE2NSArIDEgICAgICAgICAgICAg ICAgICAgICAgICAgICAtLSBwcmljZWxpc3RzIDEuLjEyCiAgICAgICAgRU5EIEFTIHByaWNlbGlz dF9pZCwKICAgICAgICAnVCcgfHwgKChnIC0gMSkgJSA0ICsgMSkgQVMgb3B0X3R5cGUsCiAgICAg ICAgJ09QVCcgfHwgbHBhZCgoKGcgLSAxKSAlIDE2NSArIDEpOjp0ZXh0LCA1LCAnMCcpIEFTIG9w dF9jb2RlCiAgICBGUk9NIGdlbmVyYXRlX3NlcmllcygxLAogICAgICAgIENBU0UgV0hFTiB2LnZl cnNpb25faWQgPSAxIFRIRU4gMTY1ICogMTIgRUxTRSAxNjUgKiAxMiBFTkQKICAgICkgZwopIHBs OwoKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gNC4gU1RBVElTVElDUwotLSA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQoKXGVjaG8gJz09PSBSdW5uaW5nIEFOQUxZWkUgPT09JwoKQU5BTFlaRSB0YXhf Y29kZXM7CkFOQUxZWkUgcHJvZHVjdF9vcHRpb25zOwpBTkFMWVpFIHByaWNlbGlzdF9vcHRpb25z OwpBTkFMWVpFIG9wdGlvbl9ydWxlczsKCi0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tIDUuIFZF UklGSUNBVElPTgotLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKXGVjaG8gJz09PSBSb3cgY291bnRz ID09PScKU0VMRUNUICdwcm9kdWN0X29wdGlvbnMnIEFTIHRhYmxlX25hbWUsIGNvdW50KCopIEFT IHJvd19jb3VudCBGUk9NIHByb2R1Y3Rfb3B0aW9ucwpVTklPTiBBTEwgU0VMRUNUICdwcmljZWxp c3Rfb3B0aW9ucycsIGNvdW50KCopIEZST00gcHJpY2VsaXN0X29wdGlvbnMKVU5JT04gQUxMIFNF TEVDVCAnb3B0aW9uX3J1bGVzJywgY291bnQoKikgRlJPTSBvcHRpb25fcnVsZXMKVU5JT04gQUxM IFNFTEVDVCAndGF4X2NvZGVzJywgY291bnQoKikgRlJPTSB0YXhfY29kZXMKT1JERVIgQlkgdGFi bGVfbmFtZTsKClxlY2hvICc9PT0gVGFyZ2V0IHZlcnNpb24gcm93IGNvdW50cyAoc2hvdWxkIGJl OiAzNDUsIDE2NSwgMTA1KSA9PT0nClNFTEVDVCAncHJvZHVjdF9vcHRpb25zJyBBUyB0YmwsIGNv dW50KCopIEFTIGNudApGUk9NIHByb2R1Y3Rfb3B0aW9ucwpXSEVSRSBicmFuZF9pZCA9IDEwIEFO RCBsaW5lX2NvZGUgPSAnQUJDJyBBTkQgbW9kZWxfeWVhciA9ICdZUicKICBBTkQgbW9kZWxfY29k ZSA9ICdBQkMnIEFORCB2ZXJzaW9uX2NvZGUgPSAnVkVSLTAwMScKVU5JT04gQUxMClNFTEVDVCAn cHJpY2VsaXN0X29wdGlvbnMnLCBjb3VudCgqKQpGUk9NIHByaWNlbGlzdF9vcHRpb25zCldIRVJF IGJyYW5kX2lkID0gMTAgQU5EIGxpbmVfY29kZSA9ICdBQkMnIEFORCBtb2RlbF95ZWFyID0gJ1lS JwogIEFORCBtb2RlbF9jb2RlID0gJ0FCQycgQU5EIHZlcnNpb25fY29kZSA9ICdWRVItMDAxJyBB TkQgcHJpY2VsaXN0X2lkID0gMTAwClVOSU9OIEFMTApTRUxFQ1QgJ29wdGlvbl9ydWxlcycsIGNv dW50KCopCkZST00gb3B0aW9uX3J1bGVzCldIRVJFIGJyYW5kX2lkID0gMTAgQU5EIGxpbmVfY29k ZSA9ICdBQkMnIEFORCBtb2RlbF95ZWFyID0gJ1lSJwogIEFORCBtb2RlbF9jb2RlID0gJ0FCQycg QU5EIHZlcnNpb25fY29kZSA9ICdWRVItMDAxJwpPUkRFUiBCWSB0Ymw7CgotLSA9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PQotLSA2LiBSRVBST0RVQ0VSIFFVRVJZCi0tID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 CgpcZWNobyAnPT09IFJ1bm5pbmcgcmVwcm9kdWNlciBxdWVyeSB3aXRoIEVYUExBSU4gQU5BTFla RSA9PT0nClxlY2hvICcgICAgT24gUEcgMTU6IGV4cGVjdCB+NzBtcycKXGVjaG8gJyAgICBPbiBQ RyAxNis6IGV4cGVjdCB+MTQwMG1zJwoKRVhQTEFJTiAoQU5BTFlaRSwgQlVGRkVSUywgVkVSQk9T RSkKU0VMRUNUCiAgICBwbC4qLAogICAgcG8uKiwKICAgIHRjLiosCiAgICBydWxlcy4qLAogICAg cGxfY2hlY2suKiwKICAgIHBvMi4qCkZST00gcHJpY2VsaXN0X29wdGlvbnMgcGwKSk9JTiBwcm9k dWN0X29wdGlvbnMgcG8KICBPTiBwby5icmFuZF9pZCA9IHBsLmJyYW5kX2lkCiBBTkQgcG8ubGlu ZV9jb2RlID0gcGwubGluZV9jb2RlCiBBTkQgcG8ubW9kZWxfeWVhciA9IHBsLm1vZGVsX3llYXIK IEFORCBwby5tb2RlbF9jb2RlID0gcGwubW9kZWxfY29kZQogQU5EIHBvLnZlcnNpb25fY29kZSA9 IHBsLnZlcnNpb25fY29kZQogQU5EIHBvLm9wdGlvbl90eXBlID0gcGwub3B0aW9uX3R5cGUKIEFO RCBwby5vcHRpb25fY29kZSA9IHBsLm9wdGlvbl9jb2RlCkxFRlQgSk9JTiB0YXhfY29kZXMgdGMK ICBPTiB0Yy50YXhfaWQgPSBwbC50YXhfaWQKTEVGVCBKT0lOIG9wdGlvbl9ydWxlcyBydWxlcwog IE9OIHJ1bGVzLmJyYW5kX2lkID0gcGwuYnJhbmRfaWQKIEFORCBydWxlcy5saW5lX2NvZGUgPSBw bC5saW5lX2NvZGUKIEFORCBydWxlcy5tb2RlbF95ZWFyID0gcGwubW9kZWxfeWVhcgogQU5EIHJ1 bGVzLm1vZGVsX2NvZGUgPSBwbC5tb2RlbF9jb2RlCiBBTkQgcnVsZXMudmVyc2lvbl9jb2RlID0g cGwudmVyc2lvbl9jb2RlCiBBTkQgcnVsZXMub3B0aW9uX3R5cGUgPSBwbC5vcHRpb25fdHlwZQog QU5EIHJ1bGVzLm9wdGlvbl9jb2RlID0gcGwub3B0aW9uX2NvZGUKTEVGVCBKT0lOIHByaWNlbGlz dF9vcHRpb25zIHBsX2NoZWNrCiAgT04gcGxfY2hlY2sucHJpY2VsaXN0X2lkID0gcGwucHJpY2Vs aXN0X2lkCiBBTkQgcGxfY2hlY2suYnJhbmRfaWQgPSBydWxlcy5icmFuZF9pZAogQU5EIHBsX2No ZWNrLmxpbmVfY29kZSA9IHJ1bGVzLmxpbmVfY29kZQogQU5EIHBsX2NoZWNrLm1vZGVsX3llYXIg PSBydWxlcy5tb2RlbF95ZWFyCiBBTkQgcGxfY2hlY2subW9kZWxfY29kZSA9IHJ1bGVzLm1vZGVs X2NvZGUKIEFORCBwbF9jaGVjay52ZXJzaW9uX2NvZGUgPSBydWxlcy52ZXJzaW9uX2NvZGUKIEFO RCBwbF9jaGVjay5vcHRpb25fdHlwZSA9IHJ1bGVzLnNlY19vcHRpb25fdHlwZQogQU5EIHBsX2No ZWNrLm9wdGlvbl9jb2RlID0gcnVsZXMuc2VjX29wdGlvbl9jb2RlCkxFRlQgSk9JTiBwcm9kdWN0 X29wdGlvbnMgcG8yCiAgT04gcG8yLmJyYW5kX2lkID0gcnVsZXMuYnJhbmRfaWQKIEFORCBwbzIu bGluZV9jb2RlID0gcnVsZXMubGluZV9jb2RlCiBBTkQgcG8yLm1vZGVsX3llYXIgPSBydWxlcy5t b2RlbF95ZWFyCiBBTkQgcG8yLm1vZGVsX2NvZGUgPSBydWxlcy5tb2RlbF9jb2RlCiBBTkQgcG8y LnZlcnNpb25fY29kZSA9IHJ1bGVzLnZlcnNpb25fY29kZQogQU5EIHBvMi5vcHRpb25fdHlwZSA9 IHJ1bGVzLnNlY19vcHRpb25fdHlwZQogQU5EIHBvMi5vcHRpb25fY29kZSA9IHJ1bGVzLnNlY19v cHRpb25fY29kZQpXSEVSRSBwbC5icmFuZF9pZCA9IDEwCiAgQU5EIHBsLmxpbmVfY29kZSA9ICdB QkMnCiAgQU5EIHBsLm1vZGVsX3llYXIgPSAnWVInCiAgQU5EIHBsLm1vZGVsX2NvZGUgPSAnQUJD JwogIEFORCBwbC52ZXJzaW9uX2NvZGUgPSAnVkVSLTAwMScKICBBTkQgcGwucHJpY2VsaXN0X2lk ID0gMTAwOwoKLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0gNy4gV09SS0FST1VORCBWRVJJRklD QVRJT04KLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClxlY2hvICc9PT0gU2FtZSBxdWVyeSB3aXRo IGpvaW5fY29sbGFwc2VfbGltaXQgPSAxICh3b3JrYXJvdW5kKSA9PT0nCgpTRVQgTE9DQUwgam9p bl9jb2xsYXBzZV9saW1pdCA9IDE7CgpFWFBMQUlOIChBTkFMWVpFLCBCVUZGRVJTLCBWRVJCT1NF KQpTRUxFQ1QKICAgIHBsLiosCiAgICBwby4qLAogICAgdGMuKiwKICAgIHJ1bGVzLiosCiAgICBw bF9jaGVjay4qLAogICAgcG8yLioKRlJPTSBwcmljZWxpc3Rfb3B0aW9ucyBwbApKT0lOIHByb2R1 Y3Rfb3B0aW9ucyBwbwogIE9OIHBvLmJyYW5kX2lkID0gcGwuYnJhbmRfaWQKIEFORCBwby5saW5l X2NvZGUgPSBwbC5saW5lX2NvZGUKIEFORCBwby5tb2RlbF95ZWFyID0gcGwubW9kZWxfeWVhcgog QU5EIHBvLm1vZGVsX2NvZGUgPSBwbC5tb2RlbF9jb2RlCiBBTkQgcG8udmVyc2lvbl9jb2RlID0g cGwudmVyc2lvbl9jb2RlCiBBTkQgcG8ub3B0aW9uX3R5cGUgPSBwbC5vcHRpb25fdHlwZQogQU5E IHBvLm9wdGlvbl9jb2RlID0gcGwub3B0aW9uX2NvZGUKTEVGVCBKT0lOIHRheF9jb2RlcyB0Ywog IE9OIHRjLnRheF9pZCA9IHBsLnRheF9pZApMRUZUIEpPSU4gb3B0aW9uX3J1bGVzIHJ1bGVzCiAg T04gcnVsZXMuYnJhbmRfaWQgPSBwbC5icmFuZF9pZAogQU5EIHJ1bGVzLmxpbmVfY29kZSA9IHBs LmxpbmVfY29kZQogQU5EIHJ1bGVzLm1vZGVsX3llYXIgPSBwbC5tb2RlbF95ZWFyCiBBTkQgcnVs ZXMubW9kZWxfY29kZSA9IHBsLm1vZGVsX2NvZGUKIEFORCBydWxlcy52ZXJzaW9uX2NvZGUgPSBw bC52ZXJzaW9uX2NvZGUKIEFORCBydWxlcy5vcHRpb25fdHlwZSA9IHBsLm9wdGlvbl90eXBlCiBB TkQgcnVsZXMub3B0aW9uX2NvZGUgPSBwbC5vcHRpb25fY29kZQpMRUZUIEpPSU4gcHJpY2VsaXN0 X29wdGlvbnMgcGxfY2hlY2sKICBPTiBwbF9jaGVjay5wcmljZWxpc3RfaWQgPSBwbC5wcmljZWxp c3RfaWQKIEFORCBwbF9jaGVjay5icmFuZF9pZCA9IHJ1bGVzLmJyYW5kX2lkCiBBTkQgcGxfY2hl Y2subGluZV9jb2RlID0gcnVsZXMubGluZV9jb2RlCiBBTkQgcGxfY2hlY2subW9kZWxfeWVhciA9 IHJ1bGVzLm1vZGVsX3llYXIKIEFORCBwbF9jaGVjay5tb2RlbF9jb2RlID0gcnVsZXMubW9kZWxf Y29kZQogQU5EIHBsX2NoZWNrLnZlcnNpb25fY29kZSA9IHJ1bGVzLnZlcnNpb25fY29kZQogQU5E IHBsX2NoZWNrLm9wdGlvbl90eXBlID0gcnVsZXMuc2VjX29wdGlvbl90eXBlCiBBTkQgcGxfY2hl Y2sub3B0aW9uX2NvZGUgPSBydWxlcy5zZWNfb3B0aW9uX2NvZGUKTEVGVCBKT0lOIHByb2R1Y3Rf b3B0aW9ucyBwbzIKICBPTiBwbzIuYnJhbmRfaWQgPSBydWxlcy5icmFuZF9pZAogQU5EIHBvMi5s aW5lX2NvZGUgPSBydWxlcy5saW5lX2NvZGUKIEFORCBwbzIubW9kZWxfeWVhciA9IHJ1bGVzLm1v ZGVsX3llYXIKIEFORCBwbzIubW9kZWxfY29kZSA9IHJ1bGVzLm1vZGVsX2NvZGUKIEFORCBwbzIu dmVyc2lvbl9jb2RlID0gcnVsZXMudmVyc2lvbl9jb2RlCiBBTkQgcG8yLm9wdGlvbl90eXBlID0g cnVsZXMuc2VjX29wdGlvbl90eXBlCiBBTkQgcG8yLm9wdGlvbl9jb2RlID0gcnVsZXMuc2VjX29w dGlvbl9jb2RlCldIRVJFIHBsLmJyYW5kX2lkID0gMTAKICBBTkQgcGwubGluZV9jb2RlID0gJ0FC QycKICBBTkQgcGwubW9kZWxfeWVhciA9ICdZUicKICBBTkQgcGwubW9kZWxfY29kZSA9ICdBQkMn CiAgQU5EIHBsLnZlcnNpb25fY29kZSA9ICdWRVItMDAxJwogIEFORCBwbC5wcmljZWxpc3RfaWQg PSAxMDA7CgpSRVNFVCBqb2luX2NvbGxhcHNlX2xpbWl0OwoKLS0gPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0gOC4gQ0xFQU5VUCAodW5jb21tZW50IHRvIGRyb3AgdGFibGVzIGFmdGVyIHRlc3Rpbmcp Ci0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CgotLSBEUk9QIFRBQkxFIElGIEVYSVNUUyBwcmljZWxp c3Rfb3B0aW9ucyBDQVNDQURFOwotLSBEUk9QIFRBQkxFIElGIEVYSVNUUyBvcHRpb25fcnVsZXMg Q0FTQ0FERTsKLS0gRFJPUCBUQUJMRSBJRiBFWElTVFMgcHJvZHVjdF9vcHRpb25zIENBU0NBREU7 Ci0tIERST1AgVEFCTEUgSUYgRVhJU1RTIHRheF9jb2RlcyBDQVNDQURFOwoKXGVjaG8gJz09PSBE b25lID09PScKXGVjaG8gJ0NvbXBhcmUgRVhQTEFJTiBBTkFMWVpFIG91dHB1dCBmcm9tIHNlY3Rp b25zIDYgYW5kIDcuJwpcZWNobyAnSWYgc2VjdGlvbiA2IGlzIH4yMHggc2xvd2VyIHRoYW4gc2Vj dGlvbiA3LCB0aGUgcmVncmVzc2lvbiBpcyByZXByb2R1Y2VkLicK --000000000000a98a86064c49611b--