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 1vlKDG-00A1Cs-2L for pgsql-hackers@arkaria.postgresql.org; Thu, 29 Jan 2026 05:05:03 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vlKDF-006MQp-2g for pgsql-hackers@arkaria.postgresql.org; Thu, 29 Jan 2026 05:05:02 +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 1vlKDE-006MQN-2T for pgsql-hackers@lists.postgresql.org; Thu, 29 Jan 2026 05:05:01 +0000 Received: from mail-pj1-x1044.google.com ([2607:f8b0:4864:20::1044]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vlKDA-002rOu-0v for pgsql-hackers@lists.postgresql.org; Thu, 29 Jan 2026 05:05:00 +0000 Received: by mail-pj1-x1044.google.com with SMTP id 98e67ed59e1d1-34c3259da34so332550a91.2 for ; Wed, 28 Jan 2026 21:04:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1769663096; cv=none; d=google.com; s=arc-20240605; b=Wu28Te5DPj+dvkun9IONo59Aow85rQVEck8165zOgTJZ2fifaasXE4PALac8yxwmiQ CwVIJc1suUIamJOH7i8fx5npqnrWgBY6kODA8yqrlX4lKIIgbvFLIisbdg0A8qqnrD2y v4IWocU2ZU6BkUiSzyClt89N4u47H9blMtKLG+xhTRwcMeGLQU06FEA25Fnfr6e13LiG ieEG0IKfQOa9cyQPobyUtWNNdG3vtkEMurp9ssMe0xtJ5axosnCw8mLf71Po9Fju2Nth Q5BoYcuSSo4ug3gzoWbO7HOm3bamFLPQKKYtjfy1ii/7HrPPJs+JcpYDlC9RXl6bIxIC USWQ== 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=Av1uqYv4PjDFQHPbWD4RQ75wOSWNlw7n/6j4AGRV738=; fh=caA8KJTD26hacX964f03mZB2qNdDikgm4oBDQJyMX4U=; b=GeWuJuUQwI9aNdMs/+x30PfqvzMxhJ1tu+jnNraxbf7X82Lr+iLxHjNo/aK+EifyNw FI2SfsFO2CPsYF1mmDDRbJ8sQR4CyiEGUgtNP4OwAh5lCL2S/89z92LZlaYkSqoayZid JE+uRN50Ek/R9WYaqNx/62XH1ALcfch8fYv2KDo1VSNQIgIOIZD55i5vxTjnkN2DblZB r7T4gHs1O33iMTJVukakJ8ZeYoQT+CcnBGr/aDjP8opdsJU5AFssGo6uxblpWTiKyB6b S5rGqrVL4euHIeE7B63+Yl818HJNkxlX8YXPihGFLAMumCpoVdtbbJe+++NfluL5isc+ DYvA==; 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=1769663096; x=1770267896; 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=Av1uqYv4PjDFQHPbWD4RQ75wOSWNlw7n/6j4AGRV738=; b=Vol+ae+e6f/C4jjESgm/ClqeXBQ5op5SaIjrQfAoxM3gb2hOzzZfsax1atE5RVUSZx syauXfpOoUBJq7dz4uQ0oaVm7PZiGgvVmiXY/f46R41SPoYniuk85Sq/EXMbm7LP7aG+ auGzxEHKv/xY5SGPnbykEK3URDPb7sX9AzWcCY/NZyap7kdYM2YydlPCwQA9efTpzGgE qz56EWyEQlOOzpIRY5MOoIV4CUcy2pIaLoXs2NE/NjH51K1kcyUgg+QbmJAw8LZA3a1a AxJrbN5EfC+xqI0WuPpkWPnfqqTq92FvStptSpf8GfDauIo+GlluwQrjTOWvBp7wEqnw 9a3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769663096; x=1770267896; 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=Av1uqYv4PjDFQHPbWD4RQ75wOSWNlw7n/6j4AGRV738=; b=rUgR4ARMbtBR/vx+qphv3DL0JoswY0aKSrxAQ20l8I5x0FzvgFJ+5NyHalWTlvTxAU cFTmdvJp+U1a74uqH86hUMKqOqFdoEHHRy3weMNgIL++Uz53+pIPxXVC4bD/BfsyuX9L BfQK8xICe0NaxakRzgs3xkVHJiAGcrCteGvtY+mX3uVB5tZXF0XGRN+Tjoehqd10Gzqt EuHVnOu7TlyNA1sXvOgSrod6Y/91a3/tlYmFxDyowbMjPj/OV/muzl6/1s+iJ7YHIcN+ +XvOvr0iuLcAZFp3vQ5yxMk9RHiiZCVlL26tEsLfGBWrCP/xOselBnFosydk258w+Y0r cBqQ== X-Forwarded-Encrypted: i=1; AJvYcCWSMgR5qlJaT1NrYbcTxny7WVOQyjTaG66YR0b+ImnEUieGznzPpJ9oGdUTfE0CN5aa3HdLxB0RkOMwZbhH@lists.postgresql.org X-Gm-Message-State: AOJu0YwawVZBxU3hdf0Q5ZJutNvWFiWxbRkB00laGFxhpifMwPfzBAlS /1pbI1BsZzxdkjjAfUgZTkqaVA4ySc98RzbEYO84h/DnGGOlSU9AAN+j3E+59Uh5eDfqyxl1nZr g9CsTgcEoLkWUv8gU3DiRe9ocQl4VsZg= X-Gm-Gg: AZuq6aIm12hlAfyxDu3cXLZZP3OoBCPbygDylRMe5ViW1feaLv9JBjTZMbtKgJHG3WO EtK+vhyWcLnfY901sRF11Yj2UAaubPxaH87yspdg9lIrZYDtPuESCTXIh0ox6147/iSrk9XaB7c a62SmmR/pr3tD/40FIpa1kEEUuHKiqv57DQb6bAIzII3avvlKLHgDMcJ53nZ0HVs/vYKqHmZ+Iy DWnkPg7LNpbWHn/LG+kDaYyMRJ9OJFD9HakiZlf5eNUNufMxxsJKULRjlZZLi9g4moZlMiiRw== X-Received: by 2002:a17:90b:5350:b0:349:3fe8:170d with SMTP id 98e67ed59e1d1-353fecd08ddmr6119051a91.3.1769663095443; Wed, 28 Jan 2026 21:04:55 -0800 (PST) MIME-Version: 1.0 References: <246035.1764627115@sss.pgh.pa.us> In-Reply-To: From: Alexandra Wang Date: Wed, 28 Jan 2026 21:04:19 -0800 X-Gm-Features: AZwV_QgaOa9RpCpysVGSVDixHU-jFvhs6fhlXhmg6xpojnmUXy5tNQpB9-a28kQ Message-ID: Subject: Re: Is there value in having optimizer stats for joins/foreignkeys? To: Corey Huinker Cc: Tom Lane , Tomas Vondra , pgsql-hackers@lists.postgresql.org, hs@cybertec.at, Jeff Davis Content-Type: multipart/mixed; boundary="0000000000002d73e706497fccf0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002d73e706497fccf0 Content-Type: multipart/alternative; boundary="0000000000002d73e506497fccee" --0000000000002d73e506497fccee Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi hackers, As promised in my previous email, I'm sharing a proof-of-concept patch exploring join statistics for correlated columns across relations. This is a POC at this point, but I hope the performance numbers below give a better idea of both the potential usefulness of join statistics and the complexity of implementing them. Join Order Benchmark (JOB) --------------------------------------- I got interested in this work after reading a 2015 VLDB paper [1] that introduced the Join Order Benchmark (JOB) [2]. JOB uses the IMDB dataset, with queries having 3-16 joins (average 8). Unlike standard benchmarks such as TPC-H which use randomly generated uniform and independent data, JOB uses real-world data with correlations and skewed distributions, which make cardinality estimation much harder. The paper tested PostgreSQL among other databases. I reran the benchmark on current PG 19devel to see where we stand today. (The original data source is gone, but CedarDB hosts a mirror [3]; I created a fork [4] and added some scripts. The schema DDLs and queries are unchanged.) Test setup: MacBook, Apple M3 Pro Postgres master branch (19devel), built with -O3 cold and warm runs, 3 runs each Results (average of 3 runs): Postgres 19devel branch: Total execution time cold run: 140.75 s (=C2=B12.12 s) Total execution time warm run: 117.72 s (=C2=B10.76 s) Postgres 19devel branch, SET enable_nestloop =3D off: Total execution time cold run: 87.16 s (=C2=B10.17 s) Total execution time warm run: 86.68 s (=C2=B10.42 s) These results suggest that the planner is frequently choosing nested loop joins where hash or merge joins would be better. (As a side note: with nestloops disabled, plans are dominated by hash joins, so cold vs warm runs are very similar due to limited cache reuse.) Problem -------- The slowest query in this workload is 16b.sql (attached). Its plan contains 7 nested loop joins. The innermost join is estimated as 34 rows but actually produces 41,840 rows =E2=80=94 a ~1230x underestimation: Nested Loop (cost=3D6.80..3813.14 rows=3D34 width=3D4) (actual time=3D2.336..304.160 rows=3D41840 loops=3D1) -> Seq Scan on keyword k (cost=3D0.00..2685.11 rows=3D1 width=3D4) (actua= l time=3D0.402..6.161 rows=3D1.00 loops=3D1) Filter: (keyword =3D 'character-name-in-title') -> Bitmap Heap Scan on movie_keyword mk (cost=3D6.80..1124.98 rows=3D305 width=3D8) (actual time=3D1.933..295.493 rows=3D41840.00 loops=3D1) Recheck Cond: (k.id =3D keyword_id) This underestimation cascades to the outermost join: ~3K estimated vs ~3.7M actual rows. The problem can be reduced to the following query: SELECT * FROM movie_keyword mk, keyword k WHERE k.keyword =3D 'character-name-in-title' AND k.id =3D mk.keyword_id; The tables: keyword(id PK, keyword, phonetic_code) movie_keyword(id PK, movie_id, keyword_id) These tables are strongly correlated via keyword_id -> keyword.id. We can even add: ALTER TABLE movie_keyword ADD CONSTRAINT movie_keyword_keyword_id_fkey FOREIGN KEY (keyword_id) REFERENCES keyword(id); CREATE STATISTICS keyword_stats (dependencies) ON id, keyword FROM keyword; ANALYZE keyword, movie_keyword; However, even with the FK constraint and extended statistics on the keyword table, the estimate remains unchanged: SELECT * FROM check_estimated_rows( 'SELECT * FROM movie_keyword mk, keyword k WHERE k.keyword =3D ''character-name-in-title'' AND k.id =3D mk.keyword_id'); estimated | actual -----------+-------- 34 | 41840 This indicates that the planner cannot connect the skewed distribution of the join key on the referencing table with the filter selectivity on the referenced table as it applies to the join result. This is the gap that join statistics aim to fill. Proposed Solution ------------------ I've attached two patches: 0001: Extend CREATE STATISTICS for join MCV statistics 0002: Automatically create join MCV statistics from FK constraints 0001 is the core patch. 0002 is an optional convenience feature that detects FK relationships during ANALYZE and auto-creates join stats. Syntax: CREATE STATISTICS (mcv) ON . [, ...] FROM alias JOIN alias ON (); Example -- single filter column: CREATE STATISTICS mk_keyword_stats (mcv) ON k.keyword FROM movie_keyword mk JOIN keyword k ON (mk.keyword_id =3D k.id); ANALYZE movie_keyword; Example -- multiple filter columns: CREATE STATISTICS mk_multi_stats (mcv) ON k.keyword, k.phonetic_code FROM movie_keyword mk JOIN keyword k ON (mk.keyword_id =3D k.id); ANALYZE movie_keyword; Catalog changes: pg_statistic_ext: - New stats kind 'c' (join MCV) in stxkind - New field stxotherrel (Oid): the other table in the join - New field stxjoinkeys (int2vector): join column pair [primary_joinkey, other_joinkey] - Existing stxkeys stores the filter column(s) on stxotherrel - New index pg_statistic_ext_otherrel_index on (stxrelid, stxotherrel) pg_statistic_ext_data: - New field stxdjoinmcv (pg_join_mcv_list): serialized join MCV data How stats are collected: Join statistics are collected during ANALYZE of the primary table (stxrelid). The current approach assumes a dependency relationship between the join key column and the filter column(s) on the other table. Specifically, during ANALYZE, we reuse the already-computed single-column MCV stats for the primary table's join key column. For each MCV value, we look up the matching row in the other table via the join key and extract the filter column values, carrying over the primary-side MCV frequency. This is not accurate in all cases, but works reasonably well for the POC, especially for foreign-key-like joins where the primary table's join key distribution is representative of the join result. For example, the catalog contents look like: stxrelid | stxotherrel | stxjoinkeys | stxkeys | stxkind --------------+-------------+-------------+---------+-------- movie_keyword | keyword | 2 1 | 2 | {c} index | values | nulls | frequency ------+--------------+-------+---------- 0 | {keyword_1} | {f} | 0.06 1 | {keyword_2} | {f} | 0.06 2 | {keyword_3} | {f} | 0.06 ... | ... | ... | ... How the planner uses join stats: I added the join pattern detection logic in clauselist_selectivity_ext() and get_foreign_key_join_selectivity(). The planner looks for a pattern of: - An equijoin clause between two relations (the join key pair), and - Equality or IN filter clauses on columns of one relation (the filter columns) When this pattern is found and matching join MCV stats exist, the planner compares the filter values against the stored MCV items to compute the join selectivity, replacing the default estimate. JOB Benchmark Results --------------------- I created a single join statistics object for the (movie_keyword, keyword) pair and reran the JOB benchmark: CREATE STATISTICS movie_keyword_keyword_stats (mcv) ON k.keyword FROM movie_keyword mk JOIN keyword k ON (mk.keyword_id =3D k.id); Total execution times (average of 3 runs): Cold run Warm run Default (baseline) 140.75s (+/-2.1) 117.72s (+/-0.8) enable_nestloop=3Doff 87.16s (+/-0.2) 86.68s (+/-0.4) With join stats 85.81s (+/-3.4) 65.24s (+/-0.5) With a single join statistics object: - Cold run: -39% vs baseline (140.75s -> 85.81s), comparable to enable_nestloop=3Doff - Warm run: -45% vs baseline (117.72s -> 65.24s), -25% vs enable_nestloop=3Doff (86.68s -> 65.24s) Per-query times for the 10 slowest (out of 113) queries on baseline (master branch, enable_nestloop =3D on): Query | Baseline | No Nestloop | Join Stats | Best ------+-----------+-------------+------------+---------- 16b | 10,673 ms | 2,789 ms | 2,775 ms | 3.8x JS 17e | 7,709 ms | 2,260 ms | 2,149 ms | 3.6x JS 17f | 7,506 ms | 2,304 ms | 2,460 ms | 3.3x NL 17a | 7,288 ms | 1,453 ms | 2,388 ms | 5.0x NL 17b | 6,490 ms | 1,580 ms | 5,413 ms | 4.1x NL 17c | 6,240 ms | 1,095 ms | 5,268 ms | 5.7x NL 17d | 6,261 ms | 1,263 ms | 5,291 ms | 5.0x NL 6d | 6,234 ms | 988 ms | 1,565 ms | 6.3x NL 25c | 6,133 ms | 1,848 ms | 1,738 ms | 3.5x JS 6f | 5,728 ms | 1,785 ms | 1,556 ms | 3.7x JS (JS =3D join stats fastest, NL =3D no-nestloop fastest) All 10 queries improved over baseline. For 16b, 3 nested loop joins were replaced with 2 hash joins and 1 merge join. Some queries (e.g. 17b) kept the same plan shape and joins but gained a Memoize node from better cardinality estimates. Current Limitations ------------------- This is a proof of concept. Known limitations include: 1. The current catalog design is not ideal. It is asymmetric (a "primary" and an "other" table), which is natural for FK-like joins, but less intuitive for other joins. 2. Stats collection piggybacks on ANALYZE of the primary table and uses its single-column MCV for the join key. This can be inaccurate when the MCV values on the "primary" side don't cover the important values on the other side, or when the filter column isn't fully dependent on the join key. A more accurate approach would execute the actual join during collection, which could also decouple join stats collection from single-table ANALYZE. 3. Currently limited to: equality join clauses, equality and IN filter clauses, simple Var stats objects (no expressions), inner joins only, and two-way joins only. Some of these are easier to extend; others may be harder or unnecessary (like n-way joins). 4. Patch 0002 (auto-creation from FK constraints) should probably be gated behind a GUC. I'm not strongly attached to this patch, but kept it because FK joins seem like a natural and common use case. Conclusion ---------- Even with all the current limitations, I think this experiment suggests that join-level statistics can significantly improve plans, as a single join stats object can materially improve workload performance. If there's interest, I'm happy to continue iterating on the design. In particular, I'd welcome feedback on: - whether this is a direction worth pursuing, - the catalog design, - the stats collection approach, - the planner integration strategy, - and scope (what kinds of joins / predicates are worth supporting). Best, Alex [1] https://www.vldb.org/pvldb/vol9/p204-leis.pdf [2] https://github.com/gregrahn/join-order-benchmark [3] https://cedardb.com/docs/example_datasets/job/ [4] https://github.com/l-wang/join-order-benchmark --=20 Alexandra Wang EDB: https://www.enterprisedb.com --0000000000002d73e506497fccee Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi hackers,

As promised in my previous email, = I'm sharing a proof-of-concept patch
exploring join statistics for c= orrelated columns across relations.
This is a POC at this point, but I h= ope the performance numbers below
give a better idea of both the potenti= al usefulness of join statistics
and the complexity of implementing them= .

Join Order Benchmark (JOB)
------------------------------------= ---

I got interested in this work after reading a 2015 VLDB paper [1= ] that
introduced the Join Order Benchmark (JOB) [2].=C2=A0 JOB uses the= IMDB
dataset, with queries having 3-16 joins (average 8). Unlike standa= rd
benchmarks such as TPC-H which use randomly generated uniform and
= independent data, JOB uses real-world data with correlations and
skewed = distributions, which make cardinality estimation much harder.

The pa= per tested PostgreSQL among other databases. I reran the
benchmark on cu= rrent PG 19devel to see where we stand today. (The
original data source = is gone, but CedarDB hosts a mirror [3]; I
created a fork [4] and added = some scripts. The schema DDLs and queries
are unchanged.)

Test se= tup:
MacBook, Apple M3 Pro
Postgres master branch (19devel), built wi= th -O3
cold and warm runs, 3 runs each

Results (average of 3 runs= ):

Postgres 19devel branch:
Total execution time cold run: 140.75= s (=C2=B12.12 s)
Total execution time warm run: 117.72 s (=C2=B10.76 s)=

Postgres 19devel branch, SET enable_nestloop =3D off:
Total exec= ution time cold run: 87.16 s (=C2=B10.17 s)
Total execution time warm ru= n: 86.68 s (=C2=B10.42 s)

These results suggest that the planner is = frequently choosing nested
loop joins where hash or merge joins would be= better.

(As a side note: with nestloops disabled, plans are dominat= ed by hash
joins, so cold vs warm runs are very similar due to limited c= ache
reuse.)

Problem
--------

The slowest query in this= workload is 16b.sql (attached). Its plan
contains 7 nested loop joins.<= br>
The innermost join is estimated as 34 rows but actually produces
= 41,840 rows =E2=80=94 a ~1230x underestimation:

Nested Loop =C2=A0(c= ost=3D6.80..3813.14 rows=3D34 width=3D4) (actual time=3D2.336..304.160 rows= =3D41840 loops=3D1)
=C2=A0 -> Seq Scan on keyword k (cost=3D0.00..268= 5.11 rows=3D1 width=3D4) (actual time=3D0.402..6.161 rows=3D1.00 loops=3D1)=
=C2=A0 =C2=A0 =C2=A0Filter: (keyword =3D 'character-name-in-title&#= 39;)
=C2=A0 -> Bitmap Heap Scan on movie_keyword mk (cost=3D6.80..112= 4.98 rows=3D305 width=3D8) (actual time=3D1.933..295.493 rows=3D41840.00 lo= ops=3D1)
=C2=A0 =C2=A0 =C2=A0Recheck Cond: (k.id= =3D keyword_id)

This underestimation cascades to the outermost = join: ~3K estimated vs
~3.7M actual rows.

The problem can be redu= ced to the following query:

SELECT * FROM movie_keyword mk, keyword = k
WHERE k.keyword =3D 'character-name-in-title'
AND k.id =3D mk.keyword_id;

The tables:

keyw= ord(id PK, keyword, phonetic_code)
movie_keyword(id PK, movie_id, keywor= d_id)

These tables are strongly correlated via keyword_id -> keyword.id. We
can even add:

ALTER = TABLE movie_keyword
=C2=A0 ADD CONSTRAINT movie_keyword_keyword_id_fkey<= br>=C2=A0 FOREIGN KEY (keyword_id) REFERENCES keyword(id);
CREATE STATIS= TICS keyword_stats (dependencies)
=C2=A0 ON id, keyword FROM keyword;ANALYZE keyword, movie_keyword;

However, even with the FK constrain= t and extended statistics on the
keyword table, the estimate remains unc= hanged:

SELECT * FROM check_estimated_rows(
=C2=A0 'SELECT * = FROM movie_keyword mk, keyword k
=C2=A0 =C2=A0WHERE k.keyword =3D '&= #39;character-name-in-title''
=C2=A0 =C2=A0 =C2=A0AND k.id =3D mk.keyword_id');
=C2=A0estimated | actual=
-----------+--------
=C2=A0 =C2=A0 =C2=A0 =C2=A0 34 | =C2=A041840
This indicates that the planner cannot connect the skewed distribution=
of the join key on the referencing table with the filter selectivityon the referenced table as it applies to the join result. This is the
g= ap that join statistics aim to fill.

Proposed Solution
----------= --------

I've attached two patches:

0001: Extend CREATE S= TATISTICS for join MCV statistics
0002: Automatically create join MCV st= atistics from FK constraints

0001 is the core patch. 0002 is an opti= onal convenience feature
that detects FK relationships during ANALYZE an= d auto-creates
join stats.

Syntax:

CREATE STATISTICS <n= ame> (mcv)
=C2=A0 ON <other_table>.<filter_col> [, ...]=C2=A0 FROM <primary_table> alias
=C2=A0 JOIN <other_table>= ; alias ON (<join_condition>);

Example -- single filter column= :

CREATE STATISTICS mk_keyword_stats (mcv)
=C2=A0 ON k.keyword=C2=A0 FROM movie_keyword mk
=C2=A0 JOIN keyword k ON (mk.keyword_id = =3D k.id);
ANALYZE movie_keyword;

Exa= mple -- multiple filter columns:

CREATE STATISTICS mk_multi_stats (m= cv)
=C2=A0 ON k.keyword, k.phonetic_code
=C2=A0 FROM movie_keyword mk=
=C2=A0 JOIN keyword k ON (mk.keyword_id =3D k.i= d);
ANALYZE movie_keyword;

Catalog changes:

pg_statist= ic_ext:
- New stats kind 'c' (join MCV) in stxkind
- New fiel= d stxotherrel (Oid): the other table in the join
- New field stxjoinkeys= (int2vector): join column pair [primary_joinkey,
=C2=A0 other_joinkey]<= br>- Existing stxkeys stores the filter column(s) on stxotherrel
- New i= ndex pg_statistic_ext_otherrel_index on (stxrelid, stxotherrel)

pg_s= tatistic_ext_data:
- New field stxdjoinmcv (pg_join_mcv_list): serialize= d join MCV data

How stats are collected:

Join statistics are = collected during ANALYZE of the primary table
(stxrelid). The current ap= proach assumes a dependency relationship
between the join key column and= the filter column(s) on the other
table. Specifically, during ANALYZE, = we reuse the already-computed
single-column MCV stats for the primary ta= ble's join key column. For
each MCV value, we look up the matching r= ow in the other table via the
join key and extract the filter column val= ues, carrying over the
primary-side MCV frequency. This is not accurate = in all cases, but
works reasonably well for the POC, especially for fore= ign-key-like
joins where the primary table's join key distribution i= s
representative of the join result.

For example, the catalog con= tents look like:

stxrelid =C2=A0 =C2=A0 =C2=A0| stxotherrel | stxjoi= nkeys | stxkeys | stxkind
--------------+-------------+-------------+---= ------+--------
movie_keyword | keyword =C2=A0 =C2=A0 | 2 1 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 | 2 =C2=A0 =C2=A0 =C2=A0 | {c}

index | values =C2= =A0 =C2=A0 =C2=A0 | nulls | frequency
------+--------------+-------+----= ------
=C2=A0 =C2=A0 0 | {keyword_1} =C2=A0| {f} =C2=A0 | =C2=A0 =C2=A0 = =C2=A00.06
=C2=A0 =C2=A0 1 | {keyword_2} =C2=A0| {f} =C2=A0 | =C2=A0 =C2= =A0 =C2=A00.06
=C2=A0 =C2=A0 2 | {keyword_3} =C2=A0| {f} =C2=A0 | =C2=A0= =C2=A0 =C2=A00.06
=C2=A0 ... | ... =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0| = ... =C2=A0 | =C2=A0 =C2=A0 =C2=A0 ...

How the planner uses join stat= s:

I added the join pattern detection logic in
clauselist_selecti= vity_ext() and get_foreign_key_join_selectivity().
The planner looks for= a pattern of:

- An equijoin clause between two relations (the join = key pair), and
- Equality or IN filter clauses on columns of one relatio= n (the filter
=C2=A0 columns)

When this pattern is found and matc= hing join MCV stats exist, the
planner compares the filter values agains= t the stored MCV items to
compute the join selectivity, replacing the de= fault estimate.

JOB Benchmark Results
---------------------
I created a single join statistics object for the (movie_keyword,
keyw= ord) pair and reran the JOB benchmark:

CREATE STATISTICS movie_keywo= rd_keyword_stats (mcv)
=C2=A0 ON k.keyword
=C2=A0 FROM movie_keyword = mk
=C2=A0 JOIN keyword k ON (mk.keyword_id =3D k= .id);

Total execution times (average of 3 runs):

=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Cold = run =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Warm run
Default (baseline) =C2=A0= 140.75s (+/-2.1) =C2=A0117.72s (+/-0.8)
enable_nestloop=3Doff =C2=A0 87.= 16s (+/-0.2) =C2=A0 86.68s (+/-0.4)
With join stats =C2=A0 =C2=A0 =C2=A0= 85.81s (+/-3.4) =C2=A0 65.24s (+/-0.5)

With a single join statistic= s object:
- Cold run: -39% vs baseline (140.75s -> 85.81s),
=C2=A0= comparable to enable_nestloop=3Doff
- Warm run: -45% vs baseline (117.7= 2s -> 65.24s),
=C2=A0 -25% vs enable_nestloop=3Doff (86.68s -> 65.= 24s)

Per-query times for the 10 slowest (out of 113) queries on base= line
(master branch, enable_nestloop =3D on):

=C2=A0 Query | Base= line =C2=A0| No Nestloop | Join Stats | Best
=C2=A0 ------+-----------+-= ------------+------------+----------
=C2=A0 16b =C2=A0 | 10,673 ms | =C2= =A0 2,789 ms =C2=A0| =C2=A02,775 ms =C2=A0| 3.8x JS
=C2=A0 17e =C2=A0 | = =C2=A07,709 ms | =C2=A0 2,260 ms =C2=A0| =C2=A02,149 ms =C2=A0| 3.6x JS
= =C2=A0 17f =C2=A0 | =C2=A07,506 ms | =C2=A0 2,304 ms =C2=A0| =C2=A02,460 ms= =C2=A0| 3.3x NL
=C2=A0 17a =C2=A0 | =C2=A07,288 ms | =C2=A0 1,453 ms = =C2=A0| =C2=A02,388 ms =C2=A0| 5.0x NL
=C2=A0 17b =C2=A0 | =C2=A06,490 m= s | =C2=A0 1,580 ms =C2=A0| =C2=A05,413 ms =C2=A0| 4.1x NL
=C2=A0 17c = =C2=A0 | =C2=A06,240 ms | =C2=A0 1,095 ms =C2=A0| =C2=A05,268 ms =C2=A0| 5.= 7x NL
=C2=A0 17d =C2=A0 | =C2=A06,261 ms | =C2=A0 1,263 ms =C2=A0| =C2= =A05,291 ms =C2=A0| 5.0x NL
=C2=A0 6d =C2=A0 =C2=A0| =C2=A06,234 ms | = =C2=A0 =C2=A0 988 ms =C2=A0| =C2=A01,565 ms =C2=A0| 6.3x NL
=C2=A0 25c = =C2=A0 | =C2=A06,133 ms | =C2=A0 1,848 ms =C2=A0| =C2=A01,738 ms =C2=A0| 3.= 5x JS
=C2=A0 6f =C2=A0 =C2=A0| =C2=A05,728 ms | =C2=A0 1,785 ms =C2=A0| = =C2=A01,556 ms =C2=A0| 3.7x JS

=C2=A0 (JS =3D join stats fastest, NL= =3D no-nestloop fastest)

All 10 queries improved over baseline. For= 16b, 3 nested loop joins
were replaced with 2 hash joins and 1 merge jo= in. Some queries (e.g.
17b) kept the same plan shape and joins but gaine= d a Memoize node from
better cardinality estimates.

Current Limit= ations
-------------------

This is a proof of concept. Known limi= tations include:

1. The current catalog design is not ideal. It is a= symmetric (a
"primary" and an "other" table), which = is natural for FK-like joins,
but less intuitive for other joins.
2. Stats collection piggybacks on ANALYZE of the primary table and
uses= its single-column MCV for the join key.=C2=A0 This can be inaccurate
wh= en the MCV values on the "primary" side don't cover the impor= tant
values on the other side, or when the filter column isn't fully=
dependent on the join key. A more accurate approach would execute theactual join during collection, which could also decouple join stats
co= llection from single-table ANALYZE.

3. Currently limited to: equalit= y join clauses, equality and IN filter
clauses, simple Var stats objects= (no expressions), inner joins only,
and two-way joins only. Some of the= se are easier to extend; others may
be harder or unnecessary (like n-way= joins).

4. Patch 0002 (auto-creation from FK constraints) should pr= obably be
gated behind a GUC. I'm not strongly attached to this patc= h, but kept
it because FK joins seem like a natural and common use case.=

Conclusion
----------

Even with all the current limitatio= ns, I think this experiment
suggests that join-level statistics can sign= ificantly improve plans,
as a single join stats object can materially im= prove workload
performance.

If there's interest, I'm happ= y to continue iterating on the design.

In particular, I'd welcom= e feedback on:
- whether this is a direction worth pursuing,
- the ca= talog design,
- the stats collection approach,
- the planner integrat= ion strategy,
- and scope (what kinds of joins / predicates are worth su= pporting).

Best,
Alex

[1] https://www.vldb.org/pvldb/vol9/p204-leis.pdf=
[2] https:= //github.com/gregrahn/join-order-benchmark
[3] https://cedardb.com/docs/example_data= sets/job/
[4] https://github.com/l-wang/join-order-benchmark

<= br>

--
--0000000000002d73e506497fccee-- --0000000000002d73e706497fccf0 Content-Type: text/plain; charset="US-ASCII"; name="16b_nl.txt" Content-Disposition: attachment; filename="16b_nl.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzmkxc3 UGFnZXIgdXNhZ2UgaXMgb2ZmLgpTRVQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog QWdncmVnYXRlICAoY29zdD01MzUzLjcxLi41MzUzLjcyIHJvd3M9MSB3aWR0aD02NCkgKGFjdHVh bCB0aW1lPTEwNjA3LjY0Mi4uMTA2MDcuNjQ0IHJvd3M9MS4wMCBsb29wcz0xKQogICBCdWZmZXJz OiBzaGFyZWQgaGl0PTIyMjIzMTQxIHJlYWQ9MTM4MTgzNAogICAtPiAgTmVzdGVkIExvb3AgIChj b3N0PTkuMzcuLjUzMzcuODggcm93cz0zMTY1IHdpZHRoPTMzKSAoYWN0dWFsIHRpbWU9Mi41MDMu Ljk1MjUuNjczIHJvd3M9MzcxMDU5Mi4wMCBsb29wcz0xKQogICAgICAgICBKb2luIEZpbHRlcjog KGFuLnBlcnNvbl9pZCA9IG4uaWQpCiAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjIyMjMx NDEgcmVhZD0xMzgxODM0CiAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9OC45NS4uNDY2 Ny40OSByb3dzPTEzNzggd2lkdGg9MjUpIChhY3R1YWwgdGltZT0yLjQ5MC4uNjE3OS40MzYgcm93 cz0yODMyNTU1LjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9 MTE4OTc0MzkgcmVhZD0xMTA3NTAxCiAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNv c3Q9OC41Mi4uNDA0OC41MyByb3dzPTEzNzggd2lkdGg9MjEpIChhY3R1YWwgdGltZT0yLjQ4MS4u MzA2OS41MDggcm93cz0yODMyNTU1LjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgIEpv aW4gRmlsdGVyOiAoY2kubW92aWVfaWQgPSB0LmlkKQogICAgICAgICAgICAgICAgICAgICBCdWZm ZXJzOiBzaGFyZWQgaGl0PTMxNTk4ODUgcmVhZD03NTEzNjIKICAgICAgICAgICAgICAgICAgICAg LT4gIE5lc3RlZCBMb29wICAoY29zdD04LjA4Li4zOTI5LjA5IHJvd3M9NjMgd2lkdGg9MjkpIChh Y3R1YWwgdGltZT0yLjI0NS4uOTM3LjY4MyByb3dzPTY4MzE2LjAwIGxvb3BzPTEpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9ODE1NjYwIHJlYWQ9MTQ2NzYy CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ny42Ni4u Mzg1MC4xNSByb3dzPTE3NyB3aWR0aD0zMykgKGFjdHVhbCB0aW1lPTIuMjI0Li41OTguODIyIHJv d3M9MTQ4NTUyLjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpv aW4gRmlsdGVyOiAobWMubW92aWVfaWQgPSB0LmlkKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTI5NTgzOCByZWFkPTcyMzc2CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ny4yMy4uMzgyOS43 MSByb3dzPTM0IHdpZHRoPTI1KSAoYWN0dWFsIHRpbWU9Mi4xODUuLjQ5NC41MTkgcm93cz00MTg0 MC4wMCBsb29wcz0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZm ZXJzOiBzaGFyZWQgaGl0PTEyNTQxNSByZWFkPTU0NTM4CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ni44MC4uMzgxMy4xNCByb3dz PTM0IHdpZHRoPTQpIChhY3R1YWwgdGltZT0yLjE3Ny4uMzQ2LjEyMiByb3dzPTQxODQwLjAwIGxv b3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZl cnM6IHNoYXJlZCBoaXQ9MjQgcmVhZD0xMjU2OQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24ga2V5d29yZCBrICAoY29zdD0wLjAwLi4y Njg1LjExIHJvd3M9MSB3aWR0aD00KSAoYWN0dWFsIHRpbWU9MC4zODIuLjcuMDIyIHJvd3M9MS4w MCBsb29wcz0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBGaWx0ZXI6IChrZXl3b3JkID0gJ2NoYXJhY3Rlci1uYW1lLWluLXRpdGxlJzo6dGV4dCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93cyBS ZW1vdmVkIGJ5IEZpbHRlcjogMTM0MTY4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjIgcmVhZD05ODYKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNj YW4gb24gbW92aWVfa2V5d29yZCBtayAgKGNvc3Q9Ni44MC4uMTEyNC45OCByb3dzPTMwNSB3aWR0 aD04KSAoYWN0dWFsIHRpbWU9MS43OTQuLjMzNi42MTMgcm93cz00MTg0MC4wMCBsb29wcz0xKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNoZWNr IENvbmQ6IChrLmlkID0ga2V5d29yZF9pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgSGVhcCBCbG9ja3M6IGV4YWN0PTExNTQ3CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBo aXQ9MiByZWFkPTExNTgzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBrZXl3b3JkX2lkX21vdmllX2tleXdv cmQgIChjb3N0PTAuMDAuLjYuNzIgcm93cz0zMDUgd2lkdGg9MCkgKGFjdHVhbCB0aW1lPTAuOTY1 Li4wLjk2NSByb3dzPTQxODQwLjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChrZXl3b3JkX2lkID0g ay5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgSW5kZXggU2VhcmNoZXM6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0yIHJlYWQ9MzYKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg dGl0bGVfcGtleSBvbiB0aXRsZSB0ICAoY29zdD0wLjQzLi4wLjQ5IHJvd3M9MSB3aWR0aD0yMSkg KGFjdHVhbCB0aW1lPTAuMDAzLi4wLjAwMyByb3dzPTEuMDAgbG9vcHM9NDE4NDApCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IG1r Lm1vdmllX2lkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJ bmRleCBTZWFyY2hlczogNDE4NDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0xMjUzOTEgcmVhZD00MTk2OQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBtb3ZpZV9pZF9tb3Zp ZV9jb21wYW5pZXMgb24gbW92aWVfY29tcGFuaWVzIG1jICAoY29zdD0wLjQzLi4wLjU0IHJvd3M9 NSB3aWR0aD04KSAoYWN0dWFsIHRpbWU9MC4wMDIuLjAuMDAyIHJvd3M9My41NSBsb29wcz00MTg0 MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKG1v dmllX2lkID0gbWsubW92aWVfaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEluZGV4IFNlYXJjaGVzOiA0MTg0MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTE3MDQyMyByZWFkPTE3ODM4CiAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGNvbXBhbnlfbmFtZV9wa2V5IG9u IGNvbXBhbnlfbmFtZSBjbiAgKGNvc3Q9MC40Mi4uMC40NSByb3dzPTEgd2lkdGg9NCkgKGFjdHVh bCB0aW1lPTAuMDAyLi4wLjAwMiByb3dzPTAuNDYgbG9vcHM9MTQ4NTUyKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBtYy5jb21wYW55X2lkKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6ICgoY291bnRyeV9jb2RlKTo6dGV4 dCA9ICdbdXNdJzo6dGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93cyBS ZW1vdmVkIGJ5IEZpbHRlcjogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRl eCBTZWFyY2hlczogMTQ4NTUyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZl cnM6IHNoYXJlZCBoaXQ9NTE5ODIyIHJlYWQ9NzQzODYKICAgICAgICAgICAgICAgICAgICAgLT4g IEluZGV4IFNjYW4gdXNpbmcgbW92aWVfaWRfY2FzdF9pbmZvIG9uIGNhc3RfaW5mbyBjaSAgKGNv c3Q9MC40NC4uMS40MCByb3dzPTQwIHdpZHRoPTgpIChhY3R1YWwgdGltZT0wLjAwMy4uMC4wMjkg cm93cz00MS40NiBsb29wcz02ODMxNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKG1vdmllX2lkID0gbWsubW92aWVfaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAg IEluZGV4IFNlYXJjaGVzOiA2ODMxNgogICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJz OiBzaGFyZWQgaGl0PTIzNDQyMjUgcmVhZD02MDQ2MDAKICAgICAgICAgICAgICAgLT4gIEluZGV4 IE9ubHkgU2NhbiB1c2luZyBuYW1lX3BrZXkgb24gbmFtZSBuICAoY29zdD0wLjQzLi4wLjQ1IHJv d3M9MSB3aWR0aD00KSAoYWN0dWFsIHRpbWU9MC4wMDEuLjAuMDAxIHJvd3M9MS4wMCBsb29wcz0y ODMyNTU1KQogICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBjaS5wZXJzb25f aWQpCiAgICAgICAgICAgICAgICAgICAgIEhlYXAgRmV0Y2hlczogMAogICAgICAgICAgICAgICAg ICAgICBJbmRleCBTZWFyY2hlczogMjgzMjU1NQogICAgICAgICAgICAgICAgICAgICBCdWZmZXJz OiBzaGFyZWQgaGl0PTg3Mzc1NTQgcmVhZD0zNTYxMzkKICAgICAgICAgLT4gIEluZGV4IFNjYW4g dXNpbmcgcGVyc29uX2lkX2FrYV9uYW1lIG9uIGFrYV9uYW1lIGFuICAoY29zdD0wLjQyLi4wLjQ2 IHJvd3M9MiB3aWR0aD0yMCkgKGFjdHVhbCB0aW1lPTAuMDAxLi4wLjAwMSByb3dzPTEuMzEgbG9v cHM9MjgzMjU1NSkKICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHBlcnNvbl9pZCA9IGNpLnBl cnNvbl9pZCkKICAgICAgICAgICAgICAgSW5kZXggU2VhcmNoZXM6IDI4MzI1NTUKICAgICAgICAg ICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0xMDMyNTcwMiByZWFkPTI3NDMzMwogUGxhbm5pbmc6 CiAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9NTUwIHJlYWQ9MTI1CiBQbGFubmluZyBUaW1lOiA0LjY4 NiBtcwogRXhlY3V0aW9uIFRpbWU6IDEwNjA3LjcwNyBtcwooNjIgcm93cykKCg== --0000000000002d73e706497fccf0 Content-Type: application/octet-stream; name="v1-0002-Automatically-create-join-MCV-statistics-from-FK-.patch" Content-Disposition: attachment; filename="v1-0002-Automatically-create-join-MCV-statistics-from-FK-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzbsw10 RnJvbSBhY2VjZWE0NDIxYTY5ZDcwYmEwNzc4NjY4MjIzNzg3MmEzZGViNTBlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmEgV2FuZyA8YWxleGFuZHJhLndhbmcub3NzQGdt YWlsLmNvbT4KRGF0ZTogTW9uLCAyNiBKYW4gMjAyNiAxNDowMDo1OSAtMDgwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMi8yXSBBdXRvbWF0aWNhbGx5IGNyZWF0ZSBqb2luIE1DViBzdGF0aXN0aWNzIGZy b20gRksKIGNvbnN0cmFpbnRzCgpUaGlzIGNvbW1pdCBhZGRzIGF1dG9tYXRpYyBkZXRlY3Rpb24g YW5kIGNyZWF0aW9uIG9mIGpvaW4gTUNWIHN0YXRpc3RpY3MKZHVyaW5nIEFOQUxZWkUgd2hlbiB0 aGUgdGFibGUgaGFzIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnRzIGFuZCB0aGUKcmVmZXJlbmNlZCB0 YWJsZSBoYXMgZnVuY3Rpb25hbCBkZXBlbmRlbmNpZXMuCgpFeGFtcGxlOgoKLS0gR2l2ZW4gdGhl c2UgdGFibGVzOgpDUkVBVEUgVEFCTEUga2V5d29yZHMgKGlkIElOVCBQUklNQVJZIEtFWSwga2V5 d29yZCBURVhUKTsKQ1JFQVRFIFRBQkxFIG1vdmllX2tleXdvcmRzICgKICAgIG1vdmllX2lkIElO VCwKICAgIGtleXdvcmRfaWQgSU5UIFJFRkVSRU5DRVMga2V5d29yZHMoaWQpCik7CgotLSBBbmQg ZnVuY3Rpb25hbCBkZXBlbmRlbmNpZXMgb24gcmVmZXJlbmNlZCB0YWJsZToKQ1JFQVRFIFNUQVRJ U1RJQ1Mga3dfZGVwcyAoZGVwZW5kZW5jaWVzKSBPTiBpZCwga2V5d29yZCBGUk9NIGtleXdvcmRz OwoKLS0gQU5BTFlaRSBhdXRvbWF0aWNhbGx5IGRldGVjdHMgdGhlIEZLIGFuZCBjcmVhdGVzIGpv aW4gTUNWIHN0YXRzIGZvcgotLSBtb3ZpZV9rZXl3b3Jkcy5rZXl3b3JkX2lkIGFuZCBrZXl3b3Jk cy5rZXl3b3JkLgpBTkFMWVpFIG1vdmllX2tleXdvcmRzOwoKQ3VycmVudCBsaW1pdGF0aW9uOiBj dXJyZW50bHksIHRoZSBmdW5jdGlvbmFsIGRlcGVuZGVuY3kgdmFsdWVzIGFyZQpqdXN0IGFzc3Vt ZWQgdG8gYmUgMSwgd2hpY2ggY291bGQgbGVhZCB0byBsZXNzIGFjY3VyYXRlIGVzdGltYXRpb24u Ci0tLQogc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0cy5jICAgICAgIHwgNDk0 ICsrKysrKysrKysrKysrKysrKwogLi4uL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHNfaW50ZXJu YWwuaCAgICAgIHwgIDExICsKIC4uLi9yZWdyZXNzL2V4cGVjdGVkL3N0YXRzX2V4dF9jcm9zc3Jl bC5vdXQgICB8IDI0OSArKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzX2V4dF9j cm9zc3JlbC5zcWwgICB8IDE0MCArKysrKwogNCBmaWxlcyBjaGFuZ2VkLCA4OTQgaW5zZXJ0aW9u cygrKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHMu YyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHMuYwppbmRleCA4OTM5ZjU2 Y2M2Ny4uNWI4YjRjZjZjNDIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0 ZW5kZWRfc3RhdHMuYworKysgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRz LmMKQEAgLTIwLDcgKzIwLDExIEBACiAjaW5jbHVkZSAiYWNjZXNzL2dlbmFtLmgiCiAjaW5jbHVk ZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1ZGUgImFjY2Vzcy90YWJsZS5oIgorI2lu Y2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9kZXBlbmRlbmN5Lmgi CiAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleGluZy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY29u c3RyYWludC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfbmFtZXNwYWNlLmgiCiAjaW5jbHVkZSAi Y2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0LmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9wZ19zdGF0aXN0 aWNfZXh0X2RhdGEuaCIKICNpbmNsdWRlICJjb21tYW5kcy9kZWZyZW0uaCIKQEAgLTEyOSw2ICsx MzMsMjIgQEAgYm1zX3RvX2ludDJ2ZWN0b3IoQml0bWFwc2V0ICpibXMpCiAJcmV0dXJuIGJ1aWxk aW50MnZlY3RvcihhdHRudW1zLCBubWVtYmVycyk7CiB9CiAKKy8qIEpvaW4gTUNWIGZ1bmN0aW9u cyAqLworc3RhdGljIGJvb2wgc3RhdGV4dF9qb2luX21jdl9leGlzdHMoTGlzdCAqc3RhdHNsaXN0 LAorCQkJCQkJCQkJT2lkIHByaW1hcnlfcmVsLCBBdHRyTnVtYmVyIHByaW1hcnlfam9pbmtleV9h dHRyLAorCQkJCQkJCQkJT2lkIG90aGVyX3JlbCwgQXR0ck51bWJlciBvdGhlcl9qb2lua2V5X2F0 dHIsCisJCQkJCQkJCQlBdHRyTnVtYmVyIGZpbHRlcl9hdHRyKTsKK3N0YXRpYyB2b2lkIGJ1aWxk X2ltcGxpY2l0X2pvaW5fbWN2X3N0YXRzX2Zyb21fZmsoUmVsYXRpb24gb25lcmVsLCBMaXN0ICpz dGF0c2xpc3QsCisJCQkJCQkJCQkJCQkgIFJlbGF0aW9uIHBnX3N0ZXh0LCBib29sIGluaCwKKwkJ CQkJCQkJCQkJCSAgaW50IG51bXJvd3MsIEhlYXBUdXBsZSAqcm93cywKKwkJCQkJCQkJCQkJCSAg aW50IG5hdHRzLCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpOworc3RhdGljIExpc3QgKmRl dGVjdF9qb2luX3N0YXRzX2NhbmRpZGF0ZXMoUmVsYXRpb24gcmVsKTsKK3N0YXRpYyBPaWQJY3Jl YXRlX2ltcGxpY2l0X2pvaW5fc3RhdChSZWxhdGlvbiBwZ19zdGV4dCwKKwkJCQkJCQkJCSAgT2lk IHJlZmVyZW5jaW5nX3JlbCwKKwkJCQkJCQkJCSAgQXR0ck51bWJlciByZWZlcmVuY2luZ19hdHRy LAorCQkJCQkJCQkJICBPaWQgcmVmZXJlbmNlZF9yZWwsCisJCQkJCQkJCQkgIEF0dHJOdW1iZXIg cmVmZXJlbmNlZF9hdHRyLAorCQkJCQkJCQkJICBBdHRyTnVtYmVyIGZpbHRlcl9hdHRyKTsKIAog LyoKICAqIENvbXB1dGUgcmVxdWVzdGVkIGV4dGVuZGVkIHN0YXRzLCB1c2luZyB0aGUgcm93cyBz YW1wbGVkIGZvciB0aGUgcGxhaW4KQEAgLTMyMCw2ICszNDAsMTQgQEAgQnVpbGRSZWxhdGlvbkV4 dFN0YXRpc3RpY3MoUmVsYXRpb24gb25lcmVsLCBib29sIGluaCwgZG91YmxlIHRvdGFscm93cywK IAkJTWVtb3J5Q29udGV4dFJlc2V0KGN4dCk7CiAJfQogCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSd2 ZSBidWlsdCBzdGF0cyBmb3IgZXhwbGljaXQgYW5kIHByZXZpb3VzbHkgZXhpc3RpbmcKKwkgKiBp bXBsaWNpdCBzdGF0cyBvYmplY3RzLCBkZXRlY3QgYW5kIGJ1aWxkIG5ldyBpbXBsaWNpdCBGSy1i YXNlZCBqb2luCisJICogc3RhdHMgaWYgYXZhaWxhYmxlLgorCSAqLworCWJ1aWxkX2ltcGxpY2l0 X2pvaW5fbWN2X3N0YXRzX2Zyb21fZmsob25lcmVsLCBzdGF0c2xpc3QsIHBnX3N0ZXh0LCBpbmgs CisJCQkJCQkJCQkJICBudW1yb3dzLCByb3dzLCBuYXR0cywgdmFjYXR0cnN0YXRzKTsKKwogCU1l bW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQpOwogCU1lbW9yeUNvbnRleHREZWxldGUoY3h0KTsK IApAQCAtMjgwNywzICsyODM1LDQ2OSBAQCBtYWtlX2J1aWxkX2RhdGEoUmVsYXRpb24gcmVsLCBT dGF0RXh0RW50cnkgKnN0YXQsIGludCBudW1yb3dzLCBIZWFwVHVwbGUgKnJvd3MsCiAKIAlyZXR1 cm4gcmVzdWx0OwogfQorCisvKgorICogc3RhdGV4dF9qb2luX21jdl9leGlzdHMKKyAqCQlDaGVj ayBpZiBhIGpvaW4gbWN2IHN0YXRpc3RpYyBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgc3RhdHNsaXN0 LgorICoKKyAqIFRoaXMgcHJldmVudHMgZHVwbGljYXRlIGNyZWF0aW9uIGR1cmluZyBGSyBkZXRl Y3Rpb24gd2hlbiB0aGUgc3RhdAorICogd2FzIGFscmVhZHkgbWFudWFsbHkgY3JlYXRlZCBvciBl eGlzdHMgZnJvbSBhIHByZXZpb3VzIEFOQUxZWkUuCisgKi8KK3N0YXRpYyBib29sCitzdGF0ZXh0 X2pvaW5fbWN2X2V4aXN0cyhMaXN0ICpzdGF0c2xpc3QsCisJCQkJCQlPaWQgcHJpbWFyeV9yZWws IEF0dHJOdW1iZXIgcHJpbWFyeV9qb2lua2V5X2F0dHIsCisJCQkJCQlPaWQgb3RoZXJfcmVsLCBB dHRyTnVtYmVyIG90aGVyX2pvaW5rZXlfYXR0ciwKKwkJCQkJCUF0dHJOdW1iZXIgZmlsdGVyX2F0 dHIpCit7CisJTGlzdENlbGwgICAqbGM7CisKKwlmb3JlYWNoKGxjLCBzdGF0c2xpc3QpCisJewor CQlTdGF0RXh0RW50cnkgKnN0YXQgPSAoU3RhdEV4dEVudHJ5ICopIGxmaXJzdChsYyk7CisKKwkJ aWYgKCFsaXN0X21lbWJlcl9pbnQoc3RhdC0+dHlwZXMsIFNUQVRTX0VYVF9KT0lOX01DVikpCisJ CQljb250aW51ZTsKKworCQlpZiAoc3RhdC0+b3RoZXJyZWwgIT0gb3RoZXJfcmVsKQorCQkJY29u dGludWU7CisKKwkJLyogQ2hlY2sgaWYgam9pbiBrZXlzIG1hdGNoOiBbdGFyZ2V0X2pvaW5rZXks IG90aGVyX2pvaW5rZXldICovCisJCWlmICghc3RhdC0+am9pbmtleXMgfHwgc3RhdC0+am9pbmtl eXMtPmRpbTEgIT0gMikKKwkJCWNvbnRpbnVlOworCQlpZiAoc3RhdC0+am9pbmtleXMtPnZhbHVl c1swXSAhPSBwcmltYXJ5X2pvaW5rZXlfYXR0ciB8fAorCQkJc3RhdC0+am9pbmtleXMtPnZhbHVl c1sxXSAhPSBvdGhlcl9qb2lua2V5X2F0dHIpCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayBp ZiBmaWx0ZXIgY29sdW1uIG1hdGNoZXMgKi8KKwkJaWYgKGJtc19udW1fbWVtYmVycyhzdGF0LT5j b2x1bW5zKSAhPSAxKQorCQkJY29udGludWU7CisJCWlmICghYm1zX2lzX21lbWJlcihmaWx0ZXJf YXR0ciwgc3RhdC0+Y29sdW1ucykpCisJCQljb250aW51ZTsKKworCQkvKiBGb3VuZCBhIG1hdGNo ISAqLworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiBn ZXRfZnVuY3Rpb25hbF9kZXBlbmRlbnRzCisgKgkJRmluZCBjb2x1bW5zIGluIHJlZmVyZW5jZWQg dGFibGUgdGhhdCBhcmUgZnVuY3Rpb25hbGx5IGRlcGVuZGVudCBvbgorICoJCXRoZSByZWZlcmVu Y2VkIGNvbHVtbi4KKyAqCisgKiBTY2FucyBwZ19zdGF0aXN0aWNfZXh0IGZvciB0aGUgcmVmZXJl bmNlZCB0YWJsZSwgbG9hZHMgYW55IGZ1bmN0aW9uYWwKKyAqIGRlcGVuZGVuY3kgc3RhdGlzdGlj cywgYW5kIHJldHVybnMgYSBsaXN0IG9mIEF0dHJOdW1iZXJzIGZvciBjb2x1bW5zCisgKiB0aGF0 IGhhdmUgYSBkZXBlbmRlbmN5OiByZWZlcmVuY2VkX2F0dHIg4oaSIGNvbHVtbgorICoKKyAqIFJl dHVybnM6IExpc3Qgb2YgQXR0ck51bWJlcnMKKyAqLworc3RhdGljIExpc3QgKgorZ2V0X2Z1bmN0 aW9uYWxfZGVwZW5kZW50cyhPaWQgcmVmZXJlbmNlZF9yZWwsIEF0dHJOdW1iZXIgcmVmZXJlbmNl ZF9hdHRyKQoreworCUxpc3QJICAgKmRlcGVuZGVudHMgPSBOSUw7CisJUmVsYXRpb24JcGdfc3Rl eHQ7CisJU3lzU2NhbkRlc2Mgc2NhbjsKKwlTY2FuS2V5RGF0YSBrZXk7CisJSGVhcFR1cGxlCXR1 cGxlOworCisJLyogT3BlbiBwZ19zdGF0aXN0aWNfZXh0IGFuZCBzY2FuIGZvciBlbnRyaWVzIG9u IHJlZmVyZW5jZWRfcmVsICovCisJcGdfc3RleHQgPSB0YWJsZV9vcGVuKFN0YXRpc3RpY0V4dFJl bGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlTY2FuS2V5SW5pdCgma2V5LAorCQkJCUFu dW1fcGdfc3RhdGlzdGljX2V4dF9zdHhyZWxpZCwKKwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIs IEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShyZWZlcmVuY2VkX3JlbCkpOworCisJc2Nh biA9IHN5c3RhYmxlX2JlZ2luc2NhbihwZ19zdGV4dCwgU3RhdGlzdGljRXh0UmVsaWRJbmRleElk LCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMSwgJmtleSk7CisKKwl3aGlsZSAoSGVhcFR1cGxlSXNW YWxpZCh0dXBsZSA9IHN5c3RhYmxlX2dldG5leHQoc2NhbikpKQorCXsKKwkJRm9ybV9wZ19zdGF0 aXN0aWNfZXh0IHN0YXQgPSAoRm9ybV9wZ19zdGF0aXN0aWNfZXh0KSBHRVRTVFJVQ1QodHVwbGUp OworCQlNVkRlcGVuZGVuY2llcyAqZGVwZW5kZW5jaWVzOworCQlpbnQJCQlpOworCisJCS8qIENo ZWNrIGlmIHRoaXMgc3RhdHMgb2JqZWN0IGhhcyBkZXBlbmRlbmNpZXMgKi8KKwkJaWYgKCFzdGF0 ZXh0X2lzX2tpbmRfYnVpbHQodHVwbGUsIFNUQVRTX0VYVF9ERVBFTkRFTkNJRVMpKQorCQkJY29u dGludWU7CisKKwkJLyogTG9hZCBkZXBlbmRlbmNpZXMgKi8KKwkJZGVwZW5kZW5jaWVzID0gc3Rh dGV4dF9kZXBlbmRlbmNpZXNfbG9hZChzdGF0LT5vaWQsIGZhbHNlKTsKKwkJaWYgKCFkZXBlbmRl bmNpZXMpCisJCQljb250aW51ZTsKKworCQkvKiBTY2FuIGVhY2ggZGVwZW5kZW5jeSBmb3IgcGF0 dGVybjogcmVmZXJlbmNlZF9hdHRyIOKGkiBvdGhlcl9jb2wgKi8KKwkJZm9yIChpID0gMDsgaSA8 IGRlcGVuZGVuY2llcy0+bmRlcHM7IGkrKykKKwkJeworCQkJTVZEZXBlbmRlbmN5ICpkZXAgPSBk ZXBlbmRlbmNpZXMtPmRlcHNbaV07CisKKwkJCS8qCisJCQkgKiBDaGVjayBpZiB0aGlzIGlzIGEg c2ltcGxlIGRlcGVuZGVuY3kgKDIgYXR0cmlidXRlcykgd2hlcmUgdGhlCisJCQkgKiBmaXJzdCBh dHRyaWJ1dGUgaXMgb3VyIHJlZmVyZW5jZWRfYXR0cgorCQkJICovCisJCQlpZiAoZGVwLT5uYXR0 cmlidXRlcyA9PSAyICYmCisJCQkJZGVwLT5hdHRyaWJ1dGVzWzBdID09IHJlZmVyZW5jZWRfYXR0 cikKKwkJCXsKKwkJCQlBdHRyTnVtYmVyCWRlcGVuZGVudF9hdHRyID0gZGVwLT5hdHRyaWJ1dGVz WzFdOworCisJCQkJLyogQWRkIHRvIGxpc3QgaWYgbm90IGFscmVhZHkgdGhlcmUgKi8KKwkJCQlp ZiAoIWxpc3RfbWVtYmVyX2ludChkZXBlbmRlbnRzLCBkZXBlbmRlbnRfYXR0cikpCisJCQkJCWRl cGVuZGVudHMgPSBsYXBwZW5kX2ludChkZXBlbmRlbnRzLCBkZXBlbmRlbnRfYXR0cik7CisJCQl9 CisJCX0KKworCQlwZnJlZShkZXBlbmRlbmNpZXMpOworCX0KKworCXN5c3RhYmxlX2VuZHNjYW4o c2Nhbik7CisJdGFibGVfY2xvc2UocGdfc3RleHQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlyZXR1 cm4gZGVwZW5kZW50czsKK30KKworLyoKKyAqIGJ1aWxkX2ltcGxpY2l0X2pvaW5fbWN2X3N0YXRz X2Zyb21fZmsKKyAqCQlCdWlsZCBpbXBsaWNpdCBGSy1iYXNlZCBqb2luIE1DViBzdGF0aXN0aWNz IGZvciB0aGUgcmVsYXRpb24gYmVpbmcgYW5hbHl6ZWQKKyAqLworc3RhdGljIHZvaWQKK2J1aWxk X2ltcGxpY2l0X2pvaW5fbWN2X3N0YXRzX2Zyb21fZmsoUmVsYXRpb24gb25lcmVsLCBMaXN0ICpz dGF0c2xpc3QsCisJCQkJCQkJCQkgIFJlbGF0aW9uIHBnX3N0ZXh0LCBib29sIGluaCwKKwkJCQkJ CQkJCSAgaW50IG51bXJvd3MsIEhlYXBUdXBsZSAqcm93cywKKwkJCQkJCQkJCSAgaW50IG5hdHRz LCBWYWNBdHRyU3RhdHMgKip2YWNhdHRyc3RhdHMpCit7CisJTGlzdAkgICAqY2FuZGlkYXRlczsK KwlMaXN0Q2VsbCAgICpsY19jYW5kOworCisJZWxvZyhERUJVRzEsICJKb2luIG1jdiBzdGF0czog U3RhcnRpbmcgRkstYmFzZWQgY2FuZGlkYXRlIGRldGVjdGlvbiBmb3IgcmVsYXRpb24gJXMiLAor CQkgUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUob25lcmVsKSk7CisKKwkvKiBEZXRlY3QgY2FuZGlk YXRlcyBiYXNlZCBvbiBGSyBjb25zdHJhaW50cyBhbmQgZnVuY3Rpb25hbCBkZXBlbmRlbmNpZXMg Ki8KKwljYW5kaWRhdGVzID0gZGV0ZWN0X2pvaW5fc3RhdHNfY2FuZGlkYXRlcyhvbmVyZWwpOwor CisJZm9yZWFjaChsY19jYW5kLCBjYW5kaWRhdGVzKQorCXsKKwkJRktKb2luU3RhdHNDYW5kaWRh dGUgKmNhbmRpZGF0ZSA9IChGS0pvaW5TdGF0c0NhbmRpZGF0ZSAqKSBsZmlyc3QobGNfY2FuZCk7 CisJCUpvaW5NQ1ZMaXN0ICpqb2luX21jdjsKKwkJT2lkCQkJc3RhdF9vaWQ7CisJCWludDJ2ZWN0 b3IgKmpvaW5rZXlzOworCQlpbnQydmVjdG9yICpmaWx0ZXJfYXR0bnVtczsKKwkJaW50MTYJCWpv aW5rZXlzX2FycmF5WzJdOworCQlpbnQxNgkJZmlsdGVyX2FycmF5WzFdOworCisJCWVsb2coREVC VUcxLCAiSm9pbiBtY3Ygc3RhdHM6IENoZWNraW5nIEZLIGNhbmRpZGF0ZSBmb3IgcmVmZXJlbmNp bmdfcmVsPSV1IGF0dHI9JWQsICIKKwkJCSAicmVmZXJlbmNlZF9yZWw9JXUgYXR0cj0lZCwgZmls dGVyX2F0dHI9JWQiLAorCQkJIGNhbmRpZGF0ZS0+cmVmZXJlbmNpbmdfcmVsLCBjYW5kaWRhdGUt PnJlZmVyZW5jaW5nX2F0dHIsCisJCQkgY2FuZGlkYXRlLT5yZWZlcmVuY2VkX3JlbCwgY2FuZGlk YXRlLT5yZWZlcmVuY2VkX2F0dHIsCisJCQkgY2FuZGlkYXRlLT5maWx0ZXJfYXR0cik7CisKKwkJ LyoKKwkJICogU2tpcCBzdGF0IHRoYXQgYWxyZWFkeSBleGlzdHMgKGVpdGhlciBtYW51YWxseSBj cmVhdGVkIG9yIGZyb20gYQorCQkgKiBwcmV2aW91cyBBTkFMWVpFKS4KKwkJICovCisJCWlmIChz dGF0ZXh0X2pvaW5fbWN2X2V4aXN0cyhzdGF0c2xpc3QsCisJCQkJCQkJCQljYW5kaWRhdGUtPnJl ZmVyZW5jaW5nX3JlbCwKKwkJCQkJCQkJCWNhbmRpZGF0ZS0+cmVmZXJlbmNpbmdfYXR0ciwKKwkJ CQkJCQkJCWNhbmRpZGF0ZS0+cmVmZXJlbmNlZF9yZWwsCisJCQkJCQkJCQljYW5kaWRhdGUtPnJl ZmVyZW5jZWRfYXR0ciwKKwkJCQkJCQkJCWNhbmRpZGF0ZS0+ZmlsdGVyX2F0dHIpKQorCQl7CisJ CQllbG9nKERFQlVHMSwgIkpvaW4gbWN2IHN0YXRzOiBTdGF0IGFscmVhZHkgZXhpc3RzLCBza2lw cGluZyBGSyBjYW5kaWRhdGUiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZWxvZyhERUJVRzEs ICJKb2luIG1jdiBzdGF0czogQ3JlYXRpbmcgbmV3IGltcGxpY2l0IHN0YXQgZm9yIEZLIGNhbmRp ZGF0ZSIpOworCisJCS8qIENyZWF0ZSBpbXBsaWNpdCBzdGF0aXN0aWNzIG9iamVjdCBmaXJzdCB0 byBnZXQgc3RhdF9vaWQgKi8KKwkJc3RhdF9vaWQgPSBjcmVhdGVfaW1wbGljaXRfam9pbl9zdGF0 KHBnX3N0ZXh0LAorCQkJCQkJCQkJCQkgY2FuZGlkYXRlLT5yZWZlcmVuY2luZ19yZWwsCisJCQkJ CQkJCQkJCSBjYW5kaWRhdGUtPnJlZmVyZW5jaW5nX2F0dHIsCisJCQkJCQkJCQkJCSBjYW5kaWRh dGUtPnJlZmVyZW5jZWRfcmVsLAorCQkJCQkJCQkJCQkgY2FuZGlkYXRlLT5yZWZlcmVuY2VkX2F0 dHIsCisJCQkJCQkJCQkJCSBjYW5kaWRhdGUtPmZpbHRlcl9hdHRyKTsKKworCQkvKiBDb25zdHJ1 Y3Qgam9pbmtleXM6IFtyZWZlcmVuY2luZ19hdHRyLCByZWZlcmVuY2VkX2F0dHJdICovCisJCWpv aW5rZXlzX2FycmF5WzBdID0gY2FuZGlkYXRlLT5yZWZlcmVuY2luZ19hdHRyOworCQlqb2lua2V5 c19hcnJheVsxXSA9IGNhbmRpZGF0ZS0+cmVmZXJlbmNlZF9hdHRyOworCQlqb2lua2V5cyA9IGJ1 aWxkaW50MnZlY3Rvcihqb2lua2V5c19hcnJheSwgMik7CisKKwkJLyogQ29uc3RydWN0IGZpbHRl cl9hdHRudW1zOiBbZmlsdGVyX2F0dHJdICovCisJCWZpbHRlcl9hcnJheVswXSA9IGNhbmRpZGF0 ZS0+ZmlsdGVyX2F0dHI7CisJCWZpbHRlcl9hdHRudW1zID0gYnVpbGRpbnQydmVjdG9yKGZpbHRl cl9hcnJheSwgMSk7CisKKwkJam9pbl9tY3YgPSBzdGF0ZXh0X2pvaW5fbWN2X2J1aWxkKHN0YXRf b2lkLAorCQkJCQkJCQkJCSAgY2FuZGlkYXRlLT5yZWZlcmVuY2luZ19yZWwsCisJCQkJCQkJCQkJ ICBjYW5kaWRhdGUtPnJlZmVyZW5jZWRfcmVsLAorCQkJCQkJCQkJCSAgam9pbmtleXMsCisJCQkJ CQkJCQkJICBmaWx0ZXJfYXR0bnVtcywKKwkJCQkJCQkJCQkgIG51bXJvd3MsCisJCQkJCQkJCQkJ ICByb3dzLAorCQkJCQkJCQkJCSAgbmF0dHMsCisJCQkJCQkJCQkJICB2YWNhdHRyc3RhdHMpOwor CisJCWVsb2coREVCVUcxLCAiSm9pbiBtY3Ygc3RhdHM6IEJ1aWx0IE1DViBsaXN0IHdpdGggJWQg aXRlbXMiLAorCQkJIGpvaW5fbWN2ID8gam9pbl9tY3YtPm5pdGVtcyA6IDApOworCisJCWlmICgh am9pbl9tY3YpCisJCQljb250aW51ZTsKKworCQlzdGF0ZXh0X3N0b3JlKHN0YXRfb2lkLCBpbmgs CisJCQkJCSAgTlVMTCwgTlVMTCwgTlVMTCwgKERhdHVtKSAwLCBOVUxMLAorCQkJCQkgIGpvaW5f bWN2KTsKKworCQlwZnJlZShqb2luX21jdik7CisJfQorCisJbGlzdF9mcmVlX2RlZXAoY2FuZGlk YXRlcyk7Cit9CisKKy8qCisgKiBkZXRlY3Rfam9pbl9zdGF0c19jYW5kaWRhdGVzCisgKgkJU2Nh biBmb3JlaWduIGtleSBjb25zdHJhaW50cyBvbiB0aGUgYW5hbHl6ZWQgdGFibGUgYW5kIGlkZW50 aWZ5CisgKgkJY2FuZGlkYXRlcyBmb3Igam9pbiBNQ1Ygc3RhdGlzdGljcyBjb2xsZWN0aW9uLgor ICoKKyAqIEZvciBlYWNoIEZLIGNvbnN0cmFpbnQ6CisgKiAxLiBHZXQgdGhlIEZLIGNvbHVtbiAo cmVmZXJlbmNpbmcgc2lkZSkKKyAqIDIuIEdldCB0aGUgcmVmZXJlbmNlZCB0YWJsZSBhbmQgY29s dW1uCisgKiAzLiBGaW5kIGNvbHVtbnMgaW4gcmVmZXJlbmNlZCB0YWJsZSB3aXRoIGZ1bmN0aW9u YWwgZGVwZW5kZW5jaWVzCisgKiA0LiBDcmVhdGUgYSBjYW5kaWRhdGUgZm9yIGVhY2ggZGVwZW5k ZW50IGNvbHVtbgorICoKKyAqIFJldHVybnM6IExpc3Qgb2YgRktKb2luU3RhdHNDYW5kaWRhdGUg c3RydWN0cworICovCitzdGF0aWMgTGlzdCAqCitkZXRlY3Rfam9pbl9zdGF0c19jYW5kaWRhdGVz KFJlbGF0aW9uIHJlbCkKK3sKKwlMaXN0CSAgICpjYW5kaWRhdGVzID0gTklMOworCVJlbGF0aW9u CXBnX2NvbnN0cmFpbnQ7CisJU3lzU2NhbkRlc2Mgc2NhbjsKKwlTY2FuS2V5RGF0YSBrZXk7CisJ SGVhcFR1cGxlCXR1cGxlOworCisJLyogT3BlbiBwZ19jb25zdHJhaW50IGFuZCBzY2FuIGZvciBG SyBjb25zdHJhaW50cyBvbiB0aGlzIHRhYmxlICovCisJcGdfY29uc3RyYWludCA9IHRhYmxlX29w ZW4oQ29uc3RyYWludFJlbGF0aW9uSWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlTY2FuS2V5SW5p dCgma2V5LAorCQkJCUFudW1fcGdfY29uc3RyYWludF9jb25yZWxpZCwKKwkJCQlCVEVxdWFsU3Ry YXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1bShSZWxhdGlvbkdldFJl bGlkKHJlbCkpKTsKKworCXNjYW4gPSBzeXN0YWJsZV9iZWdpbnNjYW4ocGdfY29uc3RyYWludCwg Q29uc3RyYWludFJlbGlkVHlwaWROYW1lSW5kZXhJZCwKKwkJCQkJCQkgIHRydWUsIE5VTEwsIDEs ICZrZXkpOworCisJd2hpbGUgKEhlYXBUdXBsZUlzVmFsaWQodHVwbGUgPSBzeXN0YWJsZV9nZXRu ZXh0KHNjYW4pKSkKKwl7CisJCUZvcm1fcGdfY29uc3RyYWludCBjb24gPSAoRm9ybV9wZ19jb25z dHJhaW50KSBHRVRTVFJVQ1QodHVwbGUpOworCQlEYXR1bQkJY29ua2V5X2RhdHVtOworCQlEYXR1 bQkJY29uZmtleV9kYXR1bTsKKwkJYm9vbAkJaXNudWxsOworCQlBcnJheVR5cGUgICpjb25rZXlf YXJyYXk7CisJCUFycmF5VHlwZSAgKmNvbmZrZXlfYXJyYXk7CisJCWludAkJCW51bWZrczsKKwkJ QXR0ck51bWJlciAqY29ua2V5OworCQlBdHRyTnVtYmVyICpjb25ma2V5OworCQlMaXN0CSAgICpk ZXBlbmRlbnRzOworCQlMaXN0Q2VsbCAgICpsYzsKKwkJaW50CQkJaTsKKworCQkvKiBPbmx5IGlu dGVyZXN0ZWQgaW4gZm9yZWlnbiBrZXkgY29uc3RyYWludHMgKi8KKwkJaWYgKGNvbi0+Y29udHlw ZSAhPSBDT05TVFJBSU5UX0ZPUkVJR04pCisJCQljb250aW51ZTsKKworCQkvKiBHZXQgdGhlIEZL IGNvbHVtbiBudW1iZXJzICovCisJCWNvbmtleV9kYXR1bSA9IGhlYXBfZ2V0YXR0cih0dXBsZSwg QW51bV9wZ19jb25zdHJhaW50X2NvbmtleSwKKwkJCQkJCQkJCVJlbGF0aW9uR2V0RGVzY3IocGdf Y29uc3RyYWludCksICZpc251bGwpOworCQlBc3NlcnQoIWlzbnVsbCk7CisJCWNvbmtleV9hcnJh eSA9IERhdHVtR2V0QXJyYXlUeXBlUChjb25rZXlfZGF0dW0pOworCisJCS8qIEdldCB0aGUgcmVm ZXJlbmNlZCBjb2x1bW4gbnVtYmVycyAqLworCQljb25ma2V5X2RhdHVtID0gaGVhcF9nZXRhdHRy KHR1cGxlLCBBbnVtX3BnX2NvbnN0cmFpbnRfY29uZmtleSwKKwkJCQkJCQkJCSBSZWxhdGlvbkdl dERlc2NyKHBnX2NvbnN0cmFpbnQpLCAmaXNudWxsKTsKKwkJQXNzZXJ0KCFpc251bGwpOworCQlj b25ma2V5X2FycmF5ID0gRGF0dW1HZXRBcnJheVR5cGVQKGNvbmZrZXlfZGF0dW0pOworCisJCS8q IERlY29kZSB0aGUgYXJyYXlzICovCisJCW51bWZrcyA9IEFSUl9ESU1TKGNvbmtleV9hcnJheSlb MF07CisJCWNvbmtleSA9IChBdHRyTnVtYmVyICopIEFSUl9EQVRBX1BUUihjb25rZXlfYXJyYXkp OworCQljb25ma2V5ID0gKEF0dHJOdW1iZXIgKikgQVJSX0RBVEFfUFRSKGNvbmZrZXlfYXJyYXkp OworCisJCS8qCisJCSAqIEZvciBlYWNoIEZLIGNvbHVtbiwgZmluZCBmdW5jdGlvbmFsIGRlcGVu ZGVudHMgaW4gcmVmZXJlbmNlZCB0YWJsZQorCQkgKiBUT0RPOiBGb3Igbm93IHdlIG9ubHkgaGFu ZGxlIHNpbmdsZS1jb2x1bW4gRktzCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtZmtzOyBp KyspCisJCXsKKwkJCUF0dHJOdW1iZXIJcmVmZXJlbmNpbmdfYXR0ciA9IGNvbmtleVtpXTsKKwkJ CUF0dHJOdW1iZXIJcmVmZXJlbmNlZF9hdHRyID0gY29uZmtleVtpXTsKKwkJCU9pZAkJCXJlZmVy ZW5jZWRfcmVsID0gY29uLT5jb25mcmVsaWQ7CisKKwkJCS8qIEZpbmQgY29sdW1ucyBkZXBlbmRl bnQgb24gdGhlIHJlZmVyZW5jZWQgY29sdW1uICovCisJCQlkZXBlbmRlbnRzID0gZ2V0X2Z1bmN0 aW9uYWxfZGVwZW5kZW50cyhyZWZlcmVuY2VkX3JlbCwgcmVmZXJlbmNlZF9hdHRyKTsKKworCQkJ LyogQ3JlYXRlIGEgY2FuZGlkYXRlIGZvciBlYWNoIGRlcGVuZGVudCBjb2x1bW4gKi8KKwkJCWZv cmVhY2gobGMsIGRlcGVuZGVudHMpCisJCQl7CisJCQkJQXR0ck51bWJlcglmaWx0ZXJfYXR0ciA9 IGxmaXJzdF9pbnQobGMpOworCQkJCUZLSm9pblN0YXRzQ2FuZGlkYXRlICpjYW5kaWRhdGU7CisK KwkJCQljYW5kaWRhdGUgPSAoRktKb2luU3RhdHNDYW5kaWRhdGUgKikgcGFsbG9jKHNpemVvZihG S0pvaW5TdGF0c0NhbmRpZGF0ZSkpOworCQkJCWNhbmRpZGF0ZS0+cmVmZXJlbmNpbmdfcmVsID0g UmVsYXRpb25HZXRSZWxpZChyZWwpOworCQkJCWNhbmRpZGF0ZS0+cmVmZXJlbmNpbmdfYXR0ciA9 IHJlZmVyZW5jaW5nX2F0dHI7CisJCQkJY2FuZGlkYXRlLT5yZWZlcmVuY2VkX3JlbCA9IHJlZmVy ZW5jZWRfcmVsOworCQkJCWNhbmRpZGF0ZS0+cmVmZXJlbmNlZF9hdHRyID0gcmVmZXJlbmNlZF9h dHRyOworCQkJCWNhbmRpZGF0ZS0+ZmlsdGVyX2F0dHIgPSBmaWx0ZXJfYXR0cjsKKworCQkJCWNh bmRpZGF0ZXMgPSBsYXBwZW5kKGNhbmRpZGF0ZXMsIGNhbmRpZGF0ZSk7CisJCQl9CisKKwkJCWxp c3RfZnJlZShkZXBlbmRlbnRzKTsKKwkJfQorCX0KKworCXN5c3RhYmxlX2VuZHNjYW4oc2Nhbik7 CisJdGFibGVfY2xvc2UocGdfY29uc3RyYWludCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJldHVy biBjYW5kaWRhdGVzOworfQorCisvKgorICogY3JlYXRlX2ltcGxpY2l0X2pvaW5fc3RhdAorICoJ CUNyZWF0ZSBhbiBpbXBsaWNpdCBwZ19zdGF0aXN0aWNfZXh0IGVudHJ5IGZvciBqb2luIE1DViBz dGF0aXN0aWNzCisgKgorICogVGhpcyBjcmVhdGVzIGEgc3RhdGlzdGljcyBvYmplY3QgaW4gcGdf c3RhdGlzdGljX2V4dCB0byBob2xkIHRoZQorICogam9pbiBNQ1YgZGF0YS4gVGhlIG9iamVjdCBp cyAiaW1wbGljaXQiIGluIHRoZSBzZW5zZSB0aGF0IGl0J3MKKyAqIGF1dG9tYXRpY2FsbHkgY3Jl YXRlZCBieSBBTkFMWVpFLCBub3QgZXhwbGljaXRseSB2aWEgQ1JFQVRFIFNUQVRJU1RJQ1MuCisg KgorICogUmV0dXJucyB0aGUgT0lEIG9mIHRoZSBjcmVhdGVkIHN0YXRpc3RpY3Mgb2JqZWN0LCBv ciBJbnZhbGlkT2lkIGlmIGNyZWF0aW9uCisgKiBmYWlsZWQgb3IgYW4gZXF1aXZhbGVudCBvYmpl Y3QgYWxyZWFkeSBleGlzdHMuCisgKi8KK3N0YXRpYyBPaWQKK2NyZWF0ZV9pbXBsaWNpdF9qb2lu X3N0YXQoUmVsYXRpb24gcGdfc3RleHQsCisJCQkJCQkgIE9pZCByZWZlcmVuY2luZ19yZWwsCisJ CQkJCQkgIEF0dHJOdW1iZXIgcmVmZXJlbmNpbmdfYXR0ciwKKwkJCQkJCSAgT2lkIHJlZmVyZW5j ZWRfcmVsLAorCQkJCQkJICBBdHRyTnVtYmVyIHJlZmVyZW5jZWRfYXR0ciwKKwkJCQkJCSAgQXR0 ck51bWJlciBmaWx0ZXJfYXR0cikKK3sKKwlOYW1lRGF0YQlzdGF0X25hbWU7CisJT2lkCQkJc3Rh dF9vaWQ7CisJRGF0dW0JCXZhbHVlc1tOYXR0c19wZ19zdGF0aXN0aWNfZXh0XTsKKwlib29sCQlu dWxsc1tOYXR0c19wZ19zdGF0aXN0aWNfZXh0XTsKKwlIZWFwVHVwbGUJaHR1cDsKKwlEYXR1bQkJ a2luZHNbMV07CisJQXJyYXlUeXBlICAqc3R4a2luZDsKKwlpbnQxNgkJYXR0bnVtc1sxXTsKKwlB cnJheVR5cGUgICpzdHhrZXlzOworCWNoYXIJCW5hbWVidWZbTkFNRURBVEFMRU5dOworCUhlYXBU dXBsZQljbGFzc3R1cGxlOworCUZvcm1fcGdfY2xhc3MgY2xhc3Nmb3JtOworCWludDE2CQlqb2lu a2V5c1syXTsKKwlpbnQydmVjdG9yICpqazsKKwlPaWQJCQlzdHhvd25lcjsKKwlPYmplY3RBZGRy ZXNzIG15c2VsZjsKKwlPYmplY3RBZGRyZXNzIHBhcmVudG9iamVjdDsKKworCS8qCisJICogR2Vu ZXJhdGUgYSBuYW1lIGZvciB0aGlzIHN0YXRpc3RpY3Mgb2JqZWN0IGluIGZvcm1hdDoKKwkgKiAi X2pvaW5fbWN2XzxyZWZyZWw+XzxyZWZhdHRyPl88cmVmZWRyZWw+XzxyZWZlZGF0dHI+XzxmaWx0 ZXJhdHRyPiIKKwkgKi8KKwlzbnByaW50ZihuYW1lYnVmLCBOQU1FREFUQUxFTiwgIl9qb2luX21j dl8ldV8lZF8ldV8lZF8lZCIsCisJCQkgcmVmZXJlbmNpbmdfcmVsLCByZWZlcmVuY2luZ19hdHRy LAorCQkJIHJlZmVyZW5jZWRfcmVsLCByZWZlcmVuY2VkX2F0dHIsIGZpbHRlcl9hdHRyKTsKKwlu YW1lc3RyY3B5KCZzdGF0X25hbWUsIG5hbWVidWYpOworCisJLyoKKwkgKiBDaGVjayBpZiBhIHN0 YXRpc3RpY3Mgb2JqZWN0IHdpdGggdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMKKwkg KiBuYW1lc3BhY2UuIElmIHNvLCB3ZSdsbCByZXVzZSBpdCByYXRoZXIgdGhhbiBjcmVhdGluZyBh IGR1cGxpY2F0ZS4KKwkgKi8KKwlzdGF0X29pZCA9IEdldFN5c0NhY2hlT2lkMihTVEFURVhUTkFN RU5TUCwgQW51bV9wZ19zdGF0aXN0aWNfZXh0X29pZCwKKwkJCQkJCQkgICBQb2ludGVyR2V0RGF0 dW0oJnN0YXRfbmFtZSksCisJCQkJCQkJICAgT2JqZWN0SWRHZXREYXR1bShnZXRfcmVsX25hbWVz cGFjZShyZWZlcmVuY2luZ19yZWwpKSk7CisJaWYgKE9pZElzVmFsaWQoc3RhdF9vaWQpKQorCQly ZXR1cm4gc3RhdF9vaWQ7CisKKwkvKiBDcmVhdGUgbmV3IHN0YXRpc3RpY3Mgb2JqZWN0ICovCisJ bWVtc2V0KHZhbHVlcywgMCwgc2l6ZW9mKHZhbHVlcykpOworCW1lbXNldChudWxscywgZmFsc2Us IHNpemVvZihudWxscykpOworCisJLyogR2VuZXJhdGUgbmV3IE9JRCAqLworCXN0YXRfb2lkID0g R2V0TmV3T2lkV2l0aEluZGV4KHBnX3N0ZXh0LCBTdGF0aXN0aWNFeHRPaWRJbmRleElkLAorCQkJ CQkJCQkgIEFudW1fcGdfc3RhdGlzdGljX2V4dF9vaWQpOworCisJdmFsdWVzW0FudW1fcGdfc3Rh dGlzdGljX2V4dF9vaWQgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0oc3RhdF9vaWQpOworCXZhbHVl c1tBbnVtX3BnX3N0YXRpc3RpY19leHRfc3R4cmVsaWQgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0o cmVmZXJlbmNpbmdfcmVsKTsKKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eG5hbWUg LSAxXSA9IE5hbWVHZXREYXR1bSgmc3RhdF9uYW1lKTsKKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0 aWNfZXh0X3N0eG5hbWVzcGFjZSAtIDFdID0KKwkJT2JqZWN0SWRHZXREYXR1bShnZXRfcmVsX25h bWVzcGFjZShyZWZlcmVuY2luZ19yZWwpKTsKKworCS8qIEdldCBvd25lciBmcm9tIHBnX2NsYXNz ICovCisJY2xhc3N0dXBsZSA9IFNlYXJjaFN5c0NhY2hlMShSRUxPSUQsIE9iamVjdElkR2V0RGF0 dW0ocmVmZXJlbmNpbmdfcmVsKSk7CisJaWYgKCFIZWFwVHVwbGVJc1ZhbGlkKGNsYXNzdHVwbGUp KQorCQllbG9nKEVSUk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgcmVsYXRpb24gJXUiLCBy ZWZlcmVuY2luZ19yZWwpOworCWNsYXNzZm9ybSA9IChGb3JtX3BnX2NsYXNzKSBHRVRTVFJVQ1Qo Y2xhc3N0dXBsZSk7CisJc3R4b3duZXIgPSBjbGFzc2Zvcm0tPnJlbG93bmVyOworCXZhbHVlc1tB bnVtX3BnX3N0YXRpc3RpY19leHRfc3R4b3duZXIgLSAxXSA9IE9iamVjdElkR2V0RGF0dW0oc3R4 b3duZXIpOworCVJlbGVhc2VTeXNDYWNoZShjbGFzc3R1cGxlKTsKKworCS8qIHN0eGtleXMgY29u dGFpbnMgdGhlIGZpbHRlciBjb2x1bW4gKGZyb20gcmVmZXJlbmNlZCB0YWJsZSkgKi8KKwlhdHRu dW1zWzBdID0gZmlsdGVyX2F0dHI7CisJc3R4a2V5cyA9IGNvbnN0cnVjdF9hcnJheV9idWlsdGlu KChEYXR1bSAqKSBhdHRudW1zLCAxLCBJTlQyT0lEKTsKKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0 aWNfZXh0X3N0eGtleXMgLSAxXSA9IFBvaW50ZXJHZXREYXR1bShzdHhrZXlzKTsKKworCS8qIHN0 eGtpbmQgY29udGFpbnMgb25seSBTVEFUU19FWFRfSk9JTl9NQ1YgKi8KKwlraW5kc1swXSA9IENo YXJHZXREYXR1bShTVEFUU19FWFRfSk9JTl9NQ1YpOworCXN0eGtpbmQgPSBjb25zdHJ1Y3RfYXJy YXlfYnVpbHRpbihraW5kcywgMSwgQ0hBUk9JRCk7CisJdmFsdWVzW0FudW1fcGdfc3RhdGlzdGlj X2V4dF9zdHhraW5kIC0gMV0gPSBQb2ludGVyR2V0RGF0dW0oc3R4a2luZCk7CisKKwkvKiBzdHhz dGF0dGFyZ2V0IGlzIE5VTEwgKHVzZSBkZWZhdWx0KSAqLworCW51bGxzW0FudW1fcGdfc3RhdGlz dGljX2V4dF9zdHhzdGF0dGFyZ2V0IC0gMV0gPSB0cnVlOworCisJLyogc3R4ZXhwcnMgaXMgTlVM TCAobm8gZXhwcmVzc2lvbnMpICovCisJbnVsbHNbQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eGV4 cHJzIC0gMV0gPSB0cnVlOworCisJLyogc3R4b3RoZXJyZWwgLSB0aGUgcmVmZXJlbmNlZC9vcnRo ZXIgdGFibGUgKi8KKwl2YWx1ZXNbQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eG90aGVycmVsIC0g MV0gPSBPYmplY3RJZEdldERhdHVtKHJlZmVyZW5jZWRfcmVsKTsKKworCS8qIHN0eGpvaW5rZXlz IC0gam9pbiBjb2x1bW4gcGFpcnM6IFtyZWZlcmVuY2luZ19hdHRyLCByZWZlcmVuY2VkX2F0dHJd ICovCisJam9pbmtleXNbMF0gPSByZWZlcmVuY2luZ19hdHRyOworCWpvaW5rZXlzWzFdID0gcmVm ZXJlbmNlZF9hdHRyOworCWprID0gYnVpbGRpbnQydmVjdG9yKGpvaW5rZXlzLCAyKTsKKwl2YWx1 ZXNbQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eGpvaW5rZXlzIC0gMV0gPSBQb2ludGVyR2V0RGF0 dW0oamspOworCisJLyogSW5zZXJ0IHRoZSB0dXBsZSAqLworCWh0dXAgPSBoZWFwX2Zvcm1fdHVw bGUoUmVsYXRpb25HZXREZXNjcihwZ19zdGV4dCksIHZhbHVlcywgbnVsbHMpOworCUNhdGFsb2dU dXBsZUluc2VydChwZ19zdGV4dCwgaHR1cCk7CisJaGVhcF9mcmVldHVwbGUoaHR1cCk7CisKKwkv KgorCSAqIEFkZCBkZXBlbmRlbmNpZXMgb24gY29sdW1ucyB1c2VkIGluIHRoZSBzdGF0cywgc28g dGhhdCB0aGUgc3RhdHMgb2JqZWN0CisJICogZ29lcyBhd2F5IGlmIGFueSBvciBhbGwgb2YgdGhl bSBnZXQgZHJvcHBlZC4KKwkgKi8KKwlPYmplY3RBZGRyZXNzU2V0KG15c2VsZiwgU3RhdGlzdGlj RXh0UmVsYXRpb25JZCwgc3RhdF9vaWQpOworCisJLyogRGVwZW5kZW5jeSBvbiBmaWx0ZXIgY29s dW1uIChmcm9tIHJlZmVyZW5jZWQgdGFibGUpICovCisJT2JqZWN0QWRkcmVzc1N1YlNldChwYXJl bnRvYmplY3QsIFJlbGF0aW9uUmVsYXRpb25JZCwKKwkJCQkJCXJlZmVyZW5jZWRfcmVsLCBmaWx0 ZXJfYXR0cik7CisJcmVjb3JkRGVwZW5kZW5jeU9uKCZteXNlbGYsICZwYXJlbnRvYmplY3QsIERF UEVOREVOQ1lfQVVUTyk7CisKKwkvKiBEZXBlbmRlbmNpZXMgb24gam9pbiBjb2x1bW5zIGZyb20g Ym90aCB0YWJsZXMgKi8KKwlPYmplY3RBZGRyZXNzU3ViU2V0KHBhcmVudG9iamVjdCwgUmVsYXRp b25SZWxhdGlvbklkLAorCQkJCQkJcmVmZXJlbmNpbmdfcmVsLCByZWZlcmVuY2luZ19hdHRyKTsK KwlyZWNvcmREZXBlbmRlbmN5T24oJm15c2VsZiwgJnBhcmVudG9iamVjdCwgREVQRU5ERU5DWV9B VVRPKTsKKworCU9iamVjdEFkZHJlc3NTdWJTZXQocGFyZW50b2JqZWN0LCBSZWxhdGlvblJlbGF0 aW9uSWQsCisJCQkJCQlyZWZlcmVuY2VkX3JlbCwgcmVmZXJlbmNlZF9hdHRyKTsKKwlyZWNvcmRE ZXBlbmRlbmN5T24oJm15c2VsZiwgJnBhcmVudG9iamVjdCwgREVQRU5ERU5DWV9BVVRPKTsKKwor CS8qCisJICogQWxzbyBhZGQgZGVwZW5kZW5jaWVzIG9uIG5hbWVzcGFjZSBhbmQgb3duZXIuICBU aGVzZSBhcmUgcmVxdWlyZWQKKwkgKiBiZWNhdXNlIHRoZSBzdGF0cyBvYmplY3QgbWlnaHQgaGF2 ZSBhIGRpZmZlcmVudCBuYW1lc3BhY2UgYW5kL29yIG93bmVyCisJICogdGhhbiB0aGUgdW5kZXJs eWluZyB0YWJsZShzKS4KKwkgKi8KKwlPYmplY3RBZGRyZXNzU2V0KHBhcmVudG9iamVjdCwgTmFt ZXNwYWNlUmVsYXRpb25JZCwKKwkJCQkJIGdldF9yZWxfbmFtZXNwYWNlKHJlZmVyZW5jaW5nX3Jl bCkpOworCXJlY29yZERlcGVuZGVuY3lPbigmbXlzZWxmLCAmcGFyZW50b2JqZWN0LCBERVBFTkRF TkNZX05PUk1BTCk7CisKKwlyZWNvcmREZXBlbmRlbmN5T25Pd25lcihTdGF0aXN0aWNFeHRSZWxh dGlvbklkLCBzdGF0X29pZCwgc3R4b3duZXIpOworCisJcmV0dXJuIHN0YXRfb2lkOworfQpkaWZm IC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5o IGIvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oCmluZGV4 IDk4MmQxYmFiYWE4Li42YTk2NjhiMTNlYyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RhdGlz dGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0YXRpc3Rp Y3MvZXh0ZW5kZWRfc3RhdHNfaW50ZXJuYWwuaApAQCAtNjgsNiArNjgsMTcgQEAgdHlwZWRlZiBz dHJ1Y3QgU3RhdHNCdWlsZERhdGEKIAlib29sCSAgKipudWxsczsKIH0gU3RhdHNCdWlsZERhdGE7 CiAKKy8qIGNhbmRpZGF0ZSBmb3IgaW1wbGljaXQgZm9yZWlnbiBrZXkgam9pbiBNQ1Ygc3RhdGlz dGljcyBjb2xsZWN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBGS0pvaW5TdGF0c0NhbmRpZGF0ZQor eworCU9pZAkJCXJlZmVyZW5jaW5nX3JlbDsKKwlBdHRyTnVtYmVyCXJlZmVyZW5jaW5nX2F0dHI7 CS8qIEZLIGNvbHVtbiBpbiByZWZlcmVuY2luZyB0YWJsZSAqLworCU9pZAkJCXJlZmVyZW5jZWRf cmVsOworCUF0dHJOdW1iZXIJcmVmZXJlbmNlZF9hdHRyOwkvKiBQSyBjb2x1bW4gaW4gcmVmZXJl bmNlZCB0YWJsZSAqLworCUF0dHJOdW1iZXIJZmlsdGVyX2F0dHI7CS8qIGZpbHRlciBjb2x1bW4g aW4gcmVmZXJlbmNlZCB0YWJsZQorCQkJCQkJCQkgKiAoZGVwZW5kZW50IG9uIHJlZmVyZW5jZWRf YXR0cikgKi8KK30JCQlGS0pvaW5TdGF0c0NhbmRpZGF0ZTsKKwogZXh0ZXJuIE1WTkRpc3RpbmN0 ICpzdGF0ZXh0X25kaXN0aW5jdF9idWlsZChkb3VibGUgdG90YWxyb3dzLCBTdGF0c0J1aWxkRGF0 YSAqZGF0YSk7CiBleHRlcm4gYnl0ZWEgKnN0YXRleHRfbmRpc3RpbmN0X3NlcmlhbGl6ZShNVk5E aXN0aW5jdCAqbmRpc3RpbmN0KTsKIGV4dGVybiBNVk5EaXN0aW5jdCAqc3RhdGV4dF9uZGlzdGlu Y3RfZGVzZXJpYWxpemUoYnl0ZWEgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9zdGF0c19leHRfY3Jvc3NyZWwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9zdGF0c19leHRfY3Jvc3NyZWwub3V0CmluZGV4IGQ0MWRkMzdkYjNmLi4yYmU0NmM4N2Ex NiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHRfY3Jvc3Ny ZWwub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfZXh0X2Nyb3NzcmVs Lm91dApAQCAtMjgzLDYgKzI4MywyNTUgQEAgQ1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0YXRzNSAo bWN2KSBPTiBsb3dlcihrLmtleXdvcmQpIEZST00gbW92aWVfa2V5d29yZHMyIG1rIEoKIEVSUk9S OiAgZXhwcmVzc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gam9pbiBzdGF0aXN0aWNzCiBDUkVB VEUgU1RBVElTVElDUyBiYWRfc3RhdHM2IChtY3YpIE9OIGsua2V5d29yZCBGUk9NIChtb3ZpZV9r ZXl3b3JkczIgbWsgSk9JTiBrZXl3b3JkczIgayBPTiAobWsua2V5d29yZF9pZCA9IGsuaWQpKSBK T0lOIGtleXdvcmRzMiBrMiBPTiAoay5pZCA9IGsyLmlkKTsKIEVSUk9SOiAgZXh0ZW5kZWQgam9p biBzdGF0aXN0aWNzIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgc2ltcGxlIHR3by10YWJsZSBqb2lu cworLS0KKy0tIFRlc3QgYXV0b21hdGljIGNvbGxlY3Rpb24gb2Ygam9pbiBNQ1Ygc3RhdGlzdGlj cyBmb3IgRksgam9pbnMKKy0tIHdpdGggZnVuY3Rpb25hbCBkZXBlbmRlbmNpZXMuCistLQorQ1JF QVRFIFRBQkxFIGtleXdvcmRzICgKKyAgICBpZCBJTlRFR0VSIFBSSU1BUlkgS0VZLAorICAgIGtl eXdvcmQgVEVYVCBOT1QgTlVMTCwKKyAgICBwaG9uZXRpY19jb2RlIGNoYXJhY3RlciB2YXJ5aW5n KDUpCispOworQ1JFQVRFIFRBQkxFIG1vdmllX2tleXdvcmRzICgKKyAgICBtb3ZpZV9pZCBJTlRF R0VSIFBSSU1BUlkgS0VZLAorICAgIGtleXdvcmRfaWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVO Q0VTIGtleXdvcmRzKGlkKQorKTsKKy0tIEluc2VydCB0aWdodGx5IGNvcnJlbGF0ZWQgZGF0YSBp bnRvIHRoZSAicmVmZXJlbmNlZCIgdGFibGUKK0lOU0VSVCBJTlRPIGtleXdvcmRzIChpZCwga2V5 d29yZCwgcGhvbmV0aWNfY29kZSkKK1NFTEVDVAorICAgIGksCisgICAgJ2tleXdvcmRfJyB8fCBp LAorICAgICdwaF8nIHx8IGkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDUwKSBpOworLS0gSW5z ZXJ0IGRhdGEgaW50byB0aGUgcmVmZXJlbmNpbmcgdGFibGUgd2l0aCBza2V3ZWQgZGlzdHJpYnV0 aW9uCitJTlNFUlQgSU5UTyBtb3ZpZV9rZXl3b3JkcyAobW92aWVfaWQsIGtleXdvcmRfaWQpCitT RUxFQ1QKKyAgICBpLAorICAgIENBU0UKKyAgICAgICAgV0hFTiBpICUgMTAwIDwgNjAgVEhFTiAo aSAlIDEwKSArIDEgICAgICAtLSA2MCUga2V5d29yZF9pZHMgMS0xMCAoNiUgZnJlcXVlbmN5IHBl ciBrZXl3b3JkKQorICAgICAgICBXSEVOIGkgJSAxMDAgPCA5MCBUSEVOIChpICUgMTApICsgMTEg ICAgIC0tIDMwJSBrZXl3b3JkX2lkcyAxMS0yMCAoMyUgZnJlcXVlbmN5IHBlciBrZXl3b3JkKQor ICAgICAgICBFTFNFIChpICUgMTApICsgMjEgICAgICAgICAgICAgICAgICAgICAgIC0tIDEwJSBr ZXl3b3JkX2lkcyAyMS0zMCAoMSUgZnJlcXVlbmN5IHBlciBrZXl3b3JkKQorICAgICAgICBFTkQK K0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDAwKSBpOworLS0gQ3JlYXRlIGZ1bmN0aW9uYWwg ZGVwZW5kZW5jeSBzdGF0aXN0aWNzIG9uIHRoZSByZWZlcmVuY2VkIHRhYmxlCitDUkVBVEUgU1RB VElTVElDUyBrZXl3b3Jkc19kZXBzX3N0YXQgKGRlcGVuZGVuY2llcykgT04gaWQsIGtleXdvcmQs IHBob25ldGljX2NvZGUgRlJPTSBrZXl3b3JkczsKK0FOQUxZWkUga2V5d29yZHM7CistLSBBbmFs eXplIHRoZSByZWZlcmVuY2luZyB0YWJsZSB0byB0cmlnZ2VyIGpvaW4gTUNWIGNvbGxlY3Rpb24K K0FOQUxZWkUgbW92aWVfa2V5d29yZHM7CistLSBTaG93IHRoZSBqb2luIHN0YXRpc3RpY3MKK1NF TEVDVCBzLnN0eHJlbGlkOjpyZWdjbGFzcywKKyAgICAgICBzLnN0eG90aGVycmVsOjpyZWdjbGFz cywKKyAgICAgICBzLnN0eGpvaW5rZXlzLAorICAgICAgIHMuc3R4a2V5cywKKyAgICAgICBzLnN0 eGtpbmQsCisgICAgICAgcy5zdHhzdGF0dGFyZ2V0LAorICAgICAgIHMuc3R4ZXhwcnMKK0ZST00g cGdfc3RhdGlzdGljX2V4dCBzCitXSEVSRSBzLnN0eHJlbGlkID0gJ21vdmllX2tleXdvcmRzJzo6 cmVnY2xhc3MKK09SREVSIEJZIHMub2lkOworICAgIHN0eHJlbGlkICAgIHwgc3R4b3RoZXJyZWwg fCBzdHhqb2lua2V5cyB8IHN0eGtleXMgfCBzdHhraW5kIHwgc3R4c3RhdHRhcmdldCB8IHN0eGV4 cHJzIAorLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0t LS0tKy0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorIG1vdmllX2tleXdvcmRz IHwga2V5d29yZHMgICAgfCAyIDEgICAgICAgICB8IDIgICAgICAgfCB7Y30gICAgIHwgICAgICAg ICAgICAgICB8IAorIG1vdmllX2tleXdvcmRzIHwga2V5d29yZHMgICAgfCAyIDEgICAgICAgICB8 IDMgICAgICAgfCB7Y30gICAgIHwgICAgICAgICAgICAgICB8IAorKDIgcm93cykKKworLS0gTm90 ZTogdGhlIE1DViBsaXN0IGl0ZW1zIG9ubHkgc3RvcmUgdGhlIGZpbHRlciB2YWx1ZXMgKGpvaW4g dmFsdWVzIGFyZSBpbXBsaWNpdCkKK1NFTEVDVCBtLmluZGV4LAorICAgICAgIG0udmFsdWVzLAor ICAgICAgIG0ubnVsbHMsCisgICAgICAgUk9VTkQobS5mcmVxdWVuY3k6Om51bWVyaWMsIDIpIEFT IGZyZXF1ZW5jeQorRlJPTSBwZ19zdGF0aXN0aWNfZXh0IHMKKyAgICAgICAgIEpPSU4gcGdfc3Rh dGlzdGljX2V4dF9kYXRhIGQgT04gKHMub2lkID0gZC5zdHhvaWQpCisgICAgICAgICBDUk9TUyBK T0lOIExBVEVSQUwgcGdfam9pbl9tY3ZfbGlzdF9pdGVtcyhkLnN0eGRqb2lubWN2KSBBUyBtCitX SEVSRSBzLnN0eHJlbGlkID0gJ21vdmllX2tleXdvcmRzJzo6cmVnY2xhc3MKKyAgQU5EICdjJyA9 IEFOWShzLnN0eGtpbmQpCitPUkRFUiBCWSBzLnN0eG5hbWUsIG0uaW5kZXg7CisgaW5kZXggfCAg ICB2YWx1ZXMgICAgfCBudWxscyB8IGZyZXF1ZW5jeSAKKy0tLS0tLS0rLS0tLS0tLS0tLS0tLS0r LS0tLS0tLSstLS0tLS0tLS0tLQorICAgICAwIHwge2tleXdvcmRfMX0gIHwge2Z9ICAgfCAgICAg IDAuMDYKKyAgICAgMSB8IHtrZXl3b3JkXzJ9ICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDIg fCB7a2V5d29yZF8zfSAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICAzIHwge2tleXdvcmRfNH0g IHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAgNCB8IHtrZXl3b3JkXzV9ICB8IHtmfSAgIHwgICAg ICAwLjA2CisgICAgIDUgfCB7a2V5d29yZF82fSAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICA2 IHwge2tleXdvcmRfN30gIHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAgNyB8IHtrZXl3b3JkXzh9 ICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDggfCB7a2V5d29yZF85fSAgfCB7Zn0gICB8ICAg ICAgMC4wNgorICAgICA5IHwge2tleXdvcmRfMTB9IHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAx MCB8IHtrZXl3b3JkXzExfSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMTEgfCB7a2V5d29yZF8x Mn0gfCB7Zn0gICB8ICAgICAgMC4wMworICAgIDEyIHwge2tleXdvcmRfMTN9IHwge2Z9ICAgfCAg ICAgIDAuMDMKKyAgICAxMyB8IHtrZXl3b3JkXzE0fSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAg MTQgfCB7a2V5d29yZF8xNX0gfCB7Zn0gICB8ICAgICAgMC4wMworICAgIDE1IHwge2tleXdvcmRf MTZ9IHwge2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxNiB8IHtrZXl3b3JkXzE3fSB8IHtmfSAgIHwg ICAgICAwLjAzCisgICAgMTcgfCB7a2V5d29yZF8xOH0gfCB7Zn0gICB8ICAgICAgMC4wMworICAg IDE4IHwge2tleXdvcmRfMTl9IHwge2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxOSB8IHtrZXl3b3Jk XzIwfSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMjAgfCB7a2V5d29yZF8yMX0gfCB7Zn0gICB8 ICAgICAgMC4wMQorICAgIDIxIHwge2tleXdvcmRfMjJ9IHwge2Z9ICAgfCAgICAgIDAuMDEKKyAg ICAyMiB8IHtrZXl3b3JkXzIzfSB8IHtmfSAgIHwgICAgICAwLjAxCisgICAgMjMgfCB7a2V5d29y ZF8yNH0gfCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDI0IHwge2tleXdvcmRfMjV9IHwge2Z9ICAg fCAgICAgIDAuMDEKKyAgICAyNSB8IHtrZXl3b3JkXzI2fSB8IHtmfSAgIHwgICAgICAwLjAxCisg ICAgMjYgfCB7a2V5d29yZF8yN30gfCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDI3IHwge2tleXdv cmRfMjh9IHwge2Z9ICAgfCAgICAgIDAuMDEKKyAgICAyOCB8IHtrZXl3b3JkXzI5fSB8IHtmfSAg IHwgICAgICAwLjAxCisgICAgMjkgfCB7a2V5d29yZF8zMH0gfCB7Zn0gICB8ICAgICAgMC4wMQor ICAgICAwIHwge3BoXzF9ICAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAgMSB8IHtwaF8y fSAgICAgICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDIgfCB7cGhfM30gICAgICAgfCB7Zn0g ICB8ICAgICAgMC4wNgorICAgICAzIHwge3BoXzR9ICAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDYK KyAgICAgNCB8IHtwaF81fSAgICAgICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDUgfCB7cGhf Nn0gICAgICAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICA2IHwge3BoXzd9ICAgICAgIHwge2Z9 ICAgfCAgICAgIDAuMDYKKyAgICAgNyB8IHtwaF84fSAgICAgICB8IHtmfSAgIHwgICAgICAwLjA2 CisgICAgIDggfCB7cGhfOX0gICAgICAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICA5IHwge3Bo XzEwfSAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAxMCB8IHtwaF8xMX0gICAgICB8IHtm fSAgIHwgICAgICAwLjAzCisgICAgMTEgfCB7cGhfMTJ9ICAgICAgfCB7Zn0gICB8ICAgICAgMC4w MworICAgIDEyIHwge3BoXzEzfSAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxMyB8IHtw aF8xNH0gICAgICB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMTQgfCB7cGhfMTV9ICAgICAgfCB7 Zn0gICB8ICAgICAgMC4wMworICAgIDE1IHwge3BoXzE2fSAgICAgIHwge2Z9ICAgfCAgICAgIDAu MDMKKyAgICAxNiB8IHtwaF8xN30gICAgICB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMTcgfCB7 cGhfMTh9ICAgICAgfCB7Zn0gICB8ICAgICAgMC4wMworICAgIDE4IHwge3BoXzE5fSAgICAgIHwg e2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxOSB8IHtwaF8yMH0gICAgICB8IHtmfSAgIHwgICAgICAw LjAzCisgICAgMjAgfCB7cGhfMjF9ICAgICAgfCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDIxIHwg e3BoXzIyfSAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDEKKyAgICAyMiB8IHtwaF8yM30gICAgICB8 IHtmfSAgIHwgICAgICAwLjAxCisgICAgMjMgfCB7cGhfMjR9ICAgICAgfCB7Zn0gICB8ICAgICAg MC4wMQorICAgIDI0IHwge3BoXzI1fSAgICAgIHwge2Z9ICAgfCAgICAgIDAuMDEKKyAgICAyNSB8 IHtwaF8yNn0gICAgICB8IHtmfSAgIHwgICAgICAwLjAxCisgICAgMjYgfCB7cGhfMjd9ICAgICAg fCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDI3IHwge3BoXzI4fSAgICAgIHwge2Z9ICAgfCAgICAg IDAuMDEKKyAgICAyOCB8IHtwaF8yOX0gICAgICB8IHtmfSAgIHwgICAgICAwLjAxCisgICAgMjkg fCB7cGhfMzB9ICAgICAgfCB7Zn0gICB8ICAgICAgMC4wMQorKDYwIHJvd3MpCisKKy0tIEVuc3Vy ZSB0aGUgam9pbiBNQ1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBmb3Igc2luZ2xlIGVxdWFsaXR5IHBy ZWRpY2F0ZXMKKy0tIG9uIHRoZSBmaWx0ZXIgY29sdW1uIG9mIHRoZSByZWZlcmVuY2VkIHRhYmxl CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9N IG1vdmllX2tleXdvcmRzIG1rLCBrZXl3b3JkcyBrCisgICAgV0hFUkUgay5rZXl3b3JkID0gJydr ZXl3b3JkXzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGltYXRlZCB8IGFj dHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgNjAwIHwgICAgNjAwCisoMSByb3cp CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZS T00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLmtleXdvcmQgPSAn J2tleXdvcmRfMTUnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGltYXRlZCB8 IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgMzAwIHwgICAgMzAwCisoMSBy b3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAq IEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLmtleXdvcmQg PSAnJ2tleXdvcmRfMjUnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGltYXRl ZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgMTAwIHwgICAgMTAwCiso MSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVD VCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLnBob25l dGljX2NvZGUgPSAnJ3BoXzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGlt YXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgNjAwIHwgICAgNjAw CisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNF TEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLnBo b25ldGljX2NvZGUgPSAnJ3BoXzE1JycgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKyBl c3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgIDMwMCB8ICAg IDMwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAg ICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzIG1rLCBrZXl3b3JkcyBrCisgICAgV0hFUkUg ay5waG9uZXRpY19jb2RlID0gJydwaF8yNScnIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7 CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAxMDAg fCAgICAxMDAKKygxIHJvdykKKworLS0gTm8gZmlsdGVyIG9uIHJlZmVyZW5jZWQgdGFibGUsIHNo b3VsZCBub3QgdXNlIGpvaW4gc3RhdHMKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jv d3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAg ICBXSEVSRSBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAor LS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgMTAwMDAgfCAgMTAwMDAKKygxIHJvdykKKworLS0g T1IgUHJlZGljYXRlcyAoY3VycmVudGx5IE5PVCBzdXBwb3J0ZWQgYnkgam9pbiBNQ1Ygc3RhdHMp CistLSBFeHBlY3RlZDogV2lsbCBsaWtlbHkgdW5kZXJlc3RpbWF0ZQorU0VMRUNUICogRlJPTSBj aGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3b3JkcyBt aywga2V5d29yZHMgaworICAgIFdIRVJFIChrLmtleXdvcmQgPSAnJ2tleXdvcmRfMScnIE9SIGsu a2V5d29yZCA9ICcna2V5d29yZF8yJycpCisgICAgICBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQK KycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAg NDAwIHwgICAxMjAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jv d3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAg ICBXSEVSRSAoay5rZXl3b3JkID0gJydrZXl3b3JkXzEnJyBPUiBrLmtleXdvcmQgPSAnJ2tleXdv cmRfMTUnJykKKyAgICAgIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisgZXN0aW1hdGVk IHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICA0MDAgfCAgICA5MDAKKygx IHJvdykKKworLS0gRW5zdXJlIHRoZSBqb2luIE1DViBzdGF0aXN0aWNzIGFyZSB1c2VkIGZvciBJ TiBwcmVkaWNhdGVzCistLSBvbiB0aGUgZmlsdGVyIGNvbHVtbiBvZiB0aGUgcmVmZXJlbmNlZCB0 YWJsZQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICog RlJPTSBtb3ZpZV9rZXl3b3JkcyBtaywga2V5d29yZHMgaworICAgIFdIRVJFIGsua2V5d29yZCBJ TiAoJydrZXl3b3JkXzEnJywgJydrZXl3b3JkXzInJywgJydrZXl3b3JkXzMnJykKKyAgICAgIEFO RCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0t LS0tLS0rLS0tLS0tLS0KKyAgICAgIDE4MDAgfCAgIDE4MDAKKygxIHJvdykKKworU0VMRUNUICog RlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3 b3JkcyBtaywga2V5d29yZHMgaworICAgIFdIRVJFIGsua2V5d29yZCBJTiAoJydrZXl3b3JkXzEn JywgJydrZXl3b3JkXzE1JycsICcna2V5d29yZF8yNScnKQorICAgICAgQU5EIGsuaWQgPSBtay5r ZXl3b3JkX2lkCisnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0t LQorICAgICAgMTAwMCB8ICAgMTAwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2Vz dGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzIG1rLCBrZXl3 b3JkcyBrCisgICAgV0hFUkUgay5waG9uZXRpY19jb2RlIElOICgnJ3BoXzEnJywgJydwaF8xNScn KQorICAgICAgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1 YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAgIDkwMCB8ICAgIDkwMAorKDEgcm93KQor CiAtLSBDbGVhbnVwCiBEUk9QIFRBQkxFIG1vdmllX2tleXdvcmRzMiBDQVNDQURFOwogRFJPUCBU QUJMRSBrZXl3b3JkczIgQ0FTQ0FERTsKK0RST1AgVEFCTEUgbW92aWVfa2V5d29yZHMgQ0FTQ0FE RTsKK0RST1AgVEFCTEUga2V5d29yZHMgQ0FTQ0FERTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3N0YXRzX2V4dF9jcm9zc3JlbC5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dGF0c19leHRfY3Jvc3NyZWwuc3FsCmluZGV4IGI3NzFhMzBmMzRkLi40YmE5YTlhOTI2YyAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNfZXh0X2Nyb3NzcmVsLnNxbAorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdGF0c19leHRfY3Jvc3NyZWwuc3FsCkBAIC0xNjcsNiAr MTY3LDE0NiBAQCBDUkVBVEUgU1RBVElTVElDUyBiYWRfc3RhdHM0IChtY3YpIE9OIGtleXdvcmQg RlJPTSBtb3ZpZV9rZXl3b3JkczIgbWsgSk9JTiBrZXl3bwogQ1JFQVRFIFNUQVRJU1RJQ1MgYmFk X3N0YXRzNSAobWN2KSBPTiBsb3dlcihrLmtleXdvcmQpIEZST00gbW92aWVfa2V5d29yZHMyIG1r IEpPSU4ga2V5d29yZHMyIGsgT04gKG1rLmtleXdvcmRfaWQgPSBrLmlkKTsKIENSRUFURSBTVEFU SVNUSUNTIGJhZF9zdGF0czYgKG1jdikgT04gay5rZXl3b3JkIEZST00gKG1vdmllX2tleXdvcmRz MiBtayBKT0lOIGtleXdvcmRzMiBrIE9OIChtay5rZXl3b3JkX2lkID0gay5pZCkpIEpPSU4ga2V5 d29yZHMyIGsyIE9OIChrLmlkID0gazIuaWQpOwogCistLQorLS0gVGVzdCBhdXRvbWF0aWMgY29s bGVjdGlvbiBvZiBqb2luIE1DViBzdGF0aXN0aWNzIGZvciBGSyBqb2lucworLS0gd2l0aCBmdW5j dGlvbmFsIGRlcGVuZGVuY2llcy4KKy0tCisKK0NSRUFURSBUQUJMRSBrZXl3b3JkcyAoCisgICAg aWQgSU5URUdFUiBQUklNQVJZIEtFWSwKKyAgICBrZXl3b3JkIFRFWFQgTk9UIE5VTEwsCisgICAg cGhvbmV0aWNfY29kZSBjaGFyYWN0ZXIgdmFyeWluZyg1KQorKTsKKworQ1JFQVRFIFRBQkxFIG1v dmllX2tleXdvcmRzICgKKyAgICBtb3ZpZV9pZCBJTlRFR0VSIFBSSU1BUlkgS0VZLAorICAgIGtl eXdvcmRfaWQgSU5URUdFUiBOT1QgTlVMTCBSRUZFUkVOQ0VTIGtleXdvcmRzKGlkKQorKTsKKwor LS0gSW5zZXJ0IHRpZ2h0bHkgY29ycmVsYXRlZCBkYXRhIGludG8gdGhlICJyZWZlcmVuY2VkIiB0 YWJsZQorSU5TRVJUIElOVE8ga2V5d29yZHMgKGlkLCBrZXl3b3JkLCBwaG9uZXRpY19jb2RlKQor U0VMRUNUCisgICAgaSwKKyAgICAna2V5d29yZF8nIHx8IGksCisgICAgJ3BoXycgfHwgaQorRlJP TSBnZW5lcmF0ZV9zZXJpZXMoMSwgNTApIGk7CisKKy0tIEluc2VydCBkYXRhIGludG8gdGhlIHJl ZmVyZW5jaW5nIHRhYmxlIHdpdGggc2tld2VkIGRpc3RyaWJ1dGlvbgorSU5TRVJUIElOVE8gbW92 aWVfa2V5d29yZHMgKG1vdmllX2lkLCBrZXl3b3JkX2lkKQorU0VMRUNUCisgICAgaSwKKyAgICBD QVNFCisgICAgICAgIFdIRU4gaSAlIDEwMCA8IDYwIFRIRU4gKGkgJSAxMCkgKyAxICAgICAgLS0g NjAlIGtleXdvcmRfaWRzIDEtMTAgKDYlIGZyZXF1ZW5jeSBwZXIga2V5d29yZCkKKyAgICAgICAg V0hFTiBpICUgMTAwIDwgOTAgVEhFTiAoaSAlIDEwKSArIDExICAgICAtLSAzMCUga2V5d29yZF9p ZHMgMTEtMjAgKDMlIGZyZXF1ZW5jeSBwZXIga2V5d29yZCkKKyAgICAgICAgRUxTRSAoaSAlIDEw KSArIDIxICAgICAgICAgICAgICAgICAgICAgICAtLSAxMCUga2V5d29yZF9pZHMgMjEtMzAgKDEl IGZyZXF1ZW5jeSBwZXIga2V5d29yZCkKKyAgICAgICAgRU5ECitGUk9NIGdlbmVyYXRlX3Nlcmll cygxLCAxMDAwMCkgaTsKKworLS0gQ3JlYXRlIGZ1bmN0aW9uYWwgZGVwZW5kZW5jeSBzdGF0aXN0 aWNzIG9uIHRoZSByZWZlcmVuY2VkIHRhYmxlCitDUkVBVEUgU1RBVElTVElDUyBrZXl3b3Jkc19k ZXBzX3N0YXQgKGRlcGVuZGVuY2llcykgT04gaWQsIGtleXdvcmQsIHBob25ldGljX2NvZGUgRlJP TSBrZXl3b3JkczsKK0FOQUxZWkUga2V5d29yZHM7CisKKy0tIEFuYWx5emUgdGhlIHJlZmVyZW5j aW5nIHRhYmxlIHRvIHRyaWdnZXIgam9pbiBNQ1YgY29sbGVjdGlvbgorQU5BTFlaRSBtb3ZpZV9r ZXl3b3JkczsKKworLS0gU2hvdyB0aGUgam9pbiBzdGF0aXN0aWNzCitTRUxFQ1Qgcy5zdHhyZWxp ZDo6cmVnY2xhc3MsCisgICAgICAgcy5zdHhvdGhlcnJlbDo6cmVnY2xhc3MsCisgICAgICAgcy5z dHhqb2lua2V5cywKKyAgICAgICBzLnN0eGtleXMsCisgICAgICAgcy5zdHhraW5kLAorICAgICAg IHMuc3R4c3RhdHRhcmdldCwKKyAgICAgICBzLnN0eGV4cHJzCitGUk9NIHBnX3N0YXRpc3RpY19l eHQgcworV0hFUkUgcy5zdHhyZWxpZCA9ICdtb3ZpZV9rZXl3b3Jkcyc6OnJlZ2NsYXNzCitPUkRF UiBCWSBzLm9pZDsKKworLS0gTm90ZTogdGhlIE1DViBsaXN0IGl0ZW1zIG9ubHkgc3RvcmUgdGhl IGZpbHRlciB2YWx1ZXMgKGpvaW4gdmFsdWVzIGFyZSBpbXBsaWNpdCkKK1NFTEVDVCBtLmluZGV4 LAorICAgICAgIG0udmFsdWVzLAorICAgICAgIG0ubnVsbHMsCisgICAgICAgUk9VTkQobS5mcmVx dWVuY3k6Om51bWVyaWMsIDIpIEFTIGZyZXF1ZW5jeQorRlJPTSBwZ19zdGF0aXN0aWNfZXh0IHMK KyAgICAgICAgIEpPSU4gcGdfc3RhdGlzdGljX2V4dF9kYXRhIGQgT04gKHMub2lkID0gZC5zdHhv aWQpCisgICAgICAgICBDUk9TUyBKT0lOIExBVEVSQUwgcGdfam9pbl9tY3ZfbGlzdF9pdGVtcyhk LnN0eGRqb2lubWN2KSBBUyBtCitXSEVSRSBzLnN0eHJlbGlkID0gJ21vdmllX2tleXdvcmRzJzo6 cmVnY2xhc3MKKyAgQU5EICdjJyA9IEFOWShzLnN0eGtpbmQpCitPUkRFUiBCWSBzLnN0eG5hbWUs IG0uaW5kZXg7CisKKy0tIEVuc3VyZSB0aGUgam9pbiBNQ1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBm b3Igc2luZ2xlIGVxdWFsaXR5IHByZWRpY2F0ZXMKKy0tIG9uIHRoZSBmaWx0ZXIgY29sdW1uIG9m IHRoZSByZWZlcmVuY2VkIHRhYmxlCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzIG1rLCBrZXl3b3JkcyBrCisgICAg V0hFUkUgay5rZXl3b3JkID0gJydrZXl3b3JkXzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQK KycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1Qg KiBGUk9NIG1vdmllX2tleXdvcmRzIG1rLCBrZXl3b3JkcyBrCisgICAgV0hFUkUgay5rZXl3b3Jk ID0gJydrZXl3b3JkXzE1JycgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKworU0VMRUNU ICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9r ZXl3b3JkcyBtaywga2V5d29yZHMgaworICAgIFdIRVJFIGsua2V5d29yZCA9ICcna2V5d29yZF8y NScnIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisKK1NFTEVDVCAqIEZST00gY2hlY2tf ZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtl eXdvcmRzIGsKKyAgICBXSEVSRSBrLnBob25ldGljX2NvZGUgPSAnJ3BoXzEnJyBBTkQgay5pZCA9 IG1rLmtleXdvcmRfaWQKKycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dz KCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzIG1rLCBrZXl3b3JkcyBrCisgICAg V0hFUkUgay5waG9uZXRpY19jb2RlID0gJydwaF8xNScnIEFORCBrLmlkID0gbWsua2V5d29yZF9p ZAorJyk7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVD VCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLnBob25l dGljX2NvZGUgPSAnJ3BoXzI1JycgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKworLS0g Tm8gZmlsdGVyIG9uIHJlZmVyZW5jZWQgdGFibGUsIHNob3VsZCBub3QgdXNlIGpvaW4gc3RhdHMK K1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00g bW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLmlkID0gbWsua2V5d29y ZF9pZAorJyk7CisKKy0tIE9SIFByZWRpY2F0ZXMgKGN1cnJlbnRseSBOT1Qgc3VwcG9ydGVkIGJ5 IGpvaW4gTUNWIHN0YXRzKQorLS0gRXhwZWN0ZWQ6IFdpbGwgbGlrZWx5IHVuZGVyZXN0aW1hdGUK K1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00g bW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSAoay5rZXl3b3JkID0gJydr ZXl3b3JkXzEnJyBPUiBrLmtleXdvcmQgPSAnJ2tleXdvcmRfMicnKQorICAgICAgQU5EIGsuaWQg PSBtay5rZXl3b3JkX2lkCisnKTsKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93 cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3b3JkcyBtaywga2V5d29yZHMgaworICAg IFdIRVJFIChrLmtleXdvcmQgPSAnJ2tleXdvcmRfMScnIE9SIGsua2V5d29yZCA9ICcna2V5d29y ZF8xNScnKQorICAgICAgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKworLS0gRW5zdXJl IHRoZSBqb2luIE1DViBzdGF0aXN0aWNzIGFyZSB1c2VkIGZvciBJTiBwcmVkaWNhdGVzCistLSBv biB0aGUgZmlsdGVyIGNvbHVtbiBvZiB0aGUgcmVmZXJlbmNlZCB0YWJsZQorU0VMRUNUICogRlJP TSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3b3Jk cyBtaywga2V5d29yZHMgaworICAgIFdIRVJFIGsua2V5d29yZCBJTiAoJydrZXl3b3JkXzEnJywg JydrZXl3b3JkXzInJywgJydrZXl3b3JkXzMnJykKKyAgICAgIEFORCBrLmlkID0gbWsua2V5d29y ZF9pZAorJyk7CisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNF TEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWssIGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLmtl eXdvcmQgSU4gKCcna2V5d29yZF8xJycsICcna2V5d29yZF8xNScnLCAnJ2tleXdvcmRfMjUnJykK KyAgICAgIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMgbWss IGtleXdvcmRzIGsKKyAgICBXSEVSRSBrLnBob25ldGljX2NvZGUgSU4gKCcncGhfMScnLCAnJ3Bo XzE1JycpCisgICAgICBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworCiAtLSBDbGVhbnVw CiBEUk9QIFRBQkxFIG1vdmllX2tleXdvcmRzMiBDQVNDQURFOwogRFJPUCBUQUJMRSBrZXl3b3Jk czIgQ0FTQ0FERTsKK0RST1AgVEFCTEUgbW92aWVfa2V5d29yZHMgQ0FTQ0FERTsKK0RST1AgVEFC TEUga2V5d29yZHMgQ0FTQ0FERTsKLS0gCjIuNTAuMSAoQXBwbGUgR2l0LTE1NSkKCg== --0000000000002d73e706497fccf0 Content-Type: application/octet-stream; name="v1-0001-Extend-CREATE-STATISTICS-syntax-for-join-MCV-stat.patch" Content-Disposition: attachment; filename="v1-0001-Extend-CREATE-STATISTICS-syntax-for-join-MCV-stat.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzbswc1 RnJvbSBkYjcwOTI4MjRhZDNjYTUzMjEwNGU3MWI3NjM5MGFhYmY4YzNhMjA3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kcmEgV2FuZyA8YWxleGFuZHJhLndhbmcub3NzQGdt YWlsLmNvbT4KRGF0ZTogVHVlLCAyMCBKYW4gMjAyNiAwOTo1OTozNSAtMDgwMApTdWJqZWN0OiBb UEFUQ0ggdjEgMS8yXSBFeHRlbmQgQ1JFQVRFIFNUQVRJU1RJQ1Mgc3ludGF4IGZvciBqb2luIE1D Vgogc3RhdGlzdGljcwoKVGhpcyBwYXRjaCBleHRlbmRzIENSRUFURSBTVEFUSVNUSUNTIHRvIHN1 cHBvcnQgY3JlYXRpbmcgam9pbiBNQ1YKc3RhdGlzdGljcyB1c2luZyBhIEpPSU4gY2xhdXNlLgoK UHJvcG9zZWQgc3ludGF4OgoKICBDUkVBVEUgU1RBVElTVElDUyBzdGF0X25hbWUgKG1jdikKICBP TiBvdGhlcl90YWJsZS5maWx0ZXJfY29sCiAgRlJPTSBwcmltYXJ5X3RhYmxlIEpPSU4gb3RoZXJf dGFibGUgT04gKHByaW1hcnlfdGFibGUuZmsgPSBvdGhlcl90YWJsZS5wayk7CgpKb2luIE1DViBz dGF0aXN0aWNzIGNhcHR1cmUgdGhlIGpvaW50IGRpc3RyaWJ1dGlvbiBvZiBmaWx0ZXIgY29sdW1u CnZhbHVlcyBhbmQgdGhlaXIgZnJlcXVlbmNpZXMgaW4gdGhlIHByaW1hcnkgKHJlZmVyZW5jaW5n KSB0YWJsZS4gVGhpcwplbmFibGVzIGltcHJvdmVkIGNhcmRpbmFsaXR5IGVzdGltYXRpb24gZm9y IHF1ZXJpZXMgd2l0aCBzZWxlY3RpdmUKZmlsdGVycyBvbiBqb2luZWQgdGFibGVzLgoKSW4gb3Jk ZXIgdG8gc3RvcmUgdGhlIGpvaW4gbWN2IHN0YXRzIGluIHRoZSBjYXRhbG9hZywgVGhlIGZvbGxv d2luZwpjaGFuZ2VzIGFyZSBtYWRlIGluIHBnX3N0YXRpc3RpY19leHQgYW5kIHBnX3N0YXRpc3Rp Y19leHRfZGF0YToKCi0gQWRkIG5ldyBraW5kICdjJyBhcyBhbiBvcHRpb24gb2Ygc3R4a2luZAot IEFkZCBzdHhvdGhlcnJlbCAob2lkKSBhbmQgc3R4am9pbmtleXMgKGludDJ2ZWN0b3IpIGZpZWxk cyB0bwogIHBnX3N0YXRpc3RpY19leHQKLSBVc2UgdGhlIGV4aXN0aW5nIHN0eGtleXMgKGludDJ2 ZWN0b3IpIHRvIHN0b3JlIHRoZSBmaWx0ZXIgYXR0cmlidXRlcwogIG9mIHN0eG9ydGhlcnJlbAot IENyZWF0ZSBwZ19zdGF0aXN0aWNfZXh0X290aGVycmVsX2luZGV4IG9uIChzdHhyZWxpZCwgc3R4 b3RoZXJyZWwpCi0gQWRkIHN0eGRqb2lubWN2IChwZ19qb2luX21jdl9saXN0KSB0byBwZ19zdGF0 aXN0aWNfZXh0X2RhdGEKClBhdHRlcm4gZGV0ZWN0aW9uIChqb2luICsgZmlsdGVyIGNvbWJpbmF0 aW9ucykgYXJlIGFkZGVkIGluIHRoZQpmb2xsb3dpbmcgcGxhbm5lciBmdW5jdGlvbnMgdG8gY2Fs Y3VsYXRlIGpvaW4gbWN2IHNlbGVjdGl2aXR5OgoKLSBjbGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4 dCgpCi0gZ2V0X2ZvcmVpZ25fa2V5X2pvaW5fc2VsZWN0aXZpdHkoKQoKQ3VycmVudCBzY29wZSBh bmQgbGltaXRhdGlvbnM6CgotIENvbnNpZGVyIG9ubHkgam9pbnMgb24gMiB0YWJsZXMKLSBDb25z aWRlciBvbmx5IG9uZSBwYWlyIG9mIGVxdWFsaXR5IGpvaW4gY2xhdXNlLCBidXQgY2FuIGJlIGV4 dGVuZGVkIHRvIG11bHRpcGxlIGVhc2lseQotIEZpbHRlciBjbGF1c2Ugc3VwcG9ydCBvbmx5IEVx dWFsaXR5IGFuZCBJTiBvcGVyYXRvcnMgZm9yIG5vdwotIENvbnNpZGVyIG9ubHkgVmFycywgbm90 IGNvbnNpZGVyaW5nIEV4cHJlc3Npb25zIHlldAotIE1haW5seSBsb29rZWQgYXQgaW5uZXIgam9p biwgYnV0IHNlbWkvYW50aS9mdWxsIHNob3VsZG4ndCBiZSB0b28gZGlmZmljdWx0Ci0tLQogc3Jj L2JhY2tlbmQvY29tbWFuZHMvc3RhdHNjbWRzLmMgICAgICAgICAgICAgIHwgIDQ1NyArKystLQog c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY2xhdXNlc2VsLmMgICAgICAgIHwgICA0MyArLQog c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYyAgICAgICAgIHwgICA1NyArLQog c3JjL2JhY2tlbmQvcGFyc2VyL2dyYW0ueSAgICAgICAgICAgICAgICAgICAgIHwgICAgNyArCiBz cmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfdXRpbGNtZC5jICAgICAgICAgICAgfCAgMTI4ICstCiBz cmMvYmFja2VuZC9zdGF0aXN0aWNzL01ha2VmaWxlICAgICAgICAgICAgICAgfCAgICAxICsKIHNy Yy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHMuYyAgICAgICB8ICAyMzggKystCiBz cmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2Z1bmNzLmMgfCAgICAxICsKIHNy Yy9iYWNrZW5kL3N0YXRpc3RpY3Mvam9pbl9tY3YuYyAgICAgICAgICAgICB8IDE0OTMgKysrKysr KysrKysrKysrKysKIHNyYy9iYWNrZW5kL3N0YXRpc3RpY3MvbWVzb24uYnVpbGQgICAgICAgICAg ICB8ICAgIDEgKwogc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMgICAgICAgICAgICAgICAgICAg IHwgICA1MiArLQogc3JjL2luY2x1ZGUvY2F0YWxvZy9jYXR2ZXJzaW9uLmggICAgICAgICAgICAg IHwgICAgMiArLQogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgICAgICAg IHwgICAyMCArCiBzcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3N0YXRpc3RpY19leHQuaCAgICAgICAg fCAgICA4ICsKIHNyYy9pbmNsdWRlL2NhdGFsb2cvcGdfc3RhdGlzdGljX2V4dF9kYXRhLmggICB8 ICAgIDEgKwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ190eXBlLmRhdCAgICAgICAgICAgICAgIHwg ICAgNyArCiAuLi4vc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oICAgICAgfCAg IDEzICstCiBzcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaCAgICAgICAgICAgfCAg IDg0ICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvb2lkam9pbnMub3V0ICAgICAgICB8ICAg MTMgKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHQub3V0ICAgICAgIHwgICAx NCArLQogLi4uL3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNfZXh0X2Nyb3NzcmVsLm91dCAgIHwgIDI4 OCArKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3R5cGVfc2FuaXR5Lm91dCAgICAgfCAg IDEwICstCiBzcmMvdGVzdC9yZWdyZXNzL3BhcmFsbGVsX3NjaGVkdWxlICAgICAgICAgICAgfCAg ICAzICsKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL29pZGpvaW5zLnNxbCAgICAgICAgICAgICB8ICAg MTIgKwogc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNfZXh0X2Nyb3NzcmVsLnNxbCAgIHwgIDE3 MiArKwogMjUgZmlsZXMgY2hhbmdlZCwgMjk0MyBpbnNlcnRpb25zKCspLCAxODIgZGVsZXRpb25z KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9qb2luX21jdi5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHRf Y3Jvc3NyZWwub3V0CiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3Rh dHNfZXh0X2Nyb3NzcmVsLnNxbAoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL3N0 YXRzY21kcy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvc3RhdHNjbWRzLmMKaW5kZXggYzFkYTc5 ZjM2YmEuLjUyOTI5MzU3NmQwIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9zdGF0 c2NtZHMuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9zdGF0c2NtZHMuYwpAQCAtNDMsNiAr NDMsOSBAQAogc3RhdGljIGNoYXIgKkNob29zZUV4dGVuZGVkU3RhdGlzdGljTmFtZShjb25zdCBj aGFyICpuYW1lMSwgY29uc3QgY2hhciAqbmFtZTIsCiAJCQkJCQkJCQkJIGNvbnN0IGNoYXIgKmxh YmVsLCBPaWQgbmFtZXNwYWNlaWQpOwogc3RhdGljIGNoYXIgKkNob29zZUV4dGVuZGVkU3RhdGlz dGljTmFtZUFkZGl0aW9uKExpc3QgKmV4cHJzKTsKK3N0YXRpYyBib29sIGV4dHJhY3Rfam9pbl9j b2x1bW5zKEpvaW5FeHByICpqb2luLCBpbnQgc3R4a2V5c192YXJubywKKwkJCQkJCQkJIE9pZCAq cmVsaWQsIE9pZCAqb3RoZXJfcmVsaWQsCisJCQkJCQkJCSBpbnQxNiAqamtfYXR0bnVtcyk7CiAK IAogLyogcXNvcnQgY29tcGFyYXRvciBmb3IgdGhlIGF0dG51bXMgaW4gQ3JlYXRlU3RhdGlzdGlj cyAqLwpAQCAtNzgsNyArODEsNyBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0ZVN0YXRzU3RtdCAq c3RtdCwgYm9vbCBjaGVja19yaWdodHMpCiAJRGF0dW0JCWV4cHJzRGF0dW07CiAJUmVsYXRpb24J c3RhdHJlbDsKIAlSZWxhdGlvbglyZWwgPSBOVUxMOwotCU9pZAkJCXJlbGlkOworCU9pZAkJCXJl bGlkID0gSW52YWxpZE9pZDsKIAlPYmplY3RBZGRyZXNzIHBhcmVudG9iamVjdCwKIAkJCQlteXNl bGY7CiAJRGF0dW0JCXR5cGVzWzRdOwkJLyogb25lIGZvciBlYWNoIHBvc3NpYmxlIHR5cGUgb2Yg c3RhdGlzdGljICovCkBAIC05MiwyOSArOTUsMzAgQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVhdGVT dGF0c1N0bXQgKnN0bXQsIGJvb2wgY2hlY2tfcmlnaHRzKQogCWludAkJCWk7CiAJTGlzdENlbGwg ICAqY2VsbDsKIAlMaXN0Q2VsbCAgICpjZWxsMjsKKwlOb2RlCSAgICpybG47CisJSm9pbkV4cHIg ICAqam9pbiA9IE5VTEw7CisJUmVsYXRpb24Jb3RoZXJfcmVsID0gTlVMTDsKKwlPaWQJCQlvdGhl cl9yZWxpZCA9IEludmFsaWRPaWQ7CisJaW50MTYJCWprX2F0dG51bXNbMl07CS8qIEpvaW4ga2V5 IGF0dHJpYnV0ZSBudW1iZXJzOiBbcmVsJ3MgamsKKwkJCQkJCQkJICogYXR0bnVtMSwgb3RoZXJf cmVsJ3MgamsgYXR0bnVtMl0gKi8KKwlpbnQJCQlzdHhrZXlzX3Zhcm5vID0gMDsJLyogRm9yIGpv aW5zOiB3aGljaCB0YWJsZSBoYXMgdGhlCisJCQkJCQkJCQkgKiBzdGF0aXN0aWNzIGNvbHVtbnMg Ki8KIAogCUFzc2VydChJc0Eoc3RtdCwgQ3JlYXRlU3RhdHNTdG10KSk7CiAKIAkvKgotCSAqIEV4 YW1pbmUgdGhlIEZST00gY2xhdXNlLiAgQ3VycmVudGx5LCB3ZSBvbmx5IGFsbG93IGl0IHRvIGJl IGEgc2luZ2xlCi0JICogc2ltcGxlIHRhYmxlLCBidXQgbGF0ZXIgd2UnbGwgcHJvYmFibHkgYWxs b3cgbXVsdGlwbGUgdGFibGVzIGFuZCBKT0lOCi0JICogc3ludGF4LiAgVGhlIGdyYW1tYXIgaXMg YWxyZWFkeSBwcmVwYXJlZCBmb3IgdGhhdCwgc28gd2UgaGF2ZSB0byBjaGVjawotCSAqIGhlcmUg dGhhdCB3aGF0IHdlIGdvdCBpcyB3aGF0IHdlIGNhbiBzdXBwb3J0LgorCSAqIEV4YW1pbmUgdGhl IEZST00gY2xhdXNlLiBXZSBzdXBwb3J0IGVpdGhlcjogMS4gU2luZ2xlIFJhbmdlVmFyIGZvcgor CSAqIHNpbmdsZS10YWJsZSBzdGF0aXN0aWNzIDIuIEpvaW5FeHByIGZvciBqb2luIHN0YXRpc3Rp Y3MKIAkgKi8KIAlpZiAobGlzdF9sZW5ndGgoc3RtdC0+cmVsYXRpb25zKSAhPSAxKQogCQllcmVw b3J0KEVSUk9SLAogCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwK LQkJCQkgZXJybXNnKCJvbmx5IGEgc2luZ2xlIHJlbGF0aW9uIGlzIGFsbG93ZWQgaW4gQ1JFQVRF IFNUQVRJU1RJQ1MiKSkpOwotCi0JZm9yZWFjaChjZWxsLCBzdG10LT5yZWxhdGlvbnMpCi0Jewot CQlOb2RlCSAgICpybG4gPSAoTm9kZSAqKSBsZmlyc3QoY2VsbCk7CisJCQkJIGVycm1zZygib25s eSBhIHNpbmdsZSByZWxhdGlvbiBvciBKT0lOIGlzIGFsbG93ZWQgaW4gQ1JFQVRFIFNUQVRJU1RJ Q1MiKSkpOwogCi0JCWlmICghSXNBKHJsbiwgUmFuZ2VWYXIpKQotCQkJZXJlcG9ydChFUlJPUiwK LQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAotCQkJCQkgZXJy bXNnKCJvbmx5IGEgc2luZ2xlIHJlbGF0aW9uIGlzIGFsbG93ZWQgaW4gQ1JFQVRFIFNUQVRJU1RJ Q1MiKSkpOworCXJsbiA9IChOb2RlICopIGxpbml0aWFsKHN0bXQtPnJlbGF0aW9ucyk7CiAKKwlp ZiAoSXNBKHJsbiwgUmFuZ2VWYXIpKQorCXsKIAkJLyoKIAkJICogQ1JFQVRFIFNUQVRJU1RJQ1Mg d2lsbCBpbmZsdWVuY2UgZnV0dXJlIGV4ZWN1dGlvbiBwbGFucyBidXQgZG9lcwogCQkgKiBub3Qg aW50ZXJmZXJlIHdpdGggY3VycmVudGx5IGV4ZWN1dGluZyBwbGFucy4gIFNvIGl0IHNob3VsZCBi ZQpAQCAtMTUyLDY5ICsxNTYsMTkgQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVhdGVTdGF0c1N0bXQg KnN0bXQsIGJvb2wgY2hlY2tfcmlnaHRzKQogCQkJCQkoZXJyY29kZShFUlJDT0RFX0lOU1VGRklD SUVOVF9QUklWSUxFR0UpLAogCQkJCQkgZXJybXNnKCJwZXJtaXNzaW9uIGRlbmllZDogXCIlc1wi IGlzIGEgc3lzdGVtIGNhdGFsb2ciLAogCQkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJl bCkpKSk7Ci0JfQotCi0JQXNzZXJ0KHJlbCk7Ci0JcmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJl bCk7CiAKLQkvKgotCSAqIElmIHRoZSBub2RlIGhhcyBhIG5hbWUsIHNwbGl0IGl0IHVwIGFuZCBk ZXRlcm1pbmUgY3JlYXRpb24gbmFtZXNwYWNlLgotCSAqIElmIG5vdCwgcHV0IHRoZSBvYmplY3Qg aW4gdGhlIHNhbWUgbmFtZXNwYWNlIGFzIHRoZSByZWxhdGlvbiwgYW5kIGNvbnMKLQkgKiB1cCBh IG5hbWUgZm9yIGl0LiAgKFRoaXMgY2FuIGhhcHBlbiBlaXRoZXIgdmlhICJDUkVBVEUgU1RBVElT VElDUyAuLi4iCi0JICogb3IgdmlhICJDUkVBVEUgVEFCTEUgLi4uIChMSUtFKSIuKQotCSAqLwot CWlmIChzdG10LT5kZWZuYW1lcykKLQkJbmFtZXNwYWNlSWQgPSBRdWFsaWZpZWROYW1lR2V0Q3Jl YXRpb25OYW1lc3BhY2Uoc3RtdC0+ZGVmbmFtZXMsCi0JCQkJCQkJCQkJCQkJCSZuYW1lc3RyKTsK LQllbHNlCi0JewotCQluYW1lc3BhY2VJZCA9IFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCk7Ci0J CW5hbWVzdHIgPSBDaG9vc2VFeHRlbmRlZFN0YXRpc3RpY05hbWUoUmVsYXRpb25HZXRSZWxhdGlv bk5hbWUocmVsKSwKLQkJCQkJCQkJCQkJICBDaG9vc2VFeHRlbmRlZFN0YXRpc3RpY05hbWVBZGRp dGlvbihzdG10LT5leHBycyksCi0JCQkJCQkJCQkJCSAgInN0YXQiLAotCQkJCQkJCQkJCQkgIG5h bWVzcGFjZUlkKTsKKwkJcmVsaWQgPSBSZWxhdGlvbkdldFJlbGlkKHJlbCk7CiAJfQotCW5hbWVz dHJjcHkoJnN0eG5hbWUsIG5hbWVzdHIpOwotCi0JLyoKLQkgKiBDaGVjayB3ZSBoYXZlIGNyZWF0 aW9uIHJpZ2h0cyBpbiB0YXJnZXQgbmFtZXNwYWNlLiAgU2tpcCBjaGVjayBpZgotCSAqIGNhbGxl ciBkb2Vzbid0IHdhbnQgaXQuCi0JICovCi0JaWYgKGNoZWNrX3JpZ2h0cykKKwllbHNlIGlmIChJ c0EocmxuLCBKb2luRXhwcikpCiAJewotCQlBY2xSZXN1bHQJYWNscmVzdWx0OwotCi0JCWFjbHJl c3VsdCA9IG9iamVjdF9hY2xjaGVjayhOYW1lc3BhY2VSZWxhdGlvbklkLCBuYW1lc3BhY2VJZCwK LQkJCQkJCQkJCUdldFVzZXJJZCgpLCBBQ0xfQ1JFQVRFKTsKLQkJaWYgKGFjbHJlc3VsdCAhPSBB Q0xDSEVDS19PSykKLQkJCWFjbGNoZWNrX2Vycm9yKGFjbHJlc3VsdCwgT0JKRUNUX1NDSEVNQSwK LQkJCQkJCSAgIGdldF9uYW1lc3BhY2VfbmFtZShuYW1lc3BhY2VJZCkpOworCQlBc3NlcnQoc3Rt dC0+dHJhbnNmb3JtZWQpOworCQlqb2luID0gKEpvaW5FeHByICopIHJsbjsKIAl9Ci0KLQkvKgot CSAqIERlYWwgd2l0aCB0aGUgcG9zc2liaWxpdHkgdGhhdCB0aGUgc3RhdGlzdGljcyBvYmplY3Qg YWxyZWFkeSBleGlzdHMuCi0JICovCi0JaWYgKFNlYXJjaFN5c0NhY2hlRXhpc3RzMihTVEFURVhU TkFNRU5TUCwKLQkJCQkJCQkgIENTdHJpbmdHZXREYXR1bShuYW1lc3RyKSwKLQkJCQkJCQkgIE9i amVjdElkR2V0RGF0dW0obmFtZXNwYWNlSWQpKSkKKwllbHNlCiAJewotCQlpZiAoc3RtdC0+aWZf bm90X2V4aXN0cykKLQkJewotCQkJLyoKLQkJCSAqIFNpbmNlIHN0YXRzIG9iamVjdHMgYXJlbid0 IG1lbWJlcnMgb2YgZXh0ZW5zaW9ucyAoc2VlIGNvbW1lbnRzCi0JCQkgKiBiZWxvdyksIG5vIG5l ZWQgZm9yIGNoZWNrTWVtYmVyc2hpcEluQ3VycmVudEV4dGVuc2lvbiBoZXJlLgotCQkJICovCi0J CQllcmVwb3J0KE5PVElDRSwKLQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfT0JKRUNU KSwKLQkJCQkJIGVycm1zZygic3RhdGlzdGljcyBvYmplY3QgXCIlc1wiIGFscmVhZHkgZXhpc3Rz LCBza2lwcGluZyIsCi0JCQkJCQkJbmFtZXN0cikpKTsKLQkJCXJlbGF0aW9uX2Nsb3NlKHJlbCwg Tm9Mb2NrKTsKLQkJCXJldHVybiBJbnZhbGlkT2JqZWN0QWRkcmVzczsKLQkJfQotCiAJCWVyZXBv cnQoRVJST1IsCi0JCQkJKGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfT0JKRUNUKSwKLQkJCQkg ZXJybXNnKCJzdGF0aXN0aWNzIG9iamVjdCBcIiVzXCIgYWxyZWFkeSBleGlzdHMiLCBuYW1lc3Ry KSkpOworCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkg ZXJybXNnKCJvbmx5IGEgc2luZ2xlIHJlbGF0aW9uIG9yIEpPSU4gaXMgYWxsb3dlZCBpbiBDUkVB VEUgU1RBVElTVElDUyIpKSk7CiAJfQogCiAJLyoKQEAgLTI1Miw2ICsyMDYsMTIgQEAgQ3JlYXRl U3RhdGlzdGljcyhDcmVhdGVTdGF0c1N0bXQgKnN0bXQsIGJvb2wgY2hlY2tfcmlnaHRzKQogCQkJ Rm9ybV9wZ19hdHRyaWJ1dGUgYXR0Rm9ybTsKIAkJCVR5cGVDYWNoZUVudHJ5ICp0eXBlOwogCisJ CQkvKiBKb2luIHN0YXRzIHJlcXVpcmUgdGFibGUtcXVhbGlmaWVkIGNvbHVtbiBuYW1lcyAqLwor CQkJaWYgKGpvaW4pCisJCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVf SU5WQUxJRF9DT0xVTU5fUkVGRVJFTkNFKSwKKwkJCQkJCSBlcnJtc2coImpvaW4gc3RhdGlzdGlj cyByZXF1aXJlIHRhYmxlLXF1YWxpZmllZCBjb2x1bW4gbmFtZXMiKSkpOworCiAJCQlhdHRuYW1l ID0gc2VsZW0tPm5hbWU7CiAKIAkJCWF0dHR1cGxlID0gU2VhcmNoU3lzQ2FjaGVBdHROYW1lKHJl bGlkLCBhdHRuYW1lKTsKQEAgLTI5MCw2ICsyNTAsNyBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0 ZVN0YXRzU3RtdCAqc3RtdCwgYm9vbCBjaGVja19yaWdodHMpCiAJCXsKIAkJCVZhcgkJICAgKnZh ciA9IChWYXIgKikgc2VsZW0tPmV4cHI7CiAJCQlUeXBlQ2FjaGVFbnRyeSAqdHlwZTsKKwkJCU9p ZAkJCXZhcl9yZWxpZDsKIAogCQkJLyogRGlzYWxsb3cgdXNlIG9mIHN5c3RlbSBhdHRyaWJ1dGVz IGluIGV4dGVuZGVkIHN0YXRzICovCiAJCQlpZiAodmFyLT52YXJhdHRubyA8PSAwKQpAQCAtMjk3 LDIyICsyNTgsNDggQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVhdGVTdGF0c1N0bXQgKnN0bXQsIGJv b2wgY2hlY2tfcmlnaHRzKQogCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQ T1JURUQpLAogCQkJCQkJIGVycm1zZygic3RhdGlzdGljcyBjcmVhdGlvbiBvbiBzeXN0ZW0gY29s dW1ucyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKIAotCQkJLyogRGlzYWxsb3cgdXNlIG9mIHZpcnR1 YWwgZ2VuZXJhdGVkIGNvbHVtbnMgaW4gZXh0ZW5kZWQgc3RhdHMgKi8KLQkJCWlmIChnZXRfYXR0 Z2VuZXJhdGVkKHJlbGlkLCB2YXItPnZhcmF0dG5vKSA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJ UlRVQUwpCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVS RV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkJCSBlcnJtc2coInN0YXRpc3RpY3MgY3JlYXRpb24gb24g dmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKKwkJCS8qCisJ CQkgKiBGb3Igam9pbiBzdGF0cywgdHJhY2sgd2hpY2ggdGFibGUgdGhlIHN0YXRzIG9iamVjdHMg YXJlIGZyb20uCisJCQkgKiBDdXJyZW50bHkgb25seSBzdXBwb3J0cyBvbmUgdGFibGUgKG90aGVy X3JlbCkuCisJCQkgKi8KKwkJCWlmIChqb2luKQorCQkJeworCQkJCS8qIFRyYWNrIHdoaWNoIHRh YmxlIGhhcyB0aGUgc3RhdGlzdGljcyBjb2x1bW5zICovCisJCQkJaWYgKHN0eGtleXNfdmFybm8g PT0gMCkKKwkJCQkJc3R4a2V5c192YXJubyA9IHZhci0+dmFybm87CisJCQkJZWxzZSBpZiAoc3R4 a2V5c192YXJubyAhPSB2YXItPnZhcm5vKQorCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCShl cnJjb2RlKEVSUkNPREVfSU5WQUxJRF9DT0xVTU5fUkVGRVJFTkNFKSwKKwkJCQkJCQkgZXJybXNn KCJqb2luIHN0YXRpc3RpY3MgY29sdW1ucyBmcm9tIGRpZmZlcmVudCB0YWJsZXMgYXJlIG5vdCBz dXBwb3J0ZWQiKSkpOworCisJCQkJLyoKKwkJCQkgKiBGb3Igam9pbnMsIHdlJ2xsIHZhbGlkYXRl IHRoZSBjb2x1bW4gYWZ0ZXIgZXh0cmFjdGluZyBqb2luCisJCQkJICogaW5mbyBhbmQgZGV0ZXJt aW5pbmcgd2hpY2ggdGFibGUgaXMgd2hpY2guCisJCQkJICovCisJCQkJYXR0bnVtc1tuYXR0bnVt c10gPSB2YXItPnZhcmF0dG5vOworCQkJCW5hdHRudW1zKys7CisJCQl9CisJCQllbHNlCisJCQl7 CisJCQkJdmFyX3JlbGlkID0gcmVsaWQ7CiAKLQkJCS8qIERpc2FsbG93IGRhdGEgdHlwZXMgd2l0 aG91dCBhIGxlc3MtdGhhbiBvcGVyYXRvciAqLwotCQkJdHlwZSA9IGxvb2t1cF90eXBlX2NhY2hl KHZhci0+dmFydHlwZSwgVFlQRUNBQ0hFX0xUX09QUik7Ci0JCQlpZiAodHlwZS0+bHRfb3ByID09 IEludmFsaWRPaWQpCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKLQkJCQkJCSBlcnJtc2coImNvbHVtbiBcIiVzXCIgY2Fu bm90IGJlIHVzZWQgaW4gc3RhdGlzdGljcyBiZWNhdXNlIGl0cyB0eXBlICVzIGhhcyBubyBkZWZh dWx0IGJ0cmVlIG9wZXJhdG9yIGNsYXNzIiwKLQkJCQkJCQkJZ2V0X2F0dG5hbWUocmVsaWQsIHZh ci0+dmFyYXR0bm8sIGZhbHNlKSwgZm9ybWF0X3R5cGVfYmUodmFyLT52YXJ0eXBlKSkpKTsKKwkJ CQkvKiBEaXNhbGxvdyB1c2Ugb2YgdmlydHVhbCBnZW5lcmF0ZWQgY29sdW1ucyBpbiBleHRlbmRl ZCBzdGF0cyAqLworCQkJCWlmIChnZXRfYXR0Z2VuZXJhdGVkKHZhcl9yZWxpZCwgdmFyLT52YXJh dHRubykgPT0gQVRUUklCVVRFX0dFTkVSQVRFRF9WSVJUVUFMKQorCQkJCQllcmVwb3J0KEVSUk9S LAorCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJ CQkgZXJybXNnKCJzdGF0aXN0aWNzIGNyZWF0aW9uIG9uIHZpcnR1YWwgZ2VuZXJhdGVkIGNvbHVt bnMgaXMgbm90IHN1cHBvcnRlZCIpKSk7CiAKLQkJCWF0dG51bXNbbmF0dG51bXNdID0gdmFyLT52 YXJhdHRubzsKLQkJCW5hdHRudW1zKys7CisJCQkJLyogRGlzYWxsb3cgZGF0YSB0eXBlcyB3aXRo b3V0IGEgbGVzcy10aGFuIG9wZXJhdG9yICovCisJCQkJdHlwZSA9IGxvb2t1cF90eXBlX2NhY2hl KHZhci0+dmFydHlwZSwgVFlQRUNBQ0hFX0xUX09QUik7CisJCQkJaWYgKHR5cGUtPmx0X29wciA9 PSBJbnZhbGlkT2lkKQorCQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCShlcnJjb2RlKEVSUkNP REVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJCQkgZXJybXNnKCJjb2x1bW4gXCIlc1wi IGNhbm5vdCBiZSB1c2VkIGluIHN0YXRpc3RpY3MgYmVjYXVzZSBpdHMgdHlwZSAlcyBoYXMgbm8g ZGVmYXVsdCBidHJlZSBvcGVyYXRvciBjbGFzcyIsCisJCQkJCQkJCQlnZXRfYXR0bmFtZSh2YXJf cmVsaWQsIHZhci0+dmFyYXR0bm8sIGZhbHNlKSwgZm9ybWF0X3R5cGVfYmUodmFyLT52YXJ0eXBl KSkpKTsKKworCQkJCWF0dG51bXNbbmF0dG51bXNdID0gdmFyLT52YXJhdHRubzsKKwkJCQluYXR0 bnVtcysrOworCQkJfQogCQl9CiAJCWVsc2UJCQkJCS8qIGV4cHJlc3Npb24gKi8KIAkJewpAQCAt MzI0LDYgKzMxMSwxMiBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0ZVN0YXRzU3RtdCAqc3RtdCwg Ym9vbCBjaGVja19yaWdodHMpCiAKIAkJCUFzc2VydChleHByICE9IE5VTEwpOwogCisJCQkvKiBK b2luIHN0YXRzIG9ubHkgc3VwcG9ydCBzaW1wbGUgY29sdW1uIHJlZmVyZW5jZXMgKi8KKwkJCWlm IChqb2luKQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQkgZXJybXNnKCJleHByZXNzaW9ucyBhcmUgbm90IHN1 cHBvcnRlZCBpbiBqb2luIHN0YXRpc3RpY3MiKSkpOworCiAJCQlwdWxsX3ZhcmF0dG5vcyhleHBy LCAxLCAmYXR0bnVtcyk7CiAKIAkJCWsgPSAtMTsKQEAgLTM2Niw2ICszNTksMTExIEBAIENyZWF0 ZVN0YXRpc3RpY3MoQ3JlYXRlU3RhdHNTdG10ICpzdG10LCBib29sIGNoZWNrX3JpZ2h0cykKIAkJ fQogCX0KIAorCS8qCisJICogRm9yIGpvaW4gc3RhdGlzdGljcywgbm93IHRoYXQgd2Uga25vdyB3 aGljaCB0YWJsZSBoYXMgdGhlIHN0YXRpc3RpY3MKKwkgKiBjb2x1bW5zLCBleHRyYWN0IHRoZSBq b2luIGluZm9ybWF0aW9uLgorCSAqLworCWlmIChqb2luKQorCXsKKwkJQXNzZXJ0KHN0eGtleXNf dmFybm8gIT0gMCk7CisKKwkJaWYgKCFleHRyYWN0X2pvaW5fY29sdW1ucyhqb2luLCBzdHhrZXlz X3Zhcm5vLAorCQkJCQkJCQkgICZyZWxpZCwgJm90aGVyX3JlbGlkLAorCQkJCQkJCQkgIGprX2F0 dG51bXMpKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJF X05PVF9TVVBQT1JURUQpLAorCQkJCQkgZXJybXNnKCJqb2luIHN0YXRpc3RpY3MgcmVxdWlyZSBh IHNpbXBsZSBlcXVpam9pbiBjb25kaXRpb24iKSkpOworCisJCS8qIE9wZW4gYm90aCByZWxhdGlv bnMgbm93IGZvciB1bmlmb3JtIGFjY2VzcyBsYXRlciAqLworCQlyZWwgPSByZWxhdGlvbl9vcGVu KHJlbGlkLCBOb0xvY2spOworCQlvdGhlcl9yZWwgPSByZWxhdGlvbl9vcGVuKG90aGVyX3JlbGlk LCBOb0xvY2spOworCisJCS8qCisJCSAqIFZhbGlkYXRlIHN0YXRpc3RpY3MgY29sdW1ucyBub3cg dGhhdCB3ZSBrbm93IHdoaWNoIHRhYmxlcyB0aGV5J3JlCisJCSAqIGZyb20KKwkJICovCisJCWZv ciAoaSA9IDA7IGkgPCBuYXR0bnVtczsgaSsrKQorCQl7CisJCQlUeXBlQ2FjaGVFbnRyeSAqdHlw ZTsKKwkJCU9pZAkJCWF0dHR5cGU7CisKKwkJCWlmIChnZXRfYXR0Z2VuZXJhdGVkKG90aGVyX3Jl bGlkLCBhdHRudW1zW2ldKSA9PSBBVFRSSUJVVEVfR0VORVJBVEVEX1ZJUlRVQUwpCisJCQkJZXJl cG9ydChFUlJPUiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVE KSwKKwkJCQkJCSBlcnJtc2coInN0YXRpc3RpY3MgY3JlYXRpb24gb24gdmlydHVhbCBnZW5lcmF0 ZWQgY29sdW1ucyBpcyBub3Qgc3VwcG9ydGVkIikpKTsKKworCQkJLyogRGlzYWxsb3cgZGF0YSB0 eXBlcyB3aXRob3V0IGEgbGVzcy10aGFuIG9wZXJhdG9yICovCisJCQlhdHR0eXBlID0gZ2V0X2F0 dHR5cGUob3RoZXJfcmVsaWQsIGF0dG51bXNbaV0pOworCQkJdHlwZSA9IGxvb2t1cF90eXBlX2Nh Y2hlKGF0dHR5cGUsIFRZUEVDQUNIRV9MVF9PUFIpOworCQkJaWYgKHR5cGUtPmx0X29wciA9PSBJ bnZhbGlkT2lkKQorCQkJCWVyZXBvcnQoRVJST1IsCisJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZF QVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCQkgZXJybXNnKCJjb2x1bW4gXCIlc1wiIGNhbm5v dCBiZSB1c2VkIGluIHN0YXRpc3RpY3MgYmVjYXVzZSBpdHMgdHlwZSAlcyBoYXMgbm8gZGVmYXVs dCBidHJlZSBvcGVyYXRvciBjbGFzcyIsCisJCQkJCQkJCWdldF9hdHRuYW1lKG90aGVyX3JlbGlk LCBhdHRudW1zW2ldLCBmYWxzZSksCisJCQkJCQkJCWZvcm1hdF90eXBlX2JlKGF0dHR5cGUpKSkp OworCQl9CisJfQorCisJLyoKKwkgKiBOb3cgZGV0ZXJtaW5lIG5hbWVzcGFjZSBhbmQgbmFtZS4g VXNlIHJlbCAocHJpbWFyeSB0YWJsZSBmb3Igam9pbnMpLgorCSAqLworCWlmIChzdG10LT5kZWZu YW1lcykKKwkJbmFtZXNwYWNlSWQgPSBRdWFsaWZpZWROYW1lR2V0Q3JlYXRpb25OYW1lc3BhY2Uo c3RtdC0+ZGVmbmFtZXMsCisJCQkJCQkJCQkJCQkJCSZuYW1lc3RyKTsKKwllbHNlCisJeworCQlu YW1lc3BhY2VJZCA9IFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCk7CisJCW5hbWVzdHIgPSBDaG9v c2VFeHRlbmRlZFN0YXRpc3RpY05hbWUoUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSwKKwkJ CQkJCQkJCQkJICBDaG9vc2VFeHRlbmRlZFN0YXRpc3RpY05hbWVBZGRpdGlvbihzdG10LT5leHBy cyksCisJCQkJCQkJCQkJCSAgInN0YXQiLAorCQkJCQkJCQkJCQkgIG5hbWVzcGFjZUlkKTsKKwl9 CisJbmFtZXN0cmNweSgmc3R4bmFtZSwgbmFtZXN0cik7CisKKwkvKgorCSAqIENoZWNrIHdlIGhh dmUgY3JlYXRpb24gcmlnaHRzIGluIHRhcmdldCBuYW1lc3BhY2UuICBTa2lwIGNoZWNrIGlmCisJ ICogY2FsbGVyIGRvZXNuJ3Qgd2FudCBpdC4KKwkgKi8KKwlpZiAoY2hlY2tfcmlnaHRzKQorCXsK KwkJQWNsUmVzdWx0CWFjbHJlc3VsdDsKKworCQlhY2xyZXN1bHQgPSBvYmplY3RfYWNsY2hlY2so TmFtZXNwYWNlUmVsYXRpb25JZCwgbmFtZXNwYWNlSWQsCisJCQkJCQkJCQlHZXRVc2VySWQoKSwg QUNMX0NSRUFURSk7CisJCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tfT0spCisJCQlhY2xjaGVj a19lcnJvcihhY2xyZXN1bHQsIE9CSkVDVF9TQ0hFTUEsCisJCQkJCQkgICBnZXRfbmFtZXNwYWNl X25hbWUobmFtZXNwYWNlSWQpKTsKKwl9CisKKwkvKgorCSAqIERlYWwgd2l0aCB0aGUgcG9zc2li aWxpdHkgdGhhdCB0aGUgc3RhdGlzdGljcyBvYmplY3QgYWxyZWFkeSBleGlzdHMuCisJICovCisJ aWYgKFNlYXJjaFN5c0NhY2hlRXhpc3RzMihTVEFURVhUTkFNRU5TUCwKKwkJCQkJCQkgIENTdHJp bmdHZXREYXR1bShuYW1lc3RyKSwKKwkJCQkJCQkgIE9iamVjdElkR2V0RGF0dW0obmFtZXNwYWNl SWQpKSkKKwl7CisJCWlmIChzdG10LT5pZl9ub3RfZXhpc3RzKQorCQl7CisJCQkvKgorCQkJICog U2luY2Ugc3RhdHMgb2JqZWN0cyBhcmVuJ3QgbWVtYmVycyBvZiBleHRlbnNpb25zIChzZWUgY29t bWVudHMKKwkJCSAqIGJlbG93KSwgbm8gbmVlZCBmb3IgY2hlY2tNZW1iZXJzaGlwSW5DdXJyZW50 RXh0ZW5zaW9uIGhlcmUuCisJCQkgKi8KKwkJCWVyZXBvcnQoTk9USUNFLAorCQkJCQkoZXJyY29k ZShFUlJDT0RFX0RVUExJQ0FURV9PQkpFQ1QpLAorCQkJCQkgZXJybXNnKCJzdGF0aXN0aWNzIG9i amVjdCBcIiVzXCIgYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIiwKKwkJCQkJCQluYW1lc3RyKSkp OworCQkJLyogQ2xvc2UgcmVsYXRpb25zICovCisJCQlyZWxhdGlvbl9jbG9zZShyZWwsIE5vTG9j ayk7CisJCQlpZiAob3RoZXJfcmVsKQorCQkJCXJlbGF0aW9uX2Nsb3NlKG90aGVyX3JlbCwgTm9M b2NrKTsKKwkJCXJldHVybiBJbnZhbGlkT2JqZWN0QWRkcmVzczsKKwkJfQorCisJCWVyZXBvcnQo RVJST1IsCisJCQkJKGVycmNvZGUoRVJSQ09ERV9EVVBMSUNBVEVfT0JKRUNUKSwKKwkJCQkgZXJy bXNnKCJzdGF0aXN0aWNzIG9iamVjdCBcIiVzXCIgYWxyZWFkeSBleGlzdHMiLCBuYW1lc3RyKSkp OworCX0KKwogCS8qCiAJICogUGFyc2UgdGhlIHN0YXRpc3RpY3Mga2luZHMuCiAJICoKQEAgLTQz MSwxMyArNTI5LDI0IEBAIENyZWF0ZVN0YXRpc3RpY3MoQ3JlYXRlU3RhdHNTdG10ICpzdG10LCBi b29sIGNoZWNrX3JpZ2h0cykKIAlidWlsZF9leHByZXNzaW9ucyA9IChzdHhleHBycyAhPSBOSUwp OwogCiAJLyoKLQkgKiBDaGVjayB0aGF0IGF0IGxlYXN0IHR3byBjb2x1bW5zIHdlcmUgc3BlY2lm aWVkIGluIHRoZSBzdGF0ZW1lbnQsIG9yCi0JICogdGhhdCB3ZSdyZSBidWlsZGluZyBzdGF0aXN0 aWNzIG9uIGEgc2luZ2xlIGV4cHJlc3Npb24uCisJICogQ2hlY2sgY29sdW1uIGNvdW50IHJlcXVp cmVtZW50cy4KIAkgKi8KLQlpZiAoKG51bWNvbHMgPCAyKSAmJiAobGlzdF9sZW5ndGgoc3R4ZXhw cnMpICE9IDEpKQotCQllcmVwb3J0KEVSUk9SLAotCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJ RF9PQkpFQ1RfREVGSU5JVElPTiksCi0JCQkJIGVycm1zZygiZXh0ZW5kZWQgc3RhdGlzdGljcyBy ZXF1aXJlIGF0IGxlYXN0IDIgY29sdW1ucyIpKSk7CisJaWYgKGpvaW4pCisJeworCQkvKiBKb2lu IHN0YXRzIG5lZWQgYXQgbGVhc3QgMSBjb2x1bW4gKGpvaW4gYWRkcyBpbXBsaWNpdCBjb3JyZWxh dGlvbikgKi8KKwkJaWYgKG51bWNvbHMgPCAxKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVy cmNvZGUoRVJSQ09ERV9JTlZBTElEX09CSkVDVF9ERUZJTklUSU9OKSwKKwkJCQkJIGVycm1zZygi ZXh0ZW5kZWQgam9pbiBzdGF0aXN0aWNzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGNvbHVtbiIpKSk7 CisJfQorCWVsc2UKKwl7CisJCS8qIFNpbmdsZS10YWJsZSBzdGF0cyBuZWVkIGF0IGxlYXN0IDIg Y29sdW1ucyBvciAxIGV4cHJlc3Npb24gKi8KKwkJaWYgKG51bWNvbHMgPCAyICYmIGxpc3RfbGVu Z3RoKHN0eGV4cHJzKSAhPSAxKQorCQkJZXJlcG9ydChFUlJPUiwKKwkJCQkJKGVycmNvZGUoRVJS Q09ERV9JTlZBTElEX09CSkVDVF9ERUZJTklUSU9OKSwKKwkJCQkJIGVycm1zZygiZXh0ZW5kZWQg c3RhdGlzdGljcyByZXF1aXJlIGF0IGxlYXN0IDIgY29sdW1ucyIpKSk7CisJfQogCiAJLyoKIAkg KiBTb3J0IHRoZSBhdHRudW1zLCB3aGljaCBtYWtlcyBkZXRlY3RpbmcgZHVwbGljYXRlcyBzb21l d2hhdCBlYXNpZXIsIGFuZApAQCAtNDk2LDE0ICs2MDUsMjMgQEAgQ3JlYXRlU3RhdGlzdGljcyhD cmVhdGVTdGF0c1N0bXQgKnN0bXQsIGJvb2wgY2hlY2tfcmlnaHRzKQogCS8qIEZvcm0gYW4gaW50 MnZlY3RvciByZXByZXNlbnRhdGlvbiBvZiB0aGUgc29ydGVkIGNvbHVtbiBsaXN0ICovCiAJc3R4 a2V5cyA9IGJ1aWxkaW50MnZlY3RvcihhdHRudW1zLCBuYXR0bnVtcyk7CiAKLQkvKiBjb25zdHJ1 Y3QgdGhlIGNoYXIgYXJyYXkgb2YgZW5hYmxlZCBzdGF0aXN0aWMgdHlwZXMgKi8KKwkvKgorCSAq IENvbnN0cnVjdCB0aGUgY2hhciBhcnJheSBvZiBlbmFibGVkIHN0YXRpc3RpYyB0eXBlcy4gRm9y IGpvaW4KKwkgKiBzdGF0aXN0aWNzLCBvbmx5IE1DViBpcyBzdXBwb3J0ZWQgKGFzIFNUQVRTX0VY VF9KT0lOX01DVikuCisJICovCisJaWYgKGpvaW4gJiYgKGJ1aWxkX25kaXN0aW5jdCB8fCBidWls ZF9kZXBlbmRlbmNpZXMgfHwgYnVpbGRfZXhwcmVzc2lvbnMpKQorCQllcmVwb3J0KEVSUk9SLAor CQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNn KCJvbmx5IE1DViBzdGF0aXN0aWNzIGFyZSBzdXBwb3J0ZWQgZm9yIGpvaW4gc3RhdGlzdGljcyIp LAorCQkJCSBlcnJoaW50KCJuZGlzdGluY3QsIGRlcGVuZGVuY2llcywgYW5kIGV4cHJlc3Npb24g c3RhdGlzdGljcyByZXF1aXJlIGEgc2luZ2xlIHRhYmxlLiIpKSk7CisKIAludHlwZXMgPSAwOwog CWlmIChidWlsZF9uZGlzdGluY3QpCiAJCXR5cGVzW250eXBlcysrXSA9IENoYXJHZXREYXR1bShT VEFUU19FWFRfTkRJU1RJTkNUKTsKIAlpZiAoYnVpbGRfZGVwZW5kZW5jaWVzKQogCQl0eXBlc1tu dHlwZXMrK10gPSBDaGFyR2V0RGF0dW0oU1RBVFNfRVhUX0RFUEVOREVOQ0lFUyk7CiAJaWYgKGJ1 aWxkX21jdikKLQkJdHlwZXNbbnR5cGVzKytdID0gQ2hhckdldERhdHVtKFNUQVRTX0VYVF9NQ1Yp OworCQl0eXBlc1tudHlwZXMrK10gPSBDaGFyR2V0RGF0dW0ob3RoZXJfcmVsID8gU1RBVFNfRVhU X0pPSU5fTUNWIDogU1RBVFNfRVhUX01DVik7CiAJaWYgKGJ1aWxkX2V4cHJlc3Npb25zKQogCQl0 eXBlc1tudHlwZXMrK10gPSBDaGFyR2V0RGF0dW0oU1RBVFNfRVhUX0VYUFJFU1NJT05TKTsKIAlB c3NlcnQobnR5cGVzID4gMCAmJiBudHlwZXMgPD0gbGVuZ3Rob2YodHlwZXMpKTsKQEAgLTU0NCw2 ICs2NjIsMzAgQEAgQ3JlYXRlU3RhdGlzdGljcyhDcmVhdGVTdGF0c1N0bXQgKnN0bXQsIGJvb2wg Y2hlY2tfcmlnaHRzKQogCWlmIChleHByc0RhdHVtID09IChEYXR1bSkgMCkKIAkJbnVsbHNbQW51 bV9wZ19zdGF0aXN0aWNfZXh0X3N0eGV4cHJzIC0gMV0gPSB0cnVlOwogCisJLyoKKwkgKiBGb3Ig am9pbiBzdGF0aXN0aWNzLCBwb3B1bGF0ZSBzdHhvdGhlcnJlbCBhbmQgc3R4am9pbmtleXMuIEZv cgorCSAqIHNpbmdsZS10YWJsZSBzdGF0aXN0aWNzLCB0aGVzZSBmaWVsZHMgYXJlIE5VTEwuCisJ ICovCisJaWYgKGpvaW4pCisJeworCQlpbnQydmVjdG9yICpzdHhqb2lua2V5czsKKworCQkvKgor CQkgKiBCdWlsZCB0aGUgam9pbiBrZXlzIHZlY3RvciBmcm9tIGprX2F0dG51bXM6IFtwcmltYXJ5 X2F0dG51bSwKKwkJICogb3RoZXJfYXR0bnVtXQorCQkgKi8KKwkJc3R4am9pbmtleXMgPSBidWls ZGludDJ2ZWN0b3IoamtfYXR0bnVtcywgMik7CisKKwkJdmFsdWVzW0FudW1fcGdfc3RhdGlzdGlj X2V4dF9zdHhvdGhlcnJlbCAtIDFdID0gT2JqZWN0SWRHZXREYXR1bShvdGhlcl9yZWxpZCk7CisJ CXZhbHVlc1tBbnVtX3BnX3N0YXRpc3RpY19leHRfc3R4am9pbmtleXMgLSAxXSA9IFBvaW50ZXJH ZXREYXR1bShzdHhqb2lua2V5cyk7CisJfQorCWVsc2UKKwl7CisJCS8qIENyb3NzLXRhYmxlIGZp ZWxkcyBhcmUgTlVMTCBmb3Igc2luZ2xlLXRhYmxlIHN0YXRpc3RpY3MgKi8KKwkJbnVsbHNbQW51 bV9wZ19zdGF0aXN0aWNfZXh0X3N0eG90aGVycmVsIC0gMV0gPSB0cnVlOworCQludWxsc1tBbnVt X3BnX3N0YXRpc3RpY19leHRfc3R4am9pbmtleXMgLSAxXSA9IHRydWU7CisJfQorCiAJLyogaW5z ZXJ0IGl0IGludG8gcGdfc3RhdGlzdGljX2V4dCAqLwogCWh0dXAgPSBoZWFwX2Zvcm1fdHVwbGUo c3RhdHJlbC0+cmRfYXR0LCB2YWx1ZXMsIG51bGxzKTsKIAlDYXRhbG9nVHVwbGVJbnNlcnQoc3Rh dHJlbCwgaHR1cCk7CkBAIC01NjAsMTEgKzcwMiwxNyBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0 ZVN0YXRzU3RtdCAqc3RtdCwgYm9vbCBjaGVja19yaWdodHMpCiAJSW52b2tlT2JqZWN0UG9zdENy ZWF0ZUhvb2soU3RhdGlzdGljRXh0UmVsYXRpb25JZCwgc3RhdG9pZCwgMCk7CiAKIAkvKgotCSAq IEludmFsaWRhdGUgcmVsY2FjaGUgc28gdGhhdCBvdGhlcnMgc2VlIHRoZSBuZXcgc3RhdGlzdGlj cyBvYmplY3QuCisJICogSW52YWxpZGF0ZSByZWxjYWNoZSBzbyB0aGF0IG90aGVycyBzZWUgdGhl IG5ldyBzdGF0aXN0aWNzIG9iamVjdC4gRm9yCisJICogam9pbiBzdGF0cywgaW52YWxpZGF0ZSBi b3RoIHRhYmxlcy4KIAkgKi8KIAlDYWNoZUludmFsaWRhdGVSZWxjYWNoZShyZWwpOworCWlmIChv dGhlcl9yZWwpCisJCUNhY2hlSW52YWxpZGF0ZVJlbGNhY2hlKG90aGVyX3JlbCk7CiAKKwkvKiBD bG9zZSByZWxhdGlvbnMgKi8KIAlyZWxhdGlvbl9jbG9zZShyZWwsIE5vTG9jayk7CisJaWYgKG90 aGVyX3JlbCkKKwkJcmVsYXRpb25fY2xvc2Uob3RoZXJfcmVsLCBOb0xvY2spOwogCiAJLyoKIAkg KiBBZGQgYW4gQVVUTyBkZXBlbmRlbmN5IG9uIGVhY2ggY29sdW1uIHVzZWQgaW4gdGhlIHN0YXRz LCBzbyB0aGF0IHRoZQpAQCAtNTc1LDcgKzcyMywyMSBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0 ZVN0YXRzU3RtdCAqc3RtdCwgYm9vbCBjaGVja19yaWdodHMpCiAJLyogYWRkIGRlcGVuZGVuY2ll cyBmb3IgcGxhaW4gY29sdW1uIHJlZmVyZW5jZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbmF0dG51 bXM7IGkrKykKIAl7Ci0JCU9iamVjdEFkZHJlc3NTdWJTZXQocGFyZW50b2JqZWN0LCBSZWxhdGlv blJlbGF0aW9uSWQsIHJlbGlkLCBhdHRudW1zW2ldKTsKKwkJT2lkCQkJY29sX3JlbGlkID0gb3Ro ZXJfcmVsID8gb3RoZXJfcmVsaWQgOiByZWxpZDsKKworCQlPYmplY3RBZGRyZXNzU3ViU2V0KHBh cmVudG9iamVjdCwgUmVsYXRpb25SZWxhdGlvbklkLCBjb2xfcmVsaWQsIGF0dG51bXNbaV0pOwor CQlyZWNvcmREZXBlbmRlbmN5T24oJm15c2VsZiwgJnBhcmVudG9iamVjdCwgREVQRU5ERU5DWV9B VVRPKTsKKwl9CisKKwkvKiBGb3Igam9pbiBzdGF0cywgYWxzbyBhZGQgZGVwZW5kZW5jaWVzIG9u IGpvaW4gY29sdW1ucyAqLworCWlmIChvdGhlcl9yZWwpCisJeworCQlPYmplY3RBZGRyZXNzU3Vi U2V0KHBhcmVudG9iamVjdCwgUmVsYXRpb25SZWxhdGlvbklkLAorCQkJCQkJCXJlbGlkLCBqa19h dHRudW1zWzBdKTsKKwkJcmVjb3JkRGVwZW5kZW5jeU9uKCZteXNlbGYsICZwYXJlbnRvYmplY3Qs IERFUEVOREVOQ1lfQVVUTyk7CisKKwkJT2JqZWN0QWRkcmVzc1N1YlNldChwYXJlbnRvYmplY3Qs IFJlbGF0aW9uUmVsYXRpb25JZCwKKwkJCQkJCQlvdGhlcl9yZWxpZCwgamtfYXR0bnVtc1sxXSk7 CiAJCXJlY29yZERlcGVuZGVuY3lPbigmbXlzZWxmLCAmcGFyZW50b2JqZWN0LCBERVBFTkRFTkNZ X0FVVE8pOwogCX0KIApAQCAtNTg5LDggKzc1MSwxMSBAQCBDcmVhdGVTdGF0aXN0aWNzKENyZWF0 ZVN0YXRzU3RtdCAqc3RtdCwgYm9vbCBjaGVja19yaWdodHMpCiAJICogWFhYIFdlIGludGVudGlv bmFsbHkgZG9uJ3QgY29uc2lkZXIgdGhlIGV4cHJlc3Npb25zIGJlZm9yZSBhZGRpbmcgdGhpcwog CSAqIGRlcGVuZGVuY3ksIGJlY2F1c2UgcmVjb3JkRGVwZW5kZW5jeU9uU2luZ2xlUmVsRXhwciBt YXkgbm90IGNyZWF0ZSBhbnkKIAkgKiBkZXBlbmRlbmNpZXMgZm9yIHdob2xlLXJvdyBWYXJzLgor CSAqCisJICogSm9pbiBzdGF0cyBhcmUgZXhjbHVkZWQgYmVjYXVzZSB0aGV5IHNwYW4gdHdvIHRh YmxlcyAobm8gc2luZ2xlICJ3aG9sZQorCSAqIHRhYmxlIiBleGlzdHMpLgogCSAqLwotCWlmICgh bmF0dG51bXMpCisJaWYgKCFqb2luICYmICFuYXR0bnVtcykKIAl7CiAJCU9iamVjdEFkZHJlc3NT ZXQocGFyZW50b2JqZWN0LCBSZWxhdGlvblJlbGF0aW9uSWQsIHJlbGlkKTsKIAkJcmVjb3JkRGVw ZW5kZW5jeU9uKCZteXNlbGYsICZwYXJlbnRvYmplY3QsIERFUEVOREVOQ1lfQVVUTyk7CkBAIC05 MzAsNiArMTA5NSwxMDYgQEAgQ2hvb3NlRXh0ZW5kZWRTdGF0aXN0aWNOYW1lQWRkaXRpb24oTGlz dCAqZXhwcnMpCiAJcmV0dXJuIHBzdHJkdXAoYnVmKTsKIH0KIAorLyoKKyAqIGV4dHJhY3Rfam9p bl9jb2x1bW5zCisgKgorICogRXh0cmFjdCBqb2luIGNvbHVtbiBpbmZvcm1hdGlvbiBmcm9tIGEg Sm9pbkV4cHIgZm9yIGpvaW4gc3RhdGlzdGljcy4KKyAqIFVzZXMgc3R4a2V5c192YXJubyB0byBk ZXRlcm1pbmUgd2hpY2ggdGFibGUgaGFzIHRoZSBzdGF0aXN0aWNzIGNvbHVtbnMgKGN1cnJlbnRs eQorICogdGhpcyBtdXN0IGJlIHRoZSAib3RoZXIiIHRhYmxlLCBub3QgdGhlICJwcmltYXJ5IiB0 YWJsZSkuCisgKgorICogUG9wdWxhdGVzIGprX2F0dG51bXMgYXJyYXkgd2l0aCBqb2luIGtleSBh dHRyaWJ1dGUgbnVtYmVyczogW3JlbCdzIGprLCBvdGhlcl9yZWwncyBqa10KKyAqCisgKiBSZXR1 cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdGhlIGpvaW4gY29uZGl0aW9uIGlzIHRv byBjb21wbGV4LgorICoKKyAqIEN1cnJlbnRseSwgc3VwcG9ydHMgb25seSBzaW1wbGUgZXF1aWpv aW46IHRhYmxlMS5jb2wxID0gdGFibGUyLmNvbDIKKyAqLworc3RhdGljIGJvb2wKK2V4dHJhY3Rf am9pbl9jb2x1bW5zKEpvaW5FeHByICpqb2luLCBpbnQgc3R4a2V5c192YXJubywKKwkJCQkJIE9p ZCAqcmVsaWQsIE9pZCAqb3RoZXJfcmVsaWQsCisJCQkJCSBpbnQxNiAqamtfYXR0bnVtcykKK3sK KwlPaWQJCQlsZWZ0X3JlbGlkOworCU9pZAkJCXJpZ2h0X3JlbGlkOworCU5vZGUJICAgKnF1YWxz OworCU9wRXhwcgkgICAqb3BleHByOworCVZhcgkJICAgKmxlZnRfdmFyOworCVZhcgkJICAgKnJp Z2h0X3ZhcjsKKwlBdHRyTnVtYmVyCWxlZnRfYXR0bnVtOworCUF0dHJOdW1iZXIJcmlnaHRfYXR0 bnVtOworCisJaWYgKCFJc0Eoam9pbi0+bGFyZywgUmFuZ2VWYXIpIHx8ICFJc0Eoam9pbi0+cmFy ZywgUmFuZ2VWYXIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsZWZ0X3JlbGlkID0gUmFuZ2VWYXJH ZXRSZWxpZCgoUmFuZ2VWYXIgKikgam9pbi0+bGFyZywgTm9Mb2NrLCBmYWxzZSk7CisJcmlnaHRf cmVsaWQgPSBSYW5nZVZhckdldFJlbGlkKChSYW5nZVZhciAqKSBqb2luLT5yYXJnLCBOb0xvY2ss IGZhbHNlKTsKKworCXF1YWxzID0gam9pbi0+cXVhbHM7CisJaWYgKHF1YWxzID09IE5VTEwgfHwg IUlzQShxdWFscywgT3BFeHByKSkKKwkJcmV0dXJuIGZhbHNlOworCisJb3BleHByID0gKE9wRXhw ciAqKSBxdWFsczsKKworCS8qCisJICogTXVzdCBiZSBhIGJpbmFyeSBvcGVyYXRvciAoc2ltcGxl IGVxdWFsaXR5IGpvaW4pIGFuZCBib3RoIG9wZXJhbmRzIG11c3QKKwkgKiBiZSBjb2x1bW4gcmVm ZXJlbmNlcworCSAqLworCWlmIChsaXN0X2xlbmd0aChvcGV4cHItPmFyZ3MpICE9IDIgfHwKKwkJ IUlzQShsaW5pdGlhbChvcGV4cHItPmFyZ3MpLCBWYXIpIHx8ICFJc0EobHNlY29uZChvcGV4cHIt PmFyZ3MpLCBWYXIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsZWZ0X3ZhciA9IChWYXIgKikgbGlu aXRpYWwob3BleHByLT5hcmdzKTsKKwlyaWdodF92YXIgPSAoVmFyICopIGxzZWNvbmQob3BleHBy LT5hcmdzKTsKKworCS8qIEV4dHJhY3Qgam9pbiBjb2x1bW5zICovCisJaWYgKGxlZnRfdmFyLT52 YXJubyA9PSAxICYmIHJpZ2h0X3Zhci0+dmFybm8gPT0gMikKKwl7CisJCWxlZnRfYXR0bnVtID0g bGVmdF92YXItPnZhcmF0dG5vOworCQlyaWdodF9hdHRudW0gPSByaWdodF92YXItPnZhcmF0dG5v OworCX0KKwllbHNlIGlmIChsZWZ0X3Zhci0+dmFybm8gPT0gMiAmJiByaWdodF92YXItPnZhcm5v ID09IDEpCisJeworCQlsZWZ0X2F0dG51bSA9IHJpZ2h0X3Zhci0+dmFyYXR0bm87CisJCXJpZ2h0 X2F0dG51bSA9IGxlZnRfdmFyLT52YXJhdHRubzsKKwl9CisJZWxzZQorCXsKKwkJLyogVW5leHBl Y3RlZCB2YXJubyB2YWx1ZXMgKi8KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qCisJICogTm93 IGFzc2lnbiBwcmltYXJ5IHZzIG90aGVyIGJhc2VkIG9uIHdoaWNoIHRhYmxlIGhhcyB0aGUgc3Rh dGlzdGljcworCSAqIGNvbHVtbnMuIEN1cnJlbnRseSwgc3RhdGlzdGljcyBjb2x1bW5zIG11c3Qg YmUgb24gdGhlICJvdGhlciIgdGFibGUKKwkgKiAoc3BlY2lmaWVkIGJ5IHN0eGtleXNfdmFybm8p LCBub3QgdGhlIHByaW1hcnkgdGFibGUuIFRoZSBwcmltYXJ5IHRhYmxlCisJICogaXMgdGhlIGVz dGltYXRpb24gdGFyZ2V0LgorCSAqCisJICogUG9wdWxhdGUgamtfYXR0bnVtcyBhczogW3ByaW1h cnlfYXR0bnVtLCBvdGhlcl9hdHRudW1dCisJICovCisJaWYgKHN0eGtleXNfdmFybm8gPT0gMSkK Kwl7CisJCS8qIExlZnQgdGFibGUgaGFzIHN0YXRpc3RpY3MgY29sdW1ucywgc28gaXQncyB0aGUg b3RoZXIgdGFibGUgKi8KKwkJKm90aGVyX3JlbGlkID0gbGVmdF9yZWxpZDsKKwkJKnJlbGlkID0g cmlnaHRfcmVsaWQ7CisJCWprX2F0dG51bXNbMF0gPSByaWdodF9hdHRudW07CS8qIHByaW1hcnkg dGFibGUgam9pbiBjb2x1bW4gKi8KKwkJamtfYXR0bnVtc1sxXSA9IGxlZnRfYXR0bnVtOwkvKiBv dGhlciB0YWJsZSBqb2luIGNvbHVtbiAqLworCX0KKwllbHNlIGlmIChzdHhrZXlzX3Zhcm5vID09 IDIpCisJeworCQkvKiBSaWdodCB0YWJsZSBoYXMgc3RhdGlzdGljcyBjb2x1bW5zLCBzbyBpdCdz IHRoZSBvdGhlciB0YWJsZSAqLworCQkqb3RoZXJfcmVsaWQgPSByaWdodF9yZWxpZDsKKwkJKnJl bGlkID0gbGVmdF9yZWxpZDsKKwkJamtfYXR0bnVtc1swXSA9IGxlZnRfYXR0bnVtOwkvKiBwcmlt YXJ5IHRhYmxlIGpvaW4gY29sdW1uICovCisJCWprX2F0dG51bXNbMV0gPSByaWdodF9hdHRudW07 CS8qIG90aGVyIHRhYmxlIGpvaW4gY29sdW1uICovCisJfQorCWVsc2UKKwl7CisJCS8qIEludmFs aWQgc3R4a2V5c192YXJubyAqLworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7 Cit9CisKIC8qCiAgKiBTdGF0aXN0aWNzR2V0UmVsYXRpb246IGdpdmVuIGEgc3RhdGlzdGljcyBv YmplY3QncyBPSUQsIGdldCB0aGUgT0lEIG9mCiAgKiB0aGUgcmVsYXRpb24gaXQgaXMgZGVmaW5l ZCBvbi4gIFVzZXMgdGhlIHN5c3RlbSBjYWNoZS4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29w dGltaXplci9wYXRoL2NsYXVzZXNlbC5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY2xh dXNlc2VsLmMKaW5kZXggMjVjNGQxNzdhZDkuLjkxNjMwZGY2YjFhIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jbGF1c2VzZWwuYworKysgYi9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9jbGF1c2VzZWwuYwpAQCAtMTI5LDE5ICsxMjksNDQgQEAgY2xhdXNlbGlzdF9z ZWxlY3Rpdml0eV9leHQoUGxhbm5lckluZm8gKnJvb3QsCiAJaW50CQkJbGlzdGlkeDsKIAogCS8q Ci0JICogSWYgdGhlcmUncyBleGFjdGx5IG9uZSBjbGF1c2UsIGp1c3QgZ28gZGlyZWN0bHkgdG8K LQkgKiBjbGF1c2Vfc2VsZWN0aXZpdHlfZXh0KCkuIE5vbmUgb2Ygd2hhdCB3ZSBtaWdodCBkbyBi ZWxvdyBpcyByZWxldmFudC4KKwkgKiBEZXRlcm1pbmUgaWYgdGhlc2UgY2xhdXNlcyByZWZlcmVu Y2UgYSBzaW5nbGUgcmVsYXRpb24uCiAJICovCi0JaWYgKGxpc3RfbGVuZ3RoKGNsYXVzZXMpID09 IDEpCisJcmVsID0gZmluZF9zaW5nbGVfcmVsX2Zvcl9jbGF1c2VzKHJvb3QsIGNsYXVzZXMpOwor CisJLyoKKwkgKiBJZiB0aGVyZSdzIGV4YWN0bHkgb25lIGNsYXVzZSB0aGF0IHJlZmVyZW5jZXMg YSBzaW5nbGUgcmVsYXRpb24sIGp1c3QKKwkgKiBnbyBkaXJlY3RseSB0byBjbGF1c2Vfc2VsZWN0 aXZpdHlfZXh0KCkuIE5vbmUgb2Ygd2hhdCB3ZSBtaWdodCBkbyBiZWxvdworCSAqIGlzIHJlbGV2 YW50LiBJZiBtdWx0aXBsZSByZWxhdGlvbnMgYXJlIHJlZmVyZW5jZWQsIHdlIG11c3QgTk9UCisJ ICogc2hvcnQtY2lyY3VpdCBiZWNhdXNlIHdlIG5lZWQgdG8gZGV0ZWN0IGpvaW4gc3RhdHMgb3Bw b3J0dW5pdGllcy4KKwkgKi8KKwlpZiAobGlzdF9sZW5ndGgoY2xhdXNlcykgPT0gMSAmJiByZWwg IT0gTlVMTCkKIAkJcmV0dXJuIGNsYXVzZV9zZWxlY3Rpdml0eV9leHQocm9vdCwgKE5vZGUgKikg bGluaXRpYWwoY2xhdXNlcyksCiAJCQkJCQkJCQkgIHZhclJlbGlkLCBqb2ludHlwZSwgc2ppbmZv LAogCQkJCQkJCQkJICB1c2VfZXh0ZW5kZWRfc3RhdHMpOwogCiAJLyoKLQkgKiBEZXRlcm1pbmUg aWYgdGhlc2UgY2xhdXNlcyByZWZlcmVuY2UgYSBzaW5nbGUgcmVsYXRpb24uICBJZiBzbywgYW5k IGlmCi0JICogaXQgaGFzIGV4dGVuZGVkIHN0YXRpc3RpY3MsIHRyeSB0byBhcHBseSB0aG9zZS4K KwkgKiBUcnkgYXBwbHlpbmcgZXh0ZW5kZWQgc3RhdGlzdGljcyBmb3Igam9pbnMvcGFyYW1ldGVy aXplZCBzY2Fucy4KKwkgKgorCSAqIE5vdGU6IEZLLWJhc2VkIGpvaW5zIGFyZSBhbHJlYWR5IGhh bmRsZWQgYnkKKwkgKiBnZXRfZm9yZWlnbl9rZXlfam9pbl9zZWxlY3Rpdml0eSgpIHdoaWNoIHJ1 bnMgYmVmb3JlCisJICogY2xhdXNlbGlzdF9zZWxlY3Rpdml0eSgpLiBUaGlzIHByaW1hcmlseSBi ZW5lZml0czogLSBQYXJhbWV0ZXJpemVkIHBhdGgKKwkgKiBlc3RpbWF0aW9uIChiZWZvcmUgRksg c2VsZWN0aXZpdHkgcnVucykgLSBOb24tRksgam9pbiBwYXRoIGVzdGltYXRpb24KKwkgKi8KKwlp ZiAodXNlX2V4dGVuZGVkX3N0YXRzICYmICFyZWwpCisJeworCQkvKgorCQkgKiBFc3RpbWF0ZSBh cyBtYW55IGNsYXVzZXMgYXMgcG9zc2libGUgdXNpbmcgZXh0ZW5kZWQgc3RhdGlzdGljcy4KKwkJ ICoKKwkJICogJ2VzdGltYXRlZGNsYXVzZXMnIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSAwLWJhc2Vk IGxpc3QgcG9zaXRpb24KKwkJICogaW5kZXggb2YgY2xhdXNlcyBlc3RpbWF0ZWQgaGVyZSwgYW5k IHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQgYmVsb3cuCisJCSAqLworCQlzMSAqPSBzdGF0ZXh0X2pv aW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgY2xhdXNlcywgdmFyUmVsaWQsCisJ CQkJCQkJCQkJCQkJICAmZXN0aW1hdGVkY2xhdXNlcyk7CisJfQorCisJLyoKKwkgKiBUcnkgYXBw bHlpbmcgZXh0ZW5kZWQgc3RhdGlzdGljcyBmb3Igc2luZ2xlIHRhYmxlIHNjYW5zLgogCSAqLwot CXJlbCA9IGZpbmRfc2luZ2xlX3JlbF9mb3JfY2xhdXNlcyhyb290LCBjbGF1c2VzKTsKIAlpZiAo dXNlX2V4dGVuZGVkX3N0YXRzICYmIHJlbCAmJiByZWwtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9O ICYmIHJlbC0+c3RhdGxpc3QgIT0gTklMKQogCXsKIAkJLyoKQEAgLTE1MCw5ICsxNzUsOSBAQCBj bGF1c2VsaXN0X3NlbGVjdGl2aXR5X2V4dChQbGFubmVySW5mbyAqcm9vdCwKIAkJICogJ2VzdGlt YXRlZGNsYXVzZXMnIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSAwLWJhc2VkIGxpc3QgcG9zaXRpb24K IAkJICogaW5kZXggb2YgY2xhdXNlcyBlc3RpbWF0ZWQgaGVyZSwgYW5kIHRoYXQgc2hvdWxkIGJl IGlnbm9yZWQgYmVsb3cuCiAJCSAqLwotCQlzMSA9IHN0YXRleHRfY2xhdXNlbGlzdF9zZWxlY3Rp dml0eShyb290LCBjbGF1c2VzLCB2YXJSZWxpZCwKLQkJCQkJCQkJCQkJam9pbnR5cGUsIHNqaW5m bywgcmVsLAotCQkJCQkJCQkJCQkmZXN0aW1hdGVkY2xhdXNlcywgZmFsc2UpOworCQlzMSAqPSBz dGF0ZXh0X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkocm9vdCwgY2xhdXNlcywgdmFyUmVsaWQsCisJ CQkJCQkJCQkJCSBqb2ludHlwZSwgc2ppbmZvLCByZWwsCisJCQkJCQkJCQkJCSAmZXN0aW1hdGVk Y2xhdXNlcywgZmFsc2UpOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRp bWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNp emUuYwppbmRleCAxNmJmMWY2MWEwZi4uMGIxMjgxZDQzZTEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BhdGgvY29zdHNpemUuYwpAQCAtMTA4LDYgKzEwOCw3IEBACiAjaW5jbHVkZSAidXRpbHMvc2Vs ZnVuY3MuaCIKICNpbmNsdWRlICJ1dGlscy9zcGNjYWNoZS5oIgogI2luY2x1ZGUgInV0aWxzL3R1 cGxlc29ydC5oIgorI2luY2x1ZGUgInN0YXRpc3RpY3Mvc3RhdGlzdGljcy5oIgogCiAKICNkZWZp bmUgTE9HMih4KSAgKGxvZyh4KSAvIDAuNjkzMTQ3MTgwNTU5OTQ1KQpAQCAtNTY5Miw2ICs1Njkz LDEwIEBAIGdldF9mb3JlaWduX2tleV9qb2luX3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290 LAogCQlib29sCQlyZWZfaXNfb3V0ZXI7CiAJCUxpc3QJICAgKnJlbW92ZWRsaXN0OwogCQlMaXN0 Q2VsbCAgICpjZWxsOworCQlTZWxlY3Rpdml0eSBqb2luX21jdl9zZWwgPSAwLjA7CisJCVJlbE9w dEluZm8gKmNvbl9yZWw7CisJCVJlbE9wdEluZm8gKnJlZl9yZWw7CisJCUpvaW5NQ1ZPcHBvcnR1 bml0eSAqam9pbl9vcHA7CiAKIAkJLyoKIAkJICogVGhpcyBGSyBpcyBub3QgcmVsZXZhbnQgdW5s ZXNzIGl0IGNvbm5lY3RzIGEgYmFzZXJlbCBvbiBvbmUgc2lkZSBvZgpAQCAtNTgyMSw2ICs1ODI2 LDEwIEBAIGdldF9mb3JlaWduX2tleV9qb2luX3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290 LAogCQkgKiBrbm93bGVkZ2UgdGhhdCBlYWNoIHJlZmVyZW5jaW5nIHJvdyB3aWxsIG1hdGNoIGV4 YWN0bHkgb25lIHJvdyBpbgogCQkgKiB0aGUgcmVmZXJlbmNlZCB0YWJsZS4KIAkJICoKKwkJICog RU5IQU5DRUQ6IEZpcnN0IGNoZWNrIGlmIGV4dGVuZGVkIGpvaW4gTUNWIHN0YXRpc3RpY3MgZXhp c3QgZm9yCisJCSAqIHRoaXMgRksuIElmIHNvLCB1c2UgdGhlIG1vcmUgYWNjdXJhdGUgTUNWLWJh c2VkIHNlbGVjdGl2aXR5IGluc3RlYWQKKwkJICogb2YgdGhlIEZLIGhldXJpc3RpYyAoMS4wIC8g cmVmX3R1cGxlcykuCisJCSAqCiAJCSAqIFhYWCB0aGF0J3Mgbm90IHRydWUgaW4gdGhlIHByZXNl bmNlIG9mIG51bGxzIGluIHRoZSByZWZlcmVuY2luZwogCQkgKiBjb2x1bW4ocyksIHNvIGluIHBy aW5jaXBsZSB3ZSBzaG91bGQgZGVyYXRlIHRoZSBlc3RpbWF0ZSBmb3IgdGhvc2UuCiAJCSAqIEhv d2V2ZXIgKDEpIGlmIHRoZXJlIGFyZSBhbnkgc3RyaWN0IHJlc3RyaWN0aW9uIGNsYXVzZXMgZm9y IHRoZQpAQCAtNTgzOSw2ICs1ODQ4LDM2IEBAIGdldF9mb3JlaWduX2tleV9qb2luX3NlbGVjdGl2 aXR5KFBsYW5uZXJJbmZvICpyb290LAogCQkgKiB3b3JrLCBpdCBpcyB1bmNvbW1vbiBpbiBwcmFj dGljZSB0byBoYXZlIGFuIEZLIHJlZmVyZW5jaW5nIGEgcGFyZW50CiAJCSAqIHRhYmxlLiAgU28s IGF0IGxlYXN0IGZvciBub3csIGRpc3JlZ2FyZCBpbmhlcml0YW5jZSBoZXJlLgogCQkgKi8KKwkJ Y29uX3JlbCA9IGZpbmRfYmFzZV9yZWwocm9vdCwgZmtpbmZvLT5jb25fcmVsaWQpOworCQlyZWZf cmVsID0gZmluZF9iYXNlX3JlbChyb290LCBma2luZm8tPnJlZl9yZWxpZCk7CisKKwkJLyogVHJ5 IHRvIGRldGVjdCBqb2luIE1DViBvcHBvcnR1bml0eSAqLworCQlqb2luX29wcCA9IGZpbmRfam9p bl9tY3Zfb3Bwb3J0dW5pdHkocm9vdCwKKwkJCQkJCQkJCQkJIHJlZl9pc19vdXRlciA/IHJlZl9y ZWwgOiBjb25fcmVsLAorCQkJCQkJCQkJCQkgcmVmX2lzX291dGVyID8gY29uX3JlbCA6IHJlZl9y ZWwsCisJCQkJCQkJCQkJCSAqcmVzdHJpY3RsaXN0KTsKKwkJaWYgKGpvaW5fb3BwKQorCQl7CisJ CQlKb2luTUNWTGlzdCAqam9pbl9tY3Y7CisKKwkJCWpvaW5fbWN2ID0gc3RhdGV4dF9qb2luX21j dl9sb2FkKGpvaW5fb3BwLT50YXJnZXRfcmVsLAorCQkJCQkJCQkJCQkgam9pbl9vcHAtPnRhcmdl dF9qb2lua2V5LAorCQkJCQkJCQkJCQkgam9pbl9vcHAtPm90aGVyX3JlbCwKKwkJCQkJCQkJCQkJ IGpvaW5fb3BwLT5vdGhlcl9qb2lua2V5LAorCQkJCQkJCQkJCQkgam9pbl9vcHAtPmZpbHRlcl9h dHRudW1zKTsKKwkJCWlmIChqb2luX21jdikKKwkJCXsKKwkJCQlqb2luX21jdl9zZWwgPSBqb2lu X21jdl9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5KGpvaW5fbWN2LAorCQkJCQkJCQkJCQkJCQkJICAg am9pbl9vcHAtPmZpbHRlcl92YWx1ZXMsCisJCQkJCQkJCQkJCQkJCQkgICBqb2luX29wcC0+Zmls dGVyX2F0dG51bXMsCisJCQkJCQkJCQkJCQkJCQkgICBqb2luX29wcC0+Y29sbGF0aW9uKTsKKwkJ CQlwZnJlZShqb2luX21jdik7CisKKwkJCQllcmVwb3J0KERFQlVHMSwKKwkJCQkJCShlcnJtc2co IiAgRks6IGV4dGVuZGVkIGpvaW4gTUNWIGZvdW5kLCBzZWxlY3Rpdml0eSA9ICUuNmYiLCBqb2lu X21jdl9zZWwpKSk7CisJCQl9CisJCX0KKwogCQlpZiAoam9pbnR5cGUgPT0gSk9JTl9TRU1JIHx8 IGpvaW50eXBlID09IEpPSU5fQU5USSkKIAkJewogCQkJLyoKQEAgLTU4NTIsMTEgKzU4OTEsMjYg QEAgZ2V0X2ZvcmVpZ25fa2V5X2pvaW5fc2VsZWN0aXZpdHkoUGxhbm5lckluZm8gKnJvb3QsCiAJ CQkgKiByZXN0cmljdGlvbiBjbGF1c2VzLCB3aGljaCBpcyByb3dzIC8gdHVwbGVzOyBidXQgd2Ug bXVzdCBndWFyZAogCQkJICogYWdhaW5zdCB0dXBsZXMgPT0gMC4KIAkJCSAqLwotCQkJUmVsT3B0 SW5mbyAqcmVmX3JlbCA9IGZpbmRfYmFzZV9yZWwocm9vdCwgZmtpbmZvLT5yZWZfcmVsaWQpOwog CQkJZG91YmxlCQlyZWZfdHVwbGVzID0gTWF4KHJlZl9yZWwtPnR1cGxlcywgMS4wKTsKIAogCQkJ ZmtzZWxlYyAqPSByZWZfcmVsLT5yb3dzIC8gcmVmX3R1cGxlczsKIAkJfQorCQllbHNlIGlmIChq b2luX21jdl9zZWwgPiAwKQorCQl7CisJCQkvKgorCQkJICogQXBwbHkgZXh0ZW5kZWQgam9pbiBN Q1Ygc2VsZWN0aXZpdHkuCisJCQkgKgorCQkJICogRm9yIElOIGNsYXVzZXM6IGpvaW5fbWN2X3Nl bCA9IGF2ZXJhZ2Ugc2VsZWN0aXZpdHkgcGVyIGZpbHRlcgorCQkJICogY29uc3RhbnQgRm9yIGVx dWFsaXR5OiAgIGpvaW5fbWN2X3NlbCA9IHNlbGVjdGl2aXR5IGZvciB0aGF0CisJCQkgKiBzaW5n bGUgY29uc3RhbnQgVXNpbmcgdGhlIGF2ZXJhZ2UgZW5zdXJlcyBtdWx0aXBseWluZyBieQorCQkJ ICogaW5uZXJfcm93cyByZWNvdmVycyB0aGUgY29ycmVjdCB0b3RhbCBzZWxlY3Rpdml0eS4KKwkJ CSAqLworCQkJZmtzZWxlYyAqPSBqb2luX21jdl9zZWw7CisKKwkJCWVyZXBvcnQoREVCVUcxLAor CQkJCQkoZXJybXNnKCIgIEZLIEFQUExJRUQgKE1DVik6IHNlbGVjdGl2aXR5ID0gJS42ZiwgY3Vt dWxhdGl2ZSBma3NlbGVjID0gJS42ZiIsCisJCQkJCQkJam9pbl9tY3Zfc2VsLCBma3NlbGVjKSkp OworCQl9CiAJCWVsc2UKIAkJewogCQkJLyoKQEAgLTU4NjQsNyArNTkxOCw2IEBAIGdldF9mb3Jl aWduX2tleV9qb2luX3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LAogCQkJICogZ3VhcmQg YWdhaW5zdCB0dXBsZXMgPT0gMC4gIE5vdGUgd2Ugc2hvdWxkIHVzZSB0aGUgcmF3IHRhYmxlCiAJ CQkgKiB0dXBsZSBjb3VudCwgbm90IGFueSBlc3RpbWF0ZSBvZiBpdHMgZmlsdGVyZWQgb3Igam9p bmVkIHNpemUuCiAJCQkgKi8KLQkJCVJlbE9wdEluZm8gKnJlZl9yZWwgPSBmaW5kX2Jhc2VfcmVs KHJvb3QsIGZraW5mby0+cmVmX3JlbGlkKTsKIAkJCWRvdWJsZQkJcmVmX3R1cGxlcyA9IE1heChy ZWZfcmVsLT50dXBsZXMsIDEuMCk7CiAKIAkJCWZrc2VsZWMgKj0gMS4wIC8gcmVmX3R1cGxlczsK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3BhcnNlci9ncmFtLnkgYi9zcmMvYmFja2VuZC9wYXJz ZXIvZ3JhbS55CmluZGV4IDcxM2VlNWMxMGEyLi4yYmNjYzExNDdiMSAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvcGFyc2VyL2dyYW0ueQorKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvZ3JhbS55CkBA IC00ODY3LDYgKzQ4NjcsMTMgQEAgc3RhdHNfcGFyYW06CUNvbElkCiAJCQkJCSQkLT5uYW1lID0g JDE7CiAJCQkJCSQkLT5leHByID0gTlVMTDsKIAkJCQl9CisJCQl8IENvbElkIGluZGlyZWN0aW9u CisJCQkJeworCQkJCQkvKiBUYWJsZS1xdWFsaWZpZWQgY29sdW1uIHJlZmVyZW5jZSAoZS5nLiwg dGJsLmNvbCkgKi8KKwkJCQkJJCQgPSBtYWtlTm9kZShTdGF0c0VsZW0pOworCQkJCQkkJC0+bmFt ZSA9IE5VTEw7CisJCQkJCSQkLT5leHByID0gKE5vZGUgKikgbWFrZUNvbHVtblJlZigkMSwgJDIs IEAxLCB5eXNjYW5uZXIpOworCQkJCX0KIAkJCXwgZnVuY19leHByX3dpbmRvd2xlc3MKIAkJCQl7 CiAJCQkJCSQkID0gbWFrZU5vZGUoU3RhdHNFbGVtKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3BhcnNlci9wYXJzZV91dGlsY21kLmMgYi9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2VfdXRpbGNt ZC5jCmluZGV4IGI1ZjRjNzI0NTlkLi44OTc4MzZmN2ZjOCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvcGFyc2VyL3BhcnNlX3V0aWxjbWQuYworKysgYi9zcmMvYmFja2VuZC9wYXJzZXIvcGFyc2Vf dXRpbGNtZC5jCkBAIC0zMTU1LDcgKzMxNTUsMTAgQEAgdHJhbnNmb3JtU3RhdHNTdG10KE9pZCBy ZWxpZCwgQ3JlYXRlU3RhdHNTdG10ICpzdG10LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZykKIAlQ YXJzZVN0YXRlICpwc3RhdGU7CiAJUGFyc2VOYW1lc3BhY2VJdGVtICpuc2l0ZW07CiAJTGlzdENl bGwgICAqbDsKLQlSZWxhdGlvbglyZWw7CisJUmVsYXRpb24JcmVsID0gTlVMTDsKKwlib29sCQlp c2pvaW4gPSAhT2lkSXNWYWxpZChyZWxpZCk7CisJUmVsYXRpb24JbGVmdF9yZWwgPSBOVUxMOwor CVJlbGF0aW9uCXJpZ2h0X3JlbCA9IE5VTEw7CiAKIAkvKiBOb3RoaW5nIHRvIGRvIGlmIHN0YXRl bWVudCBhbHJlYWR5IHRyYW5zZm9ybWVkLiAqLwogCWlmIChzdG10LT50cmFuc2Zvcm1lZCkKQEAg LTMxNjUsMTggKzMxNjgsODAgQEAgdHJhbnNmb3JtU3RhdHNTdG10KE9pZCByZWxpZCwgQ3JlYXRl U3RhdHNTdG10ICpzdG10LCBjb25zdCBjaGFyICpxdWVyeVN0cmluZykKIAlwc3RhdGUgPSBtYWtl X3BhcnNlc3RhdGUoTlVMTCk7CiAJcHN0YXRlLT5wX3NvdXJjZXRleHQgPSBxdWVyeVN0cmluZzsK IAotCS8qCi0JICogUHV0IHRoZSBwYXJlbnQgdGFibGUgaW50byB0aGUgcnRhYmxlIHNvIHRoYXQg dGhlIGV4cHJlc3Npb25zIGNhbiByZWZlcgotCSAqIHRvIGl0cyBmaWVsZHMgd2l0aG91dCBxdWFs aWZpY2F0aW9uLiAgQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nCi0JICogcmVsYXRp b24sIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIG9wZW4gaXQuCi0JICovCi0JcmVsID0gcmVsYXRpb25f b3BlbihyZWxpZCwgTm9Mb2NrKTsKLQluc2l0ZW0gPSBhZGRSYW5nZVRhYmxlRW50cnlGb3JSZWxh dGlvbihwc3RhdGUsIHJlbCwKLQkJCQkJCQkJCQkgICBBY2Nlc3NTaGFyZUxvY2ssCi0JCQkJCQkJ CQkJICAgTlVMTCwgZmFsc2UsIHRydWUpOworCWlmIChpc2pvaW4pCisJeworCQkvKgorCQkgKiBF eHRyYWN0IHRoZSB0d28gdGFibGVzIGZyb20gdGhlIEpPSU4gZXhwcmVzc2lvbiBhbmQgYWRkIHRo ZW0gdG8gdGhlCisJCSAqIG5hbWVzcGFjZS4KKwkJICovCisJCU5vZGUJICAgKmZyb21Ob2RlID0g KE5vZGUgKikgbGluaXRpYWwoc3RtdC0+cmVsYXRpb25zKTsKKwkJSm9pbkV4cHIgICAqam9pbjsK KwkJUmFuZ2VWYXIgICAqbHJlbDsKKwkJUmFuZ2VWYXIgICAqcnJlbDsKKwkJUGFyc2VOYW1lc3Bh Y2VJdGVtICpsZWZ0X25zaXRlbTsKKwkJUGFyc2VOYW1lc3BhY2VJdGVtICpyaWdodF9uc2l0ZW07 CisKKwkJaWYgKCFJc0EoZnJvbU5vZGUsIEpvaW5FeHByKSkKKwkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJIGVycm1z ZygiZXh0ZW5kZWQgam9pbiBzdGF0aXN0aWNzIHJlcXVpcmUgYSBKT0lOIGNsYXVzZSIpKSk7CiAK LQkvKiBubyB0byBqb2luIGxpc3QsIHllcyB0byBuYW1lc3BhY2VzICovCi0JYWRkTlNJdGVtVG9R dWVyeShwc3RhdGUsIG5zaXRlbSwgZmFsc2UsIHRydWUsIHRydWUpOworCQlqb2luID0gKEpvaW5F eHByICopIGZyb21Ob2RlOworCisJCS8qIEV4dHJhY3QgbGVmdCBhbmQgcmlnaHQgUmFuZ2VWYXJz ICovCisJCWlmICghSXNBKGpvaW4tPmxhcmcsIFJhbmdlVmFyKSB8fCAhSXNBKGpvaW4tPnJhcmcs IFJhbmdlVmFyKSkKKwkJCWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVB VFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJIGVycm1zZygiZXh0ZW5kZWQgam9pbiBzdGF0aXN0 aWNzIGN1cnJlbnRseSBzdXBwb3J0IG9ubHkgc2ltcGxlIHR3by10YWJsZSBqb2lucyIpKSk7CisK KwkJbHJlbCA9IChSYW5nZVZhciAqKSBqb2luLT5sYXJnOworCQlycmVsID0gKFJhbmdlVmFyICop IGpvaW4tPnJhcmc7CisKKwkJLyoKKwkJICogT3BlbiBib3RoIHJlbGF0aW9ucyBhbmQgYWRkIHRo ZW0gdG8gdGhlIG5hbWVzcGFjZS4gV2UgbmVlZAorCQkgKiBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxv Y2sgZm9yIHN0YXRpc3RpY3MgY3JlYXRpb24gKHNlZSBjb21tZW50cyBpbgorCQkgKiBDcmVhdGVT dGF0aXN0aWNzKS4KKwkJICovCisJCWxlZnRfcmVsID0gdGFibGVfb3BlbnJ2KGxyZWwsIFNoYXJl VXBkYXRlRXhjbHVzaXZlTG9jayk7CisJCXJpZ2h0X3JlbCA9IHRhYmxlX29wZW5ydihycmVsLCBT aGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2spOworCisJCS8qIEFkZCBsZWZ0IHRhYmxlIHRvIHJ0YWJs ZSBhbmQgbmFtZXNwYWNlICovCisJCWxlZnRfbnNpdGVtID0gYWRkUmFuZ2VUYWJsZUVudHJ5Rm9y UmVsYXRpb24ocHN0YXRlLCBsZWZ0X3JlbCwKKwkJCQkJCQkJCQkJCQlBY2Nlc3NTaGFyZUxvY2ss CisJCQkJCQkJCQkJCQkJbHJlbC0+YWxpYXMsIGZhbHNlLCB0cnVlKTsKKwkJYWRkTlNJdGVtVG9R dWVyeShwc3RhdGUsIGxlZnRfbnNpdGVtLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CisKKwkJLyogQWRk IHJpZ2h0IHRhYmxlIHRvIHJ0YWJsZSBhbmQgbmFtZXNwYWNlICovCisJCXJpZ2h0X25zaXRlbSA9 IGFkZFJhbmdlVGFibGVFbnRyeUZvclJlbGF0aW9uKHBzdGF0ZSwgcmlnaHRfcmVsLAorCQkJCQkJ CQkJCQkJCSBBY2Nlc3NTaGFyZUxvY2ssCisJCQkJCQkJCQkJCQkJIHJyZWwtPmFsaWFzLCBmYWxz ZSwgdHJ1ZSk7CisJCWFkZE5TSXRlbVRvUXVlcnkocHN0YXRlLCByaWdodF9uc2l0ZW0sIGZhbHNl LCB0cnVlLCB0cnVlKTsKKworCQkvKgorCQkgKiBUcmFuc2Zvcm0gdGhlIGpvaW4gcXVhbHMgc28g dGhleSBiZWNvbWUgVmFyIG5vZGVzLiBUaGlzIGlzCisJCSAqIG5lY2Vzc2FyeSBmb3IgZXh0cmFj dF9qb2luX2NvbHVtbnMoKSB0byB3b3JrLgorCQkgKi8KKwkJaWYgKGpvaW4tPnF1YWxzKQorCQl7 CisJCQlqb2luLT5xdWFscyA9IHRyYW5zZm9ybUV4cHIocHN0YXRlLCBqb2luLT5xdWFscywgRVhQ Ul9LSU5EX0pPSU5fT04pOworCQkJYXNzaWduX2V4cHJfY29sbGF0aW9ucyhwc3RhdGUsIGpvaW4t PnF1YWxzKTsKKwkJfQorCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBQdXQgdGhlIHBhcmVudCB0 YWJsZSBpbnRvIHRoZSBydGFibGUgc28gdGhhdCB0aGUgZXhwcmVzc2lvbnMgY2FuCisJCSAqIHJl ZmVyIHRvIGl0cyBmaWVsZHMgd2l0aG91dCBxdWFsaWZpY2F0aW9uLiAgQ2FsbGVyIGlzIHJlc3Bv bnNpYmxlCisJCSAqIGZvciBsb2NraW5nIHJlbGF0aW9uLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBv cGVuIGl0LgorCQkgKi8KKwkJcmVsID0gcmVsYXRpb25fb3BlbihyZWxpZCwgTm9Mb2NrKTsKKwkJ bnNpdGVtID0gYWRkUmFuZ2VUYWJsZUVudHJ5Rm9yUmVsYXRpb24ocHN0YXRlLCByZWwsCisJCQkJ CQkJCQkJCSAgIEFjY2Vzc1NoYXJlTG9jaywKKwkJCQkJCQkJCQkJICAgTlVMTCwgZmFsc2UsIHRy dWUpOworCisJCS8qIG5vIHRvIGpvaW4gbGlzdCwgeWVzIHRvIG5hbWVzcGFjZXMgKi8KKwkJYWRk TlNJdGVtVG9RdWVyeShwc3RhdGUsIG5zaXRlbSwgZmFsc2UsIHRydWUsIHRydWUpOworCX0KIAog CS8qIHRha2UgY2FyZSBvZiBhbnkgZXhwcmVzc2lvbnMgKi8KIAlmb3JlYWNoKGwsIHN0bXQtPmV4 cHJzKQpAQCAtMzE5NCwxOSArMzI1OSwzNiBAQCB0cmFuc2Zvcm1TdGF0c1N0bXQoT2lkIHJlbGlk LCBDcmVhdGVTdGF0c1N0bXQgKnN0bXQsIGNvbnN0IGNoYXIgKnF1ZXJ5U3RyaW5nKQogCQl9CiAJ fQogCi0JLyoKLQkgKiBDaGVjayB0aGF0IG9ubHkgdGhlIGJhc2UgcmVsIGlzIG1lbnRpb25lZC4g IChUaGlzIHNob3VsZCBiZSBkZWFkIGNvZGUKLQkgKiBub3cgdGhhdCBhZGRfbWlzc2luZ19mcm9t IGlzIGhpc3RvcnkuKQotCSAqLwotCWlmIChsaXN0X2xlbmd0aChwc3RhdGUtPnBfcnRhYmxlKSAh PSAxKQotCQllcmVwb3J0KEVSUk9SLAotCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9DT0xV TU5fUkVGRVJFTkNFKSwKLQkJCQkgZXJybXNnKCJzdGF0aXN0aWNzIGV4cHJlc3Npb25zIGNhbiBy ZWZlciBvbmx5IHRvIHRoZSB0YWJsZSBiZWluZyByZWZlcmVuY2VkIikpKTsKKwlpZiAoIWlzam9p bikKKwl7CisJCS8qCisJCSAqIENoZWNrIHRoYXQgb25seSB0aGUgYmFzZSByZWwgaXMgbWVudGlv bmVkLiAgKFRoaXMgc2hvdWxkIGJlIGRlYWQKKwkJICogY29kZSBub3cgdGhhdCBhZGRfbWlzc2lu Z19mcm9tIGlzIGhpc3RvcnkuKQorCQkgKi8KKwkJaWYgKGxpc3RfbGVuZ3RoKHBzdGF0ZS0+cF9y dGFibGUpICE9IDEpCisJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkoZXJyY29kZShFUlJDT0RFX0lO VkFMSURfQ09MVU1OX1JFRkVSRU5DRSksCisJCQkJCSBlcnJtc2coInN0YXRpc3RpY3MgZXhwcmVz c2lvbnMgY2FuIHJlZmVyIG9ubHkgdG8gdGhlIHRhYmxlIGJlaW5nIHJlZmVyZW5jZWQiKSkpOwog Ci0JZnJlZV9wYXJzZXN0YXRlKHBzdGF0ZSk7CisJCS8qIENsb3NlIHJlbGF0aW9uICovCisJCXRh YmxlX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogRm9yIGV4 dGVuZGVkIGpvaW4gc3RhdHMsIHdlIGV4cGVjdCBleGFjdGx5IDIgdGFibGVzIGluIHRoZSBydGFi bGUuCisJCSAqLworCQlpZiAobGlzdF9sZW5ndGgocHN0YXRlLT5wX3J0YWJsZSkgIT0gMikKKwkJ CWVyZXBvcnQoRVJST1IsCisJCQkJCShlcnJjb2RlKEVSUkNPREVfSU5WQUxJRF9DT0xVTU5fUkVG RVJFTkNFKSwKKwkJCQkJIGVycm1zZygiZXh0ZW5kZWQgam9pbiBzdGF0aXN0aWNzIG11c3QgcmVm ZXJlbmNlIGV4YWN0bHkgdHdvIHRhYmxlcyIpKSk7CiAKLQkvKiBDbG9zZSByZWxhdGlvbiAqLwot CXRhYmxlX2Nsb3NlKHJlbCwgTm9Mb2NrKTsKKwkJLyogQ2xvc2UgcmVsYXRpb25zICovCisJCXRh YmxlX2Nsb3NlKGxlZnRfcmVsLCBOb0xvY2spOworCQl0YWJsZV9jbG9zZShyaWdodF9yZWwsIE5v TG9jayk7CisJfQorCisJZnJlZV9wYXJzZXN0YXRlKHBzdGF0ZSk7CiAKIAkvKiBNYXJrIHN0YXRl bWVudCBhcyBzdWNjZXNzZnVsbHkgdHJhbnNmb3JtZWQgKi8KIAlzdG10LT50cmFuc2Zvcm1lZCA9 IHRydWU7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL01ha2VmaWxlIGIvc3Jj L2JhY2tlbmQvc3RhdGlzdGljcy9NYWtlZmlsZQppbmRleCA3ZmY1OTM4YjAyNy4uOTYzOWUwYjk1 ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvTWFrZWZpbGUKKysrIGIvc3Jj L2JhY2tlbmQvc3RhdGlzdGljcy9NYWtlZmlsZQpAQCAtMTcsNiArMTcsNyBAQCBPQkpTID0gXAog CWRlcGVuZGVuY2llcy5vIFwKIAlleHRlbmRlZF9zdGF0cy5vIFwKIAlleHRlbmRlZF9zdGF0c19m dW5jcy5vIFwKKwlqb2luX21jdi5vIFwKIAltY3YubyBcCiAJbXZkaXN0aW5jdC5vIFwKIAlyZWxh dGlvbl9zdGF0cy5vIFwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5k ZWRfc3RhdHMuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvZXh0ZW5kZWRfc3RhdHMuYwppbmRl eCAzODk1ZWQ3MmVmNy4uODkzOWY1NmNjNjcgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0YXRp c3RpY3MvZXh0ZW5kZWRfc3RhdHMuYworKysgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVu ZGVkX3N0YXRzLmMKQEAgLTcwLDE1ICs3MCwxOCBAQCB0eXBlZGVmIHN0cnVjdCBTdGF0RXh0RW50 cnkKIAlMaXN0CSAgICp0eXBlczsJCQkvKiAnY2hhcicgbGlzdCBvZiBlbmFibGVkIHN0YXRpc3Rp Y3Mga2luZHMgKi8KIAlpbnQJCQlzdGF0dGFyZ2V0OwkJLyogc3RhdGlzdGljcyB0YXJnZXQgKC0x IGZvciBkZWZhdWx0KSAqLwogCUxpc3QJICAgKmV4cHJzOwkJCS8qIGV4cHJlc3Npb25zICovCisK KwkvKiBqb2luIHN0YXRpc3RpY3MgZmllbGRzIChOVUxML2ludmFsaWQgZm9yIHNpbmdsZS10YWJs ZSBzdGF0cykgKi8KKwlPaWQJCQlvdGhlcnJlbDsJCS8qIG90aGVyIHRhYmxlJ3MgT0lEIChmb3Ig am9pbiBzdGF0cykgKi8KKwlpbnQydmVjdG9yICpqb2lua2V5czsJCS8qIGpvaW4ga2V5cyBbdGFy Z2V0X2pvaW5rZXksIG90aGVyX2pvaW5rZXldICovCiB9IFN0YXRFeHRFbnRyeTsKIAogCiBzdGF0 aWMgTGlzdCAqZmV0Y2hfc3RhdGVudHJpZXNfZm9yX3JlbGF0aW9uKFJlbGF0aW9uIHBnX3N0YXRl eHQsIE9pZCByZWxpZCk7CiBzdGF0aWMgVmFjQXR0clN0YXRzICoqbG9va3VwX3Zhcl9hdHRyX3N0 YXRzKEJpdG1hcHNldCAqYXR0cnMsIExpc3QgKmV4cHJzLAogCQkJCQkJCQkJCQlpbnQgbnZhY2F0 dHMsIFZhY0F0dHJTdGF0cyAqKnZhY2F0dHMpOwotc3RhdGljIHZvaWQgc3RhdGV4dF9zdG9yZShP aWQgc3RhdE9pZCwgYm9vbCBpbmgsCi0JCQkJCQkgIE1WTkRpc3RpbmN0ICpuZGlzdGluY3QsIE1W RGVwZW5kZW5jaWVzICpkZXBlbmRlbmNpZXMsCi0JCQkJCQkgIE1DVkxpc3QgKm1jdiwgRGF0dW0g ZXhwcnMsIFZhY0F0dHJTdGF0cyAqKnN0YXRzKTsKK3N0YXRpYyB2b2lkIHN0YXRleHRfc3RvcmUo T2lkIHN0YXRPaWQsIGJvb2wgaW5oLCBNVk5EaXN0aW5jdCAqbmRpc3RpbmN0LCBNVkRlcGVuZGVu Y2llcyAqZGVwZW5kZW5jaWVzLCBNQ1ZMaXN0ICptY3YsIERhdHVtIGV4cHJzLAorCQkJCQkJICBW YWNBdHRyU3RhdHMgKipzdGF0cywgSm9pbk1DVkxpc3QgKiBqb2luX21jdik7CiBzdGF0aWMgaW50 CXN0YXRleHRfY29tcHV0ZV9zdGF0dGFyZ2V0KGludCBzdGF0dGFyZ2V0LAogCQkJCQkJCQkJICAg aW50IG5hdHRycywgVmFjQXR0clN0YXRzICoqc3RhdHMpOwogCkBAIC05OSw2ICsxMDIsMzMgQEAg c3RhdGljIFN0YXRzQnVpbGREYXRhICptYWtlX2J1aWxkX2RhdGEoUmVsYXRpb24gcmVsLCBTdGF0 RXh0RW50cnkgKnN0YXQsCiAJCQkJCQkJCQkgICBpbnQgbnVtcm93cywgSGVhcFR1cGxlICpyb3dz LAogCQkJCQkJCQkJICAgVmFjQXR0clN0YXRzICoqc3RhdHMsIGludCBzdGF0dGFyZ2V0KTsKIAor LyoKKyAqIGJtc190b19pbnQydmVjdG9yCisgKgkJQ29udmVydCBhIEJpdG1hcHNldCB0byBhbiBp bnQydmVjdG9yLgorICoKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgQml0bWFwc2V0IGlzIGVtcHR5 IG9yIE5VTEwuCisgKiBUaGUgcmVzdWx0IGlzIHBhbGxvYydkIGluIHRoZSBjdXJyZW50IG1lbW9y eSBjb250ZXh0LgorICovCitzdGF0aWMgaW50MnZlY3RvciAqCitibXNfdG9faW50MnZlY3RvcihC aXRtYXBzZXQgKmJtcykKK3sKKwlpbnQJCQlubWVtYmVyczsKKwlpbnQxNgkgICAqYXR0bnVtczsK KwlpbnQJCQlpID0gMDsKKwlpbnQJCQlrID0gLTE7CisKKwlpZiAoYm1zX2lzX2VtcHR5KGJtcykp CisJCXJldHVybiBOVUxMOworCisJbm1lbWJlcnMgPSBibXNfbnVtX21lbWJlcnMoYm1zKTsKKwlh dHRudW1zID0gcGFsbG9jKG5tZW1iZXJzICogc2l6ZW9mKGludDE2KSk7CisKKwl3aGlsZSAoKGsg PSBibXNfbmV4dF9tZW1iZXIoYm1zLCBrKSkgPj0gMCkKKwkJYXR0bnVtc1tpKytdID0gKGludDE2 KSBrOworCisJcmV0dXJuIGJ1aWxkaW50MnZlY3RvcihhdHRudW1zLCBubWVtYmVycyk7Cit9CisK IAogLyoKICAqIENvbXB1dGUgcmVxdWVzdGVkIGV4dGVuZGVkIHN0YXRzLCB1c2luZyB0aGUgcm93 cyBzYW1wbGVkIGZvciB0aGUgcGxhaW4KQEAgLTE1NSw2ICsxODUsNyBAQCBCdWlsZFJlbGF0aW9u RXh0U3RhdGlzdGljcyhSZWxhdGlvbiBvbmVyZWwsIGJvb2wgaW5oLCBkb3VibGUgdG90YWxyb3dz LAogCQlNVk5EaXN0aW5jdCAqbmRpc3RpbmN0ID0gTlVMTDsKIAkJTVZEZXBlbmRlbmNpZXMgKmRl cGVuZGVuY2llcyA9IE5VTEw7CiAJCU1DVkxpc3QgICAgKm1jdiA9IE5VTEw7CisJCUpvaW5NQ1ZM aXN0ICpqb2luX21jdiA9IE5VTEw7CiAJCURhdHVtCQlleHByc3RhdHMgPSAoRGF0dW0pIDA7CiAJ CVZhY0F0dHJTdGF0cyAqKnN0YXRzOwogCQlMaXN0Q2VsbCAgICpsYzI7CkBAIC0xNjQsMTAgKzE5 NSwxNCBAQCBCdWlsZFJlbGF0aW9uRXh0U3RhdGlzdGljcyhSZWxhdGlvbiBvbmVyZWwsIGJvb2wg aW5oLCBkb3VibGUgdG90YWxyb3dzLAogCQkvKgogCQkgKiBDaGVjayBpZiB3ZSBjYW4gYnVpbGQg dGhlc2Ugc3RhdHMgYmFzZWQgb24gdGhlIGNvbHVtbiBhbmFseXplZC4gSWYKIAkJICogbm90LCBy ZXBvcnQgdGhpcyBmYWN0IChleGNlcHQgaW4gYXV0b3ZhY3V1bSkgYW5kIG1vdmUgb24uCisJCSAq CisJCSAqIE5vdGU6IGpvaW4gbWN2IHN0YXRzIGRvbid0IGhhdmUgY29sdW1ucyBpbiB0aGUgcHJp bWFyeSB0YWJsZSwgc28KKwkJICogbG9va3VwX3Zhcl9hdHRyX3N0YXRzIHdpbGwgcmV0dXJuIE5V TEwuIFdlIGhhbmRsZSB0aGlzIGJlbG93LgogCQkgKi8KIAkJc3RhdHMgPSBsb29rdXBfdmFyX2F0 dHJfc3RhdHMoc3RhdC0+Y29sdW1ucywgc3RhdC0+ZXhwcnMsCiAJCQkJCQkJCQkgIG5hdHRzLCB2 YWNhdHRyc3RhdHMpOwotCQlpZiAoIXN0YXRzKQorCQlpZiAoIXN0YXRzICYmICEobGlzdF9sZW5n dGgoc3RhdC0+dHlwZXMpID09IDEgJiYKKwkJCQkJCWxpbml0aWFsX2ludChzdGF0LT50eXBlcykg PT0gU1RBVFNfRVhUX0pPSU5fTUNWKSkKIAkJewogCQkJaWYgKCFBbUF1dG9WYWN1dW1Xb3JrZXJQ cm9jZXNzKCkpCiAJCQkJZXJlcG9ydChXQVJOSU5HLApAQCAtMTgwLDIxICsyMTUsMzQgQEAgQnVp bGRSZWxhdGlvbkV4dFN0YXRpc3RpY3MoUmVsYXRpb24gb25lcmVsLCBib29sIGluaCwgZG91Ymxl IHRvdGFscm93cywKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJLyogY29tcHV0ZSBzdGF0aXN0aWNz IHRhcmdldCBmb3IgdGhpcyBzdGF0aXN0aWNzIG9iamVjdCAqLwotCQlzdGF0dGFyZ2V0ID0gc3Rh dGV4dF9jb21wdXRlX3N0YXR0YXJnZXQoc3RhdC0+c3RhdHRhcmdldCwKLQkJCQkJCQkJCQkJCWJt c19udW1fbWVtYmVycyhzdGF0LT5jb2x1bW5zKSwKLQkJCQkJCQkJCQkJCXN0YXRzKTsKLQogCQkv KgotCQkgKiBEb24ndCByZWJ1aWxkIHN0YXRpc3RpY3Mgb2JqZWN0cyB3aXRoIHN0YXRpc3RpY3Mg dGFyZ2V0IHNldCB0byAwCi0JCSAqICh3ZSBqdXN0IGxlYXZlIHRoZSBleGlzdGluZyB2YWx1ZXMg YXJvdW5kLCBqdXN0IGxpa2Ugd2UgZG8gZm9yCi0JCSAqIHJlZ3VsYXIgcGVyLWNvbHVtbiBzdGF0 aXN0aWNzKS4KKwkJICogSm9pbi1tY3Ygc3RhdHMgcmV1c2UgTUNWcyBhbHJlYWR5IGNvbXB1dGVk IGZvciB0aGUgam9pbiBjb2x1bW4sIHNvCisJCSAqIG5vIHNlcGFyYXRlIHN0YXR0YXJnZXQgb3Ig U3RhdHNCdWlsZERhdGEgaXMgbmVlZGVkLgogCQkgKi8KLQkJaWYgKHN0YXR0YXJnZXQgPT0gMCkK LQkJCWNvbnRpbnVlOworCQlpZiAobGlzdF9sZW5ndGgoc3RhdC0+dHlwZXMpID09IDEgJiYKKwkJ CWxpbml0aWFsX2ludChzdGF0LT50eXBlcykgPT0gU1RBVFNfRVhUX0pPSU5fTUNWKQorCQl7CisJ CQlzdGF0dGFyZ2V0ID0gLTE7CisJCQlkYXRhID0gTlVMTDsKKwkJfQorCQllbHNlCisJCXsKKwkJ CS8qIGNvbXB1dGUgc3RhdGlzdGljcyB0YXJnZXQgZm9yIHRoaXMgc3RhdGlzdGljcyBvYmplY3Qg Ki8KKwkJCXN0YXR0YXJnZXQgPSBzdGF0ZXh0X2NvbXB1dGVfc3RhdHRhcmdldChzdGF0LT5zdGF0 dGFyZ2V0LAorCQkJCQkJCQkJCQkJCWJtc19udW1fbWVtYmVycyhzdGF0LT5jb2x1bW5zKSwKKwkJ CQkJCQkJCQkJCQlzdGF0cyk7CisKKwkJCS8qCisJCQkgKiBEb24ndCByZWJ1aWxkIHN0YXRpc3Rp Y3Mgb2JqZWN0cyB3aXRoIHN0YXRpc3RpY3MgdGFyZ2V0IHNldCB0bworCQkJICogMCAod2UganVz dCBsZWF2ZSB0aGUgZXhpc3RpbmcgdmFsdWVzIGFyb3VuZCwganVzdCBsaWtlIHdlIGRvCisJCQkg KiBmb3IgcmVndWxhciBwZXItY29sdW1uIHN0YXRpc3RpY3MpLgorCQkJICovCisJCQlpZiAoc3Rh dHRhcmdldCA9PSAwKQorCQkJCWNvbnRpbnVlOwogCi0JCS8qIGV2YWx1YXRlIGV4cHJlc3Npb25z IChpZiB0aGUgc3RhdGlzdGljcyBvYmplY3QgaGFzIGFueSkgKi8KLQkJZGF0YSA9IG1ha2VfYnVp bGRfZGF0YShvbmVyZWwsIHN0YXQsIG51bXJvd3MsIHJvd3MsIHN0YXRzLCBzdGF0dGFyZ2V0KTsK KwkJCS8qIGV2YWx1YXRlIGV4cHJlc3Npb25zIChpZiB0aGUgc3RhdGlzdGljcyBvYmplY3QgaGFz IGFueSkgKi8KKwkJCWRhdGEgPSBtYWtlX2J1aWxkX2RhdGEob25lcmVsLCBzdGF0LCBudW1yb3dz LCByb3dzLCBzdGF0cywgc3RhdHRhcmdldCk7CisJCX0KIAogCQkvKiBjb21wdXRlIHN0YXRpc3Rp YyBvZiBlYWNoIHJlcXVlc3RlZCB0eXBlICovCiAJCWZvcmVhY2gobGMyLCBzdGF0LT50eXBlcykK QEAgLTIyMywxMSArMjcxLDQ2IEBAIEJ1aWxkUmVsYXRpb25FeHRTdGF0aXN0aWNzKFJlbGF0aW9u IG9uZXJlbCwgYm9vbCBpbmgsIGRvdWJsZSB0b3RhbHJvd3MsCiAKIAkJCQlleHByc3RhdHMgPSBz ZXJpYWxpemVfZXhwcl9zdGF0cyhleHByZGF0YSwgbmV4cHJzKTsKIAkJCX0KKwkJCWVsc2UgaWYg KHQgPT0gU1RBVFNfRVhUX0pPSU5fTUNWKQorCQkJeworCQkJCWludDJ2ZWN0b3IgKmZpbHRlcl9h dHRudW1zOworCisJCQkJaWYgKCFPaWRJc1ZhbGlkKHN0YXQtPm90aGVycmVsKSkKKwkJCQl7CisJ CQkJCWVsb2coV0FSTklORywgInNraXBwaW5nIGpvaW4gbWN2IHN0YXQgXCIlcy4lc1wiOiBtaXNz aW5nIG90aGVycmVsIiwKKwkJCQkJCSBzdGF0LT5zY2hlbWEsIHN0YXQtPm5hbWUpOworCQkJCQlj b250aW51ZTsKKwkJCQl9CisKKwkJCQlpZiAoIXN0YXQtPmpvaW5rZXlzIHx8IHN0YXQtPmpvaW5r ZXlzLT5kaW0xICE9IDIpCisJCQkJeworCQkJCQllbG9nKFdBUk5JTkcsICJza2lwcGluZyBqb2lu IG1jdiBzdGF0IFwiJXMuJXNcIjogaW52YWxpZCBqb2lua2V5cyIsCisJCQkJCQkgc3RhdC0+c2No ZW1hLCBzdGF0LT5uYW1lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogQ29udmVy dCBjb2x1bW5zIEJpdG1hcHNldCB0byBpbnQydmVjdG9yIGZvciBmaWx0ZXIgYXR0bnVtcyAqLwor CQkJCWZpbHRlcl9hdHRudW1zID0gYm1zX3RvX2ludDJ2ZWN0b3Ioc3RhdC0+Y29sdW1ucyk7CisK KwkJCQlqb2luX21jdiA9IHN0YXRleHRfam9pbl9tY3ZfYnVpbGQoc3RhdC0+c3RhdE9pZCwKKwkJ CQkJCQkJCQkJCSAgUmVsYXRpb25HZXRSZWxpZChvbmVyZWwpLAorCQkJCQkJCQkJCQkJICBzdGF0 LT5vdGhlcnJlbCwKKwkJCQkJCQkJCQkJCSAgc3RhdC0+am9pbmtleXMsCisJCQkJCQkJCQkJCQkg IGZpbHRlcl9hdHRudW1zLAorCQkJCQkJCQkJCQkJICBudW1yb3dzLAorCQkJCQkJCQkJCQkJICBy b3dzLAorCQkJCQkJCQkJCQkJICBuYXR0cywKKwkJCQkJCQkJCQkJCSAgdmFjYXR0cnN0YXRzKTsK KworCQkJCWlmIChmaWx0ZXJfYXR0bnVtcykKKwkJCQkJcGZyZWUoZmlsdGVyX2F0dG51bXMpOwor CQkJfQogCQl9CiAKIAkJLyogc3RvcmUgdGhlIHN0YXRpc3RpY3MgaW4gdGhlIGNhdGFsb2cgKi8K IAkJc3RhdGV4dF9zdG9yZShzdGF0LT5zdGF0T2lkLCBpbmgsCi0JCQkJCSAgbmRpc3RpbmN0LCBk ZXBlbmRlbmNpZXMsIG1jdiwgZXhwcnN0YXRzLCBzdGF0cyk7CisJCQkJCSAgbmRpc3RpbmN0LCBk ZXBlbmRlbmNpZXMsIG1jdiwgZXhwcnN0YXRzLAorCQkJCQkgIHN0YXRzLCBqb2luX21jdik7CiAK IAkJLyogZm9yIHJlcG9ydGluZyBwcm9ncmVzcyAqLwogCQlwZ3N0YXRfcHJvZ3Jlc3NfdXBkYXRl X3BhcmFtKFBST0dSRVNTX0FOQUxZWkVfRVhUX1NUQVRTX0NPTVBVVEVELApAQCAtNDA1LDYgKzQ4 OCwxMCBAQCBzdGF0ZXh0X2lzX2tpbmRfYnVpbHQoSGVhcFR1cGxlIGh0dXAsIGNoYXIgdHlwZSkK IAkJCWF0dG51bSA9IEFudW1fcGdfc3RhdGlzdGljX2V4dF9kYXRhX3N0eGRleHByOwogCQkJYnJl YWs7CiAKKwkJY2FzZSBTVEFUU19FWFRfSk9JTl9NQ1Y6CisJCQlhdHRudW0gPSBBbnVtX3BnX3N0 YXRpc3RpY19leHRfZGF0YV9zdHhkam9pbm1jdjsKKwkJCWJyZWFrOworCiAJCWRlZmF1bHQ6CiAJ CQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCBzdGF0aXN0aWNzIHR5cGUgcmVxdWVzdGVkOiAlZCIs IHR5cGUpOwogCX0KQEAgLTQ3NCw3ICs1NjEsOCBAQCBmZXRjaF9zdGF0ZW50cmllc19mb3JfcmVs YXRpb24oUmVsYXRpb24gcGdfc3RhdGV4dCwgT2lkIHJlbGlkKQogCQkJQXNzZXJ0KChlbmFibGVk W2ldID09IFNUQVRTX0VYVF9ORElTVElOQ1QpIHx8CiAJCQkJICAgKGVuYWJsZWRbaV0gPT0gU1RB VFNfRVhUX0RFUEVOREVOQ0lFUykgfHwKIAkJCQkgICAoZW5hYmxlZFtpXSA9PSBTVEFUU19FWFRf TUNWKSB8fAotCQkJCSAgIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9FWFBSRVNTSU9OUykpOwor CQkJCSAgIChlbmFibGVkW2ldID09IFNUQVRTX0VYVF9FWFBSRVNTSU9OUykgfHwKKwkJCQkgICAo ZW5hYmxlZFtpXSA9PSBTVEFUU19FWFRfSk9JTl9NQ1YpKTsKIAkJCWVudHJ5LT50eXBlcyA9IGxh cHBlbmRfaW50KGVudHJ5LT50eXBlcywgKGludCkgZW5hYmxlZFtpXSk7CiAJCX0KIApAQCAtNTA3 LDYgKzU5NSwyNyBAQCBmZXRjaF9zdGF0ZW50cmllc19mb3JfcmVsYXRpb24oUmVsYXRpb24gcGdf c3RhdGV4dCwgT2lkIHJlbGlkKQogCiAJCWVudHJ5LT5leHBycyA9IGV4cHJzOwogCisJCS8qCisJ CSAqIEZldGNoIGpvaW4gc3RhdGlzdGljcyBmaWVsZHMgKHN0eG90aGVycmVsLCBzdHhqb2lua2V5 cykuIFRoZXNlIGFyZQorCQkgKiBOVUxML2ludmFsaWQgZm9yIHNpbmdsZS10YWJsZSBzdGF0aXN0 aWNzLgorCQkgKi8KKwkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoU1RBVEVYVE9JRCwgaHR1cCwK KwkJCQkJCQkJQW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eG90aGVycmVsLCAmaXNudWxsKTsKKwkJ ZW50cnktPm90aGVycmVsID0gaXNudWxsID8gSW52YWxpZE9pZCA6IERhdHVtR2V0T2JqZWN0SWQo ZGF0dW0pOworCisJCWRhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFNUQVRFWFRPSUQsIGh0dXAsCisJ CQkJCQkJCUFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhqb2lua2V5cywgJmlzbnVsbCk7CisJCWlm ICghaXNudWxsKQorCQl7CisJCQkvKiBDb3B5IHRoZSBpbnQydmVjdG9yIHNvIGl0IHN1cnZpdmVz IGNhdGFsb2cgY2FjaGUgaW52YWxpZGF0aW9uICovCisJCQlpbnQydmVjdG9yICpvcmlnID0gKGlu dDJ2ZWN0b3IgKikgRGF0dW1HZXRQb2ludGVyKGRhdHVtKTsKKworCQkJZW50cnktPmpvaW5rZXlz ID0gKGludDJ2ZWN0b3IgKikgcGFsbG9jKFZBUlNJWkUob3JpZykpOworCQkJbWVtY3B5KGVudHJ5 LT5qb2lua2V5cywgb3JpZywgVkFSU0laRShvcmlnKSk7CisJCX0KKwkJZWxzZQorCQkJZW50cnkt PmpvaW5rZXlzID0gTlVMTDsKKwogCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgZW50cnkpOwog CX0KIApAQCAtNzU2LDkgKzg2NSw4IEBAIGxvb2t1cF92YXJfYXR0cl9zdGF0cyhCaXRtYXBzZXQg KmF0dHJzLCBMaXN0ICpleHBycywKICAqCXR1cGxlLgogICovCiBzdGF0aWMgdm9pZAotc3RhdGV4 dF9zdG9yZShPaWQgc3RhdE9pZCwgYm9vbCBpbmgsCi0JCQkgIE1WTkRpc3RpbmN0ICpuZGlzdGlu Y3QsIE1WRGVwZW5kZW5jaWVzICpkZXBlbmRlbmNpZXMsCi0JCQkgIE1DVkxpc3QgKm1jdiwgRGF0 dW0gZXhwcnMsIFZhY0F0dHJTdGF0cyAqKnN0YXRzKQorc3RhdGV4dF9zdG9yZShPaWQgc3RhdE9p ZCwgYm9vbCBpbmgsIE1WTkRpc3RpbmN0ICpuZGlzdGluY3QsIE1WRGVwZW5kZW5jaWVzICpkZXBl bmRlbmNpZXMsIE1DVkxpc3QgKm1jdiwgRGF0dW0gZXhwcnMsCisJCQkgIFZhY0F0dHJTdGF0cyAq KnN0YXRzLCBKb2luTUNWTGlzdCAqIGpvaW5fbWN2KQogewogCVJlbGF0aW9uCXBnX3N0ZXh0ZGF0 YTsKIAlIZWFwVHVwbGUJc3R1cDsKQEAgLTgwOCw2ICs5MTYsMTMgQEAgc3RhdGV4dF9zdG9yZShP aWQgc3RhdE9pZCwgYm9vbCBpbmgsCiAJCW51bGxzW0FudW1fcGdfc3RhdGlzdGljX2V4dF9kYXRh X3N0eGRleHByIC0gMV0gPSBmYWxzZTsKIAkJdmFsdWVzW0FudW1fcGdfc3RhdGlzdGljX2V4dF9k YXRhX3N0eGRleHByIC0gMV0gPSBleHByczsKIAl9CisJaWYgKGpvaW5fbWN2ICE9IE5VTEwpCisJ eworCQlieXRlYQkgICAqZGF0YSA9IHN0YXRleHRfam9pbl9tY3Zfc2VyaWFsaXplKGpvaW5fbWN2 KTsKKworCQludWxsc1tBbnVtX3BnX3N0YXRpc3RpY19leHRfZGF0YV9zdHhkam9pbm1jdiAtIDFd ID0gKGRhdGEgPT0gTlVMTCk7CisJCXZhbHVlc1tBbnVtX3BnX3N0YXRpc3RpY19leHRfZGF0YV9z dHhkam9pbm1jdiAtIDFdID0gUG9pbnRlckdldERhdHVtKGRhdGEpOworCX0KIAogCS8qCiAJICog RGVsZXRlIHRoZSBvbGQgdHVwbGUgaWYgaXQgZXhpc3RzLCBhbmQgaW5zZXJ0IGEgbmV3IG9uZS4g SXQncyBlYXNpZXIKQEAgLTE5NzMsNiArMjA4OCw4NyBAQCBzdGF0ZXh0X21jdl9jbGF1c2VsaXN0 X3NlbGVjdGl2aXR5KFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpjbGF1c2VzLCBpbnQgdmFyUmVs aQogCXJldHVybiBzZWw7CiB9CiAKKy8qCisgKiBzdGF0ZXh0X2pvaW5fbWN2X2NsYXVzZWxpc3Rf c2VsZWN0aXZpdHkKKyAqCQlFc3RpbWF0ZSBzZWxlY3Rpdml0eSB1c2luZyBleHRlbmRlZCBzdGF0 aXN0aWNzIGZvciBqb2lucy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgY2FzZXMgd2hl cmUgY2xhdXNlcyBpbnZvbHZlIGV4YWN0bHkgdHdvIGJhc2UgcmVsYXRpb25zOgorICogLSBSZWd1 bGFyIGpvaW5zICh2YXJSZWxpZCA9PSAwKQorICogLSBQYXJhbWV0ZXJpemVkIHBhdGhzICh2YXJS ZWxpZCAhPSAwLCBidXQgY2xhdXNlcyByZWZlcmVuY2UgMiByZWxhdGlvbnMpCisgKgorICogUmV0 dXJucyBzZWxlY3Rpdml0eSBpZiBqb2luIHN0YXRzIHdlcmUgc3VjY2Vzc2Z1bGx5IGFwcGxpZWQs IG9yIDEuMCBvdGhlcndpc2UuCisgKiAnZXN0aW1hdGVkY2xhdXNlcycgaXMgcG9wdWxhdGVkIHdp dGggdGhlIDAtYmFzZWQgbGlzdCBwb3NpdGlvbiBpbmRleGVzIG9mCisgKiBjbGF1c2VzIHdob3Nl IHNlbGVjdGl2aXR5IHdhcyBlc3RpbWF0ZWQgaGVyZS4gVGhlIGNhbGxlciBzaG91bGQgc2tpcCB0 aGVzZQorICogY2xhdXNlcyB0byBhdm9pZCBkb3VibGUtY291bnRpbmcuCisgKi8KK1NlbGVjdGl2 aXR5CitzdGF0ZXh0X2pvaW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkoUGxhbm5lckluZm8g KnJvb3QsCisJCQkJCQkJCQkJTGlzdCAqY2xhdXNlcywKKwkJCQkJCQkJCQlpbnQgdmFyUmVsaWQs CisJCQkJCQkJCQkJQml0bWFwc2V0ICoqZXN0aW1hdGVkY2xhdXNlcykKK3sKKwlKb2luTUNWT3Bw b3J0dW5pdHkgKmpvaW5fb3BwOworCisJLyogVHJ5IHRvIGRldGVjdCBqb2luIE1DViBvcHBvcnR1 bml0eSBmcm9tIGNsYXVzZXMgKi8KKwlqb2luX29wcCA9IGZpbmRfam9pbl9tY3Zfb3Bwb3J0dW5p dHlfaW5fY2xhdXNlcyhyb290LCBjbGF1c2VzKTsKKworCWlmIChqb2luX29wcCkKKwl7CisJCUpv aW5NQ1ZMaXN0ICpqb2luX21jdjsKKwkJU2VsZWN0aXZpdHkgc2VsZWMgPSAwLjA7CisKKwkJam9p bl9tY3YgPSBzdGF0ZXh0X2pvaW5fbWN2X2xvYWQoam9pbl9vcHAtPnRhcmdldF9yZWwsCisJCQkJ CQkJCQkJIGpvaW5fb3BwLT50YXJnZXRfam9pbmtleSwKKwkJCQkJCQkJCQkgam9pbl9vcHAtPm90 aGVyX3JlbCwKKwkJCQkJCQkJCQkgam9pbl9vcHAtPm90aGVyX2pvaW5rZXksCisJCQkJCQkJCQkJ IGpvaW5fb3BwLT5maWx0ZXJfYXR0bnVtcyk7CisJCWlmIChqb2luX21jdikKKwkJeworCQkJc2Vs ZWMgPSBqb2luX21jdl9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5KGpvaW5fbWN2LAorCQkJCQkJCQkJ CQkJCWpvaW5fb3BwLT5maWx0ZXJfdmFsdWVzLAorCQkJCQkJCQkJCQkJCWpvaW5fb3BwLT5maWx0 ZXJfYXR0bnVtcywKKwkJCQkJCQkJCQkJCQlqb2luX29wcC0+Y29sbGF0aW9uKTsKKwkJCXBmcmVl KGpvaW5fbWN2KTsKKwkJfQorCisJCWlmIChzZWxlYyA+IDAgJiYgc2VsZWMgPCAxLjApCisJCXsK KwkJCWludAkJCWNsYXVzZV9pZHg7CisJCQlMaXN0Q2VsbCAgICpsYzsKKworCQkJLyoKKwkJCSAq IE1hcmsgdGhlIGpvaW4gYW5kIGZpbHRlciBjbGF1c2VzIGFzIGVzdGltYXRlZCBzbyB0aGV5IHdv bid0IGJlCisJCQkgKiBkb3VibGUtY291bnRlZCBpbiB0aGUgcGVyLWNsYXVzZSBsb29wLgorCQkJ ICovCisJCQljbGF1c2VfaWR4ID0gLTE7CisJCQlmb3JlYWNoKGxjLCBjbGF1c2VzKQorCQkJewor CQkJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSAoUmVzdHJpY3RJbmZvICopIGxmaXJzdChsYyk7CisK KwkJCQljbGF1c2VfaWR4Kys7CisKKwkJCQkvKiBNYXJrIGpvaW4gY2xhdXNlcyAqLworCQkJCWlm IChsaXN0X21lbWJlcl9wdHIoam9pbl9vcHAtPmpvaW5fcmluZm9zLCByaW5mbykpCisJCQkJewor CQkJCQkqZXN0aW1hdGVkY2xhdXNlcyA9IGJtc19hZGRfbWVtYmVyKCplc3RpbWF0ZWRjbGF1c2Vz LCBjbGF1c2VfaWR4KTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJLyogTWFyayBmaWx0 ZXIgY2xhdXNlcyAqLworCQkJCWlmIChsaXN0X21lbWJlcl9wdHIoam9pbl9vcHAtPmZpbHRlcl9y aW5mb3MsIHJpbmZvKSkKKwkJCQl7CisJCQkJCSplc3RpbWF0ZWRjbGF1c2VzID0gYm1zX2FkZF9t ZW1iZXIoKmVzdGltYXRlZGNsYXVzZXMsIGNsYXVzZV9pZHgpOworCQkJCX0KKwkJCX0KKworCQkJ cmV0dXJuIHNlbGVjOworCQl9CisJfQorCisJLyogTm8gam9pbiBzdGF0cyBhcHBsaWNhYmxlICov CisJcmV0dXJuIDEuMDsKK30KKwogLyoKICAqIHN0YXRleHRfY2xhdXNlbGlzdF9zZWxlY3Rpdml0 eQogICoJCUVzdGltYXRlIGNsYXVzZXMgdXNpbmcgdGhlIGJlc3QgbXVsdGktY29sdW1uIHN0YXRp c3RpY3MuCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRz X2Z1bmNzLmMgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2Z1bmNzLmMK aW5kZXggNDhmYTJlZmVlNzYuLmQ1OWYwM2I1NGMxIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9z dGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2Z1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlz dGljcy9leHRlbmRlZF9zdGF0c19mdW5jcy5jCkBAIC0zNzAsNiArMzcwLDcgQEAgZXh0ZW5kZWRf c3RhdGlzdGljc191cGRhdGUoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pCiAJbnVsbHNbQW51bV9w Z19zdGF0aXN0aWNfZXh0X2RhdGFfc3R4ZGRlcGVuZGVuY2llcyAtIDFdID0gdHJ1ZTsKIAludWxs c1tBbnVtX3BnX3N0YXRpc3RpY19leHRfZGF0YV9zdHhkbWN2IC0gMV0gPSB0cnVlOwogCW51bGxz W0FudW1fcGdfc3RhdGlzdGljX2V4dF9kYXRhX3N0eGRleHByIC0gMV0gPSB0cnVlOworCW51bGxz W0FudW1fcGdfc3RhdGlzdGljX2V4dF9kYXRhX3N0eGRqb2lubWN2IC0gMV0gPSB0cnVlOwogCiAJ LyoKIAkgKiBGb3IgZWFjaCBzdGF0cyBraW5kLCBkZXNlcmlhbGl6ZSB0aGUgZGF0YSBhdCBoYW5k IGFuZCBwZXJmb3JtIGEgcm91bmQKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3Mv am9pbl9tY3YuYyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3Mvam9pbl9tY3YuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uZWZjYTVjYzRjNDgKLS0tIC9kZXYvbnVsbAor KysgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL2pvaW5fbWN2LmMKQEAgLTAsMCArMSwxNDkzIEBA CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBqb2luX21jdi5jCisgKgkgIFBPU1RHUkVTIGpv aW4gTUNWIGxpc3RzCisgKgorICoKKyAqIFBvcnRpb25zIENvcHlyaWdodCAoYykgMTk5Ni0yMDI2 LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9wbWVudCBHcm91cAorICogUG9ydGlvbnMgQ29weXJp Z2h0IChjKSAxOTk0LCBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEKKyAq CisgKiBJREVOVElGSUNBVElPTgorICoJICBzcmMvYmFja2VuZC9zdGF0aXN0aWNzL2pvaW5fbWN2 LmMKKyAqCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzLmgiCisK KyNpbmNsdWRlICJhY2Nlc3MvZ2VuYW0uaCIKKyNpbmNsdWRlICJhY2Nlc3MvaGVhcGFtLmgiCisj aW5jbHVkZSAiYWNjZXNzL2h0dXBfZGV0YWlscy5oIgorI2luY2x1ZGUgImFjY2Vzcy90YWJsZS5o IgorI2luY2x1ZGUgImFjY2Vzcy90YWJsZWFtLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19hbS5o IgorI2luY2x1ZGUgImNhdGFsb2cvcGdfc3RhdGlzdGljX2V4dC5oIgorI2luY2x1ZGUgImNhdGFs b2cvcGdfc3RhdGlzdGljX2V4dF9kYXRhLmgiCisjaW5jbHVkZSAiY29tbWFuZHMvZGVmcmVtLmgi CisjaW5jbHVkZSAiZm1nci5oIgorI2luY2x1ZGUgImZ1bmNhcGkuaCIKKyNpbmNsdWRlICJub2Rl cy9ub2RlRnVuY3MuaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvcGF0aG5vZGUuaCIKKyNpbmNsdWRl ICJzdGF0aXN0aWNzL2V4dGVuZGVkX3N0YXRzX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhdGlz dGljcy9zdGF0aXN0aWNzLmgiCisjaW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKKyNpbmNsdWRlICJ1 dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2RhdHVtLmgiCisjaW5jbHVkZSAidXRp bHMvZm1ncnByb3Rvcy5oIgorI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1ZGUg InV0aWxzL3NuYXBtZ3IuaCIKKyNpbmNsdWRlICJ1dGlscy9zeXNjYWNoZS5oIgorI2luY2x1ZGUg InV0aWxzL2ZtZ3JvaWRzLmgiCisjaW5jbHVkZSAidXRpbHMvdHlwY2FjaGUuaCIKKworLyoKKyAq IHN0YXRleHRfam9pbl9tY3Zfc2VyaWFsaXplCisgKiAJCQlTZXJpYWxpemUgYSBKb2luTUNWTGlz dCBpbnRvIGJ5dGVhIGZvcm1hdCBmb3Igc3RvcmFnZQorICoKKyAqIFRoZSBvdmVyYWxsIHN0cnVj dHVyZSBvZiB0aGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBsb29rcyBsaWtlIHRoaXM6Cisg KgorICogKy0tLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0tLS0rCisgKiB8IGhlYWRlciAgfCBpdGVt cyB8IHZhcmxlbmEgIHwKKyAqICstLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tKworICoKKyAq IFRoZSBoZWFkZXIgY29udGFpbnMgbWFnaWMgbnVtYmVyLCB0eXBlLCBhbmQgZmlsdGVyIG1ldGFk YXRhIChudW1iZXIgb2YKKyAqIGZpbHRlcnMsIHR5cGUgT0lEcywgdHlwbGVucywgdHlwYnl2YWx0 eXBieXZhbHMpLiAgSXRlbXMgc3RvcmUgdGhlIGZyZXF1ZW5jeSB2YWx1ZXMKKyAqIHBsdXMgRGF0 dW0gYXJyYXlzLiAgRm9yIGVhY2ggRGF0dW0sIGJ5dmFsIHR5cGVzIGFyZSBzdG9yZWQgaW5saW5l IHdoaWxlCisgKiBub24tYnl2YWwgdHlwZXMgYXJlIHN0b3JlZCBhcyBvZmZzZXRzIGludG8gdGhl IHZhcmxlbmEgc2VjdGlvbiwgd2hpY2gKKyAqIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmFyaWFibGUt bGVuZ3RoIGRhdGEuCisgKgorICogVW5saWtlIHJlZ3VsYXIgTUNWIGxpc3RzIHdoaWNoIGRlZHVw bGljYXRlIHZhbHVlcyBhbmQgdXNlIGluZGV4ZXMgaW50bworICogc2VwYXJhdGUgYXJyYXlzLCBq b2luIE1DViBsaXN0cyBzdG9yZSBhbGwgdmFsdWVzIGRpcmVjdGx5IGluIGVhY2ggaXRlbS4KKyAq IER1cmluZyBzZXJpYWxpemF0aW9uLCBEYXR1bSBwb2ludGVycyBhcmUgY29udmVydGVkIHRvIG9m ZnNldHM7IGR1cmluZworICogZGVzZXJpYWxpemF0aW9uLCBvZmZzZXRzIGFyZSBjb252ZXJ0ZWQg YmFjayB0byBwb2ludGVycy4KKyAqLworYnl0ZWEgKgorc3RhdGV4dF9qb2luX21jdl9zZXJpYWxp emUoSm9pbk1DVkxpc3QgKiBtY3ZsaXN0KQoreworCWludAkJCWksCisJCQkJajsKKwlTaXplCQls ZW47CisJYnl0ZWEJICAgKnJlc3VsdDsKKwljaGFyCSAgICpwdHI7CisJY2hhcgkgICAqZGF0YV9w dHI7CisJU2l6ZQkJaGVhZGVyX2xlbjsKKwlBdHRyTnVtYmVyCW5maWx0ZXJzOworCisJaWYgKCFt Y3ZsaXN0IHx8IG1jdmxpc3QtPm5pdGVtcyA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCW5maWx0 ZXJzID0gbWN2bGlzdC0+bmRpbWVuc2lvbnM7CisKKwlBc3NlcnQobmZpbHRlcnMgPiAwICYmIG5m aWx0ZXJzIDw9IFNUQVRTX01BWF9ESU1FTlNJT05TKTsKKwlBc3NlcnQobWN2bGlzdC0+bml0ZW1z IDw9IE1BWF9TVEFUSVNUSUNTX1RBUkdFVCk7CisKKwkvKiBDYWxjdWxhdGUgaGVhZGVyIHNpemUg KHVwIHRvIGl0ZW1zIGFycmF5KSAqLworCWhlYWRlcl9sZW4gPSBvZmZzZXRvZihKb2luTUNWTGlz dCwgaXRlbXMpOworCisJLyogU3RhcnQgd2l0aCBoZWFkZXIgc2l6ZSAqLworCWxlbiA9IGhlYWRl cl9sZW47CisKKwkvKiBBZGQgc3BhY2UgZm9yIGl0ZW0gc3RydWN0cyAqLworCWxlbiArPSBtY3Zs aXN0LT5uaXRlbXMgKiBzaXplb2YoSm9pbk1DVkl0ZW0pOworCisJLyogQWRkIHNwYWNlIGZvciBp c251bGwgYXJyYXlzIChvbmUgcGVyIGl0ZW0pICovCisJbGVuICs9IG1jdmxpc3QtPm5pdGVtcyAq IG5maWx0ZXJzICogc2l6ZW9mKGJvb2wpOworCisJLyogQWRkIHNwYWNlIGZvciB2YWx1ZXMgYXJy YXlzIChvbmUgcGVyIGl0ZW0pICovCisJbGVuICs9IG1jdmxpc3QtPm5pdGVtcyAqIG5maWx0ZXJz ICogc2l6ZW9mKERhdHVtKTsKKworCS8qIEFkZCBzcGFjZSBmb3IgYWN0dWFsIGRhdHVtIGRhdGEg KGZvciBub24tYnl2YWwgdHlwZXMpICovCisJZm9yIChpID0gMDsgaSA8IG1jdmxpc3QtPm5pdGVt czsgaSsrKQorCXsKKwkJSm9pbk1DVkl0ZW0gKml0ZW0gPSAmbWN2bGlzdC0+aXRlbXNbaV07CisK KwkJZm9yIChqID0gMDsgaiA8IG5maWx0ZXJzOyBqKyspCisJCXsKKwkJCWlmICghaXRlbS0+aXNu dWxsW2pdKQorCQkJeworCQkJCWJvb2wJCXR5cGJ5dmFsID0gZ2V0X3R5cGJ5dmFsKG1jdmxpc3Qt PmZpbHRlcl90eXBlc1tqXSk7CisJCQkJaW50MTYJCXR5cGxlbiA9IGdldF90eXBsZW4obWN2bGlz dC0+ZmlsdGVyX3R5cGVzW2pdKTsKKworCQkJCWlmICghdHlwYnl2YWwpCisJCQkJCWxlbiArPSBk YXR1bUdldFNpemUoaXRlbS0+dmFsdWVzW2pdLCBmYWxzZSwgdHlwbGVuKTsKKwkJCX0KKwkJfQor CX0KKworCS8qIEFsbG9jYXRlIHJlc3VsdCAqLworCXJlc3VsdCA9IChieXRlYSAqKSBwYWxsb2Mo bGVuICsgVkFSSERSU1opOworCVNFVF9WQVJTSVpFKHJlc3VsdCwgbGVuICsgVkFSSERSU1opOwor CisJLyogSW5pdGlhbGl6ZSBwb2ludGVycyAqLworCXB0ciA9IFZBUkRBVEEocmVzdWx0KTsKKwlk YXRhX3B0ciA9IHB0cjsKKworCS8qIENvcHkgaGVhZGVyIChmaXhlZCBmaWVsZHMgYmVmb3JlIGl0 ZW1zIGFycmF5KSAqLworCW1lbWNweShkYXRhX3B0ciwgbWN2bGlzdCwgaGVhZGVyX2xlbik7CisJ ZGF0YV9wdHIgKz0gaGVhZGVyX2xlbjsKKworCS8qIENvcHkgaXRlbSBzdHJ1Y3RzICh3ZSdsbCBm aXggcG9pbnRlcnMgbGF0ZXIpICovCisJbWVtY3B5KGRhdGFfcHRyLCBtY3ZsaXN0LT5pdGVtcywg bWN2bGlzdC0+bml0ZW1zICogc2l6ZW9mKEpvaW5NQ1ZJdGVtKSk7CisJZGF0YV9wdHIgKz0gbWN2 bGlzdC0+bml0ZW1zICogc2l6ZW9mKEpvaW5NQ1ZJdGVtKTsKKworCS8qIENvcHkgaXNudWxsIGFy cmF5cyBhbmQgc2V0IHBvaW50ZXJzICovCisJZm9yIChpID0gMDsgaSA8IG1jdmxpc3QtPm5pdGVt czsgaSsrKQorCXsKKwkJSm9pbk1DVkl0ZW0gKm91dF9pdGVtID0gJigoSm9pbk1DVkxpc3QgKikg cHRyKS0+aXRlbXNbaV07CisJCUpvaW5NQ1ZJdGVtICppbl9pdGVtID0gJm1jdmxpc3QtPml0ZW1z W2ldOworCisJCS8qIFN0b3JlIG9mZnNldCB0byBpc251bGwgYXJyYXkgKi8KKwkJb3V0X2l0ZW0t PmlzbnVsbCA9IChib29sICopIChkYXRhX3B0ciAtIHB0cik7CisKKwkJLyogQ29weSBpc251bGwg YXJyYXkgKi8KKwkJbWVtY3B5KGRhdGFfcHRyLCBpbl9pdGVtLT5pc251bGwsIG5maWx0ZXJzICog c2l6ZW9mKGJvb2wpKTsKKwkJZGF0YV9wdHIgKz0gbmZpbHRlcnMgKiBzaXplb2YoYm9vbCk7CisJ fQorCisJLyogQ29weSB2YWx1ZXMgYXJyYXlzIGFuZCBzZXQgcG9pbnRlcnMgKi8KKwlmb3IgKGkg PSAwOyBpIDwgbWN2bGlzdC0+bml0ZW1zOyBpKyspCisJeworCQlKb2luTUNWSXRlbSAqb3V0X2l0 ZW0gPSAmKChKb2luTUNWTGlzdCAqKSBwdHIpLT5pdGVtc1tpXTsKKwkJSm9pbk1DVkl0ZW0gKmlu X2l0ZW0gPSAmbWN2bGlzdC0+aXRlbXNbaV07CisKKwkJLyogU3RvcmUgb2Zmc2V0IHRvIHZhbHVl cyBhcnJheSAqLworCQlvdXRfaXRlbS0+dmFsdWVzID0gKERhdHVtICopIChkYXRhX3B0ciAtIHB0 cik7CisKKwkJLyogQ29weSB2YWx1ZXMgYXJyYXkgKGJ5dmFsIHR5cGVzKSBhbmQgcHJlcGFyZSBm b3Igbm9uLWJ5dmFsICovCisJCW1lbWNweShkYXRhX3B0ciwgaW5faXRlbS0+dmFsdWVzLCBuZmls dGVycyAqIHNpemVvZihEYXR1bSkpOworCQlkYXRhX3B0ciArPSBuZmlsdGVycyAqIHNpemVvZihE YXR1bSk7CisJfQorCisJLyogTm93IGNvcHkgYWN0dWFsIGRhdGEgZm9yIG5vbi1ieXZhbCB0eXBl cyBhbmQgZml4IHVwIHBvaW50ZXJzICovCisJZm9yIChpID0gMDsgaSA8IG1jdmxpc3QtPm5pdGVt czsgaSsrKQorCXsKKwkJSm9pbk1DVkl0ZW0gKm91dF9pdGVtID0gJigoSm9pbk1DVkxpc3QgKikg cHRyKS0+aXRlbXNbaV07CisJCUpvaW5NQ1ZJdGVtICppbl9pdGVtID0gJm1jdmxpc3QtPml0ZW1z W2ldOworCQlEYXR1bQkgICAqb3V0X3ZhbHVlcyA9IChEYXR1bSAqKSAocHRyICsgKHNpemVfdCkg b3V0X2l0ZW0tPnZhbHVlcyk7CisKKwkJZm9yIChqID0gMDsgaiA8IG5maWx0ZXJzOyBqKyspCisJ CXsKKwkJCWlmICghaW5faXRlbS0+aXNudWxsW2pdKQorCQkJeworCQkJCWJvb2wJCXR5cGJ5dmFs ID0gZ2V0X3R5cGJ5dmFsKG1jdmxpc3QtPmZpbHRlcl90eXBlc1tqXSk7CisJCQkJaW50MTYJCXR5 cGxlbiA9IGdldF90eXBsZW4obWN2bGlzdC0+ZmlsdGVyX3R5cGVzW2pdKTsKKworCQkJCWlmICgh dHlwYnl2YWwpCisJCQkJeworCQkJCQlTaXplCQlkYXR1bV9sZW4gPSBkYXR1bUdldFNpemUoaW5f aXRlbS0+dmFsdWVzW2pdLCBmYWxzZSwgdHlwbGVuKTsKKwkJCQkJU2l6ZQkJb2Zmc2V0ID0gZGF0 YV9wdHIgLSBwdHI7CisKKwkJCQkJLyogU3RvcmUgb2Zmc2V0IGluIHRoZSB2YWx1ZXMgYXJyYXkg Ki8KKwkJCQkJb3V0X3ZhbHVlc1tqXSA9IFBvaW50ZXJHZXREYXR1bSgoY2hhciAqKSBOVUxMICsg b2Zmc2V0KTsKKworCQkJCQkvKiBDb3B5IHRoZSBhY3R1YWwgZGF0YSAqLworCQkJCQltZW1jcHko ZGF0YV9wdHIsIERhdHVtR2V0UG9pbnRlcihpbl9pdGVtLT52YWx1ZXNbal0pLCBkYXR1bV9sZW4p OworCQkJCQlkYXRhX3B0ciArPSBkYXR1bV9sZW47CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJ LyogVmVyaWZ5IHdlIGRpZG4ndCB3cml0ZSBwYXN0IHRoZSBhbGxvY2F0ZWQgc2l6ZSAqLworCUFz c2VydChkYXRhX3B0ciA8PSBwdHIgKyBsZW4pOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoK KyAqIHN0YXRleHRfam9pbl9tY3ZfZGVzZXJpYWxpemUKKyAqCQlEZXNlcmlhbGl6ZSBhIEpvaW5N Q1ZMaXN0IGZyb20gYnl0ZWEgZm9ybWF0CisgKi8KK0pvaW5NQ1ZMaXN0ICoKK3N0YXRleHRfam9p bl9tY3ZfZGVzZXJpYWxpemUoYnl0ZWEgKmRhdGEpCit7CisJSm9pbk1DVkxpc3QgKm1jdmxpc3Q7 CisJU2l6ZQkJbGVuOworCWNoYXIJICAgKmJhc2U7CisJaW50CQkJaSwKKwkJCQlqOworCUF0dHJO dW1iZXIJbmZpbHRlcnM7CisKKwlpZiAoIWRhdGEpCisJCXJldHVybiBOVUxMOworCisJbGVuID0g VkFSU0laRV9BTllfRVhIRFIoZGF0YSk7CisKKwkvKiBBbGxvY2F0ZSBhbmQgY29weSAqLworCW1j dmxpc3QgPSAoSm9pbk1DVkxpc3QgKikgcGFsbG9jKGxlbik7CisJYmFzZSA9IFZBUkRBVEFfQU5Z KGRhdGEpOworCW1lbWNweShtY3ZsaXN0LCBiYXNlLCBsZW4pOworCisJLyogVmVyaWZ5IG1hZ2lj IG51bWJlciAqLworCWlmIChtY3ZsaXN0LT5tYWdpYyAhPSBTVEFUU19KT0lOX01DVl9NQUdJQykK KwkJZWxvZyhFUlJPUiwgImludmFsaWQgbWFnaWMgbnVtYmVyIGluIGNyb3NzLXRhYmxlIE1DViBs aXN0Iik7CisKKwluZmlsdGVycyA9IG1jdmxpc3QtPm5kaW1lbnNpb25zOworCUFzc2VydChuZmls dGVycyA+IDAgJiYgbmZpbHRlcnMgPD0gU1RBVFNfTUFYX0RJTUVOU0lPTlMpOworCisJLyoKKwkg KiBGaXggdXAgcG9pbnRlcnMgZm9yIGlzbnVsbCBhcnJheXMsIHZhbHVlcyBhcnJheXMsIGFuZCBu b24tYnl2YWwgRGF0dW1zLgorCSAqIFRoZXNlIGFyZSBzdG9yZWQgYXMgb2Zmc2V0cyBmcm9tIHRo ZSBzdGFydCBvZiB0aGUgZGF0YS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWN2bGlzdC0+bml0 ZW1zOyBpKyspCisJeworCQlKb2luTUNWSXRlbSAqaXRlbSA9ICZtY3ZsaXN0LT5pdGVtc1tpXTsK KworCQkvKiBGaXggaXNudWxsIGFycmF5IHBvaW50ZXIgKi8KKwkJaXRlbS0+aXNudWxsID0gKGJv b2wgKikgKChjaGFyICopIG1jdmxpc3QgKyAoc2l6ZV90KSBpdGVtLT5pc251bGwpOworCisJCS8q IEZpeCB2YWx1ZXMgYXJyYXkgcG9pbnRlciAqLworCQlpdGVtLT52YWx1ZXMgPSAoRGF0dW0gKikg KChjaGFyICopIG1jdmxpc3QgKyAoc2l6ZV90KSBpdGVtLT52YWx1ZXMpOworCisJCS8qIEZpeCBp bmRpdmlkdWFsIG5vbi1ieXZhbCBEYXR1bSBwb2ludGVycyAqLworCQlmb3IgKGogPSAwOyBqIDwg bmZpbHRlcnM7IGorKykKKwkJeworCQkJaWYgKCFpdGVtLT5pc251bGxbal0pCisJCQl7CisJCQkJ Ym9vbAkJdHlwYnl2YWwgPSBnZXRfdHlwYnl2YWwobWN2bGlzdC0+ZmlsdGVyX3R5cGVzW2pdKTsK KworCQkJCWlmICghdHlwYnl2YWwpCisJCQkJeworCQkJCQlTaXplCQlvZmZzZXQgPSAoU2l6ZSkg RGF0dW1HZXRQb2ludGVyKGl0ZW0tPnZhbHVlc1tqXSk7CisKKwkJCQkJaXRlbS0+dmFsdWVzW2pd ID0gUG9pbnRlckdldERhdHVtKChjaGFyICopIG1jdmxpc3QgKyBvZmZzZXQpOworCQkJCX0KKwkJ CX0KKwkJfQorCX0KKworCXJldHVybiBtY3ZsaXN0OworfQorCisvKgorICogc3RhdGV4dF9qb2lu X21jdl9idWlsZAorICoJCUJ1aWxkIGpvaW4gTUNWIHN0YXRpc3RpY3MgZnJvbSBzYW1wbGVkIHJv d3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGJ1aWxkcyBhIEpvaW5NQ1ZMaXN0IGJ5OgorICogMS4g RXh0cmFjdGluZyB0aGUgcmVmZXJlbmNpbmcgY29sdW1uIHZhbHVlcyBmcm9tIHRoZSBzYW1wbGVk IHJvd3MKKyAqIDIuIExvb2tpbmcgdXAgdGhlIGNvcnJlc3BvbmRpbmcgZmlsdGVyIGNvbHVtbiB2 YWx1ZXMgZnJvbSByZWZlcmVuY2VkIHRhYmxlCisgKiAzLiBDb3VudGluZyBvY2N1cnJlbmNlcyBv ZiBlYWNoIChyZWZlcmVuY2luZywgZmlsdGVyKSBwYWlyCisgKiA0LiBLZWVwaW5nIHRoZSBtb3N0 IGNvbW1vbiBjb21iaW5hdGlvbnMKKyAqCisgKiBUaGUgc2FtcGxlZCByb3dzIGNvbWUgZnJvbSBB TkFMWVpFIG9mIHRoZSByZWZlcmVuY2luZyB0YWJsZS4KKyAqLworSm9pbk1DVkxpc3QgKgorc3Rh dGV4dF9qb2luX21jdl9idWlsZChPaWQgc3R4b2lkLAorCQkJCQkgICBPaWQgcHJpbWFyeV9yZWxp ZCwKKwkJCQkJICAgT2lkIG9ydGhlcl9yZWxpZCwKKwkJCQkJICAgaW50MnZlY3RvciAqam9pbmtl eXMsCisJCQkJCSAgIGludDJ2ZWN0b3IgKmZpbHRlcl9hdHRudW1zLAorCQkJCQkgICBpbnQgbnVt cm93cywKKwkJCQkJICAgSGVhcFR1cGxlICpyb3dzLAorCQkJCQkgICBpbnQgbmF0dHMsCisJCQkJ CSAgIFZhY0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cykKK3sKKwlKb2luTUNWTGlzdCAqbWN2bGlz dDsKKwlSZWxhdGlvbglvdGhlcl9yZWw7CisJVHVwbGVEZXNjCW90aGVyX2Rlc2M7CisJQXR0ck51 bWJlcglwcmltYXJ5X2pvaW5rZXk7CisJQXR0ck51bWJlcglvdGhlcl9qb2lua2V5OworCUF0dHJO dW1iZXIJbmZpbHRlcnM7CisJaW50CQkJaTsKKwlEYXR1bQkgICAqcHJpbWFyeV9qb2lua2V5X21j dl92YWx1ZXMgPSBOVUxMOworCWZsb2F0NAkgICAqcHJpbWFyeV9qb2lua2V5X21jdl9mcmVxcyA9 IE5VTEw7CisJaW50CQkJbnVtX3ByaW1hcnlfam9pbmtleV9tY3ZzID0gMDsKKwlTbmFwc2hvdAlz bmFwc2hvdDsKKwlib29sCQlwdXNoZWRfc25hcHNob3QgPSBmYWxzZTsKKwlkb3VibGUJCXRvdGFs X2ZyZXEgPSAwLjA7CisJVmFjQXR0clN0YXRzICpwcmltYXJ5X2pvaW5rZXlfc3RhdHMgPSBOVUxM OworCWludAkJCW1jdl9zbG90X2lkeCA9IC0xOworCisJLyogU2tpcCBpbnZhbGlkIHN0YXRzICov CisJaWYgKCFPaWRJc1ZhbGlkKHByaW1hcnlfcmVsaWQpIHx8ICFPaWRJc1ZhbGlkKG9ydGhlcl9y ZWxpZCkpCisJeworCQllbG9nKERFQlVHMSwgInN0YXRleHRfam9pbl9tY3ZfYnVpbGQ6IGludmFs aWQgcmVsYXRpb24gT0lEcyAocHJpbWFyeT0ldSwgb3RoZXI9JXUpIiwKKwkJCSBwcmltYXJ5X3Jl bGlkLCBvcnRoZXJfcmVsaWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKgorCSAqIEV4dHJh Y3Qgam9pbiBrZXlzIFRPRE86IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHNpbmdsZSBlcXVhbGl0 eSBxdWFsCisJICovCisJQXNzZXJ0KGpvaW5rZXlzLT5kaW0xID09IDIpOworCXByaW1hcnlfam9p bmtleSA9IGpvaW5rZXlzLT52YWx1ZXNbMF07CisJb3RoZXJfam9pbmtleSA9IGpvaW5rZXlzLT52 YWx1ZXNbMV07CisKKwkvKgorCSAqIEV4dHJhY3QgZmlsdGVyIGF0dHJpYnV0ZXMgVE9ETzogY3Vy cmVudGx5IGZpbHRlciBhdHRyaWJ1dGVzIGFyZSBvbmx5CisJICogZnJvbSB0aGUgb3RoZXJfcmVs CisJICovCisJbmZpbHRlcnMgPSBmaWx0ZXJfYXR0bnVtcy0+ZGltMTsKKwlBc3NlcnQobmZpbHRl cnMgPiAwICYmIG5maWx0ZXJzIDw9IFNUQVRTX01BWF9ESU1FTlNJT05TKTsKKworCWVsb2coREVC VUcxLCAic3RhdGV4dF9qb2luX21jdl9idWlsZDogc3R4b2lkPSV1LCB0YXJnZXRfcmVsPSV1LCBv dGhlcl9yZWw9JXUsIHRhcmdldF9qb2lua2V5PSVkLCBvdGhlcl9qb2lua2V5PSVkLCBuZGltZW5z aW9ucz0lZCIsCisJCSBzdHhvaWQsIHByaW1hcnlfcmVsaWQsIG9ydGhlcl9yZWxpZCwgcHJpbWFy eV9qb2lua2V5LCBvdGhlcl9qb2lua2V5LCBuZmlsdGVycyk7CisKKwkvKgorCSAqIFdlIHJldXNl IHRoZSBhbHJlYWR5LWNvbXB1dGVkIE1DViBzdGF0aXN0aWNzIGZvciB0aGUgam9pbiBrZXkgY29s dW1uIG9mCisJICogdGhlIHByaW1hcnkgcmVsYXRpb24uIFRoaXMgZ2l2ZXMgdXMgfjEwMCBtb3N0 IGNvbW1vbiB2YWx1ZXMgd2l0aCB0aGVpcgorCSAqIGZyZXF1ZW5jaWVzIGFscmVhZHkgY2FsY3Vs YXRlZCBieSB0aGUgY3VycmVudCBBTkFMWVpFLgorCSAqCisJICogV2UgZ2V0IHRoZSBNQ1YgZGF0 YSBmcm9tIHRoZSBpbi1tZW1vcnkgVmFjQXR0clN0YXRzIHN0cnVjdHVyZSwgbm90IGZyb20KKwkg KiBwZ19zdGF0aXN0aWMsIHNvIHRoaXMgd29ya3MgaW4gYSBzaW5nbGUgQU5BTFlaRSBwYXNzLgor CSAqCisJICogRklYTUU6IFRoaXMgYXBwcm9hY2ggd29ya3Mgd2VsbCBmb3IgRksgam9pbnMgKG1h bnktdG8tb25lKSB3aGVyZSBNQ1YgaW4KKwkgKiBwcmltYXJ5IHRhYmxlIOKJiCBNQ1YgYWZ0ZXIg am9pbi4gRm9yIGdlbmVyYWwgam9pbnMgKE06TiksIHdlIHNob3VsZAorCSAqIGpvaW4gdGhlIHNh bXBsZSByb3dzIHdpdGggb3RoZXJfcmVsIGFuZCBmaW5kIE1DVnMgaW4gdGhlIGpvaW4gcmVzdWx0 LAorCSAqIG5vdCBhc3N1bWUgcHJpbWFyeSB0YWJsZSBNQ1ZzIHJlbWFpbiByZXByZXNlbnRhdGl2 ZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmF0dHM7IGkrKykKKwl7CisJCWlmICh2YWNhdHRy c3RhdHNbaV0tPnR1cGF0dG51bSA9PSBwcmltYXJ5X2pvaW5rZXkpCisJCXsKKwkJCXByaW1hcnlf am9pbmtleV9zdGF0cyA9IHZhY2F0dHJzdGF0c1tpXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJ aWYgKCFwcmltYXJ5X2pvaW5rZXlfc3RhdHMpCisJeworCQllbG9nKERFQlVHMSwgInN0YXRleHRf am9pbl9tY3ZfYnVpbGQ6IFZhY0F0dHJTdGF0cyBub3QgZm91bmQgZm9yIHByaW1hcnkgam9pbmtl eSBhdHRyPSVkIiwKKwkJCSBwcmltYXJ5X2pvaW5rZXkpOworCQlyZXR1cm4gTlVMTDsKKwl9CisK KwkvKiBGaW5kIHRoZSBNQ1Ygc2xvdCBpbiB0aGUgc3RhdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwg U1RBVElTVElDX05VTV9TTE9UUzsgaSsrKQorCXsKKwkJaWYgKHByaW1hcnlfam9pbmtleV9zdGF0 cy0+c3Rha2luZFtpXSA9PSBTVEFUSVNUSUNfS0lORF9NQ1YpCisJCXsKKwkJCW1jdl9zbG90X2lk eCA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChtY3Zfc2xvdF9pZHggPCAwKQorCXsK KwkJZWxvZyhERUJVRzEsICJzdGF0ZXh0X2pvaW5fbWN2X2J1aWxkOiBObyBNQ1Ygc3RhdGlzdGlj cyBmb3IgcHJpbWFyeSBqb2lua2V5IGF0dHI9JWQiLAorCQkJIHByaW1hcnlfam9pbmtleSk7CisJ CXJldHVybiBOVUxMOworCX0KKworCXByaW1hcnlfam9pbmtleV9tY3ZfdmFsdWVzID0gcHJpbWFy eV9qb2lua2V5X3N0YXRzLT5zdGF2YWx1ZXNbbWN2X3Nsb3RfaWR4XTsKKwlwcmltYXJ5X2pvaW5r ZXlfbWN2X2ZyZXFzID0gcHJpbWFyeV9qb2lua2V5X3N0YXRzLT5zdGFudW1iZXJzW21jdl9zbG90 X2lkeF07CisJbnVtX3ByaW1hcnlfam9pbmtleV9tY3ZzID0gcHJpbWFyeV9qb2lua2V5X3N0YXRz LT5udW12YWx1ZXNbbWN2X3Nsb3RfaWR4XTsKKworCWlmIChudW1fcHJpbWFyeV9qb2lua2V5X21j dnMgPD0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwllbG9nKERFQlVHMSwgInN0YXRleHRfam9pbl9t Y3ZfYnVpbGQ6IEZvdW5kICVkIE1DViBlbnRyaWVzLCBidWlsZGluZyBqb2luIG1jdiBzdGF0cyIs CisJCSBudW1fcHJpbWFyeV9qb2lua2V5X21jdnMpOworCisJLyogT3BlbiB0aGUgb3RoZXIgdGFi bGUgKi8KKwlvdGhlcl9yZWwgPSB0YWJsZV9vcGVuKG9ydGhlcl9yZWxpZCwgQWNjZXNzU2hhcmVM b2NrKTsKKwlvdGhlcl9kZXNjID0gUmVsYXRpb25HZXREZXNjcihvdGhlcl9yZWwpOworCisJLyog RW5zdXJlIHdlIGhhdmUgYW4gYWN0aXZlIHNuYXBzaG90ICovCisJaWYgKCFBY3RpdmVTbmFwc2hv dFNldCgpKQorCXsKKwkJUHVzaEFjdGl2ZVNuYXBzaG90KEdldFRyYW5zYWN0aW9uU25hcHNob3Qo KSk7CisJCXB1c2hlZF9zbmFwc2hvdCA9IHRydWU7CisJfQorCXNuYXBzaG90ID0gR2V0QWN0aXZl U25hcHNob3QoKTsKKworCS8qIEJ1aWxkIHRoZSBqb2luIG1jdiBsaXN0ICovCisJbWN2bGlzdCA9 IChKb2luTUNWTGlzdCAqKSBwYWxsb2MwKAorCQkJCQkJCQkJICBvZmZzZXRvZihKb2luTUNWTGlz dCwgaXRlbXMpICsKKwkJCQkJCQkJCSAgbnVtX3ByaW1hcnlfam9pbmtleV9tY3ZzICogc2l6ZW9m KEpvaW5NQ1ZJdGVtKSk7CisKKwltY3ZsaXN0LT5tYWdpYyA9IFNUQVRTX0pPSU5fTUNWX01BR0lD OworCW1jdmxpc3QtPnR5cGUgPSBTVEFUU19KT0lOX01DVl9UWVBFX0JBU0lDOworCW1jdmxpc3Qt Pm5pdGVtcyA9IG51bV9wcmltYXJ5X2pvaW5rZXlfbWN2czsKKwltY3ZsaXN0LT5uZGltZW5zaW9u cyA9IG5maWx0ZXJzOworCisJLyogR2V0IGZpbHRlciBhdHRyaWJ1dGUgbnVtYmVycyBhbmQgdHlw ZXMgZnJvbSB0aGUgb3RoZXIgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmZpbHRlcnM7IGkr KykKKwl7CisJCW1jdmxpc3QtPmZpbHRlcl9hdHRudW1zW2ldID0gZmlsdGVyX2F0dG51bXMtPnZh bHVlc1tpXTsKKwkJbWN2bGlzdC0+ZmlsdGVyX3R5cGVzW2ldID0gVHVwbGVEZXNjQXR0cihvdGhl cl9kZXNjLAorCQkJCQkJCQkJCQkJIGZpbHRlcl9hdHRudW1zLT52YWx1ZXNbaV0gLSAxKS0+YXR0 dHlwaWQ7CisJfQorCisJLyoKKwkgKiBGb3IgZWFjaCBNQ1YgdmFsdWUgb2YgdGhlIGpvaW4ga2V5 IGNvbHVtbiwgbG9vayB1cCB0aGUgY29ycmVzcG9uZGluZworCSAqIGZpbHRlciB2YWx1ZSBpbiB0 aGUgcmVmZXJlbmNlZCB0YWJsZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3ByaW1hcnlf am9pbmtleV9tY3ZzOyBpKyspCisJeworCQlEYXR1bQkJam9pbmtleV92YWx1ZSA9IHByaW1hcnlf am9pbmtleV9tY3ZfdmFsdWVzW2ldOworCQlmbG9hdDQJCWZyZXF1ZW5jeSA9IHByaW1hcnlfam9p bmtleV9tY3ZfZnJlcXNbaV07CisJCVNjYW5LZXlEYXRhIHNjYW5rZXk7CisJCVRhYmxlU2NhbkRl c2Mgc2NhbjsKKwkJSGVhcFR1cGxlCW9ydGhlcnR1cGxlOworCQlPaWQJCQllcV9vcHI7CisJCU9p ZAkJCWVxX2Z1bmM7CisJCU9pZAkJCXByaW1hcnlfdHlwZTsKKwkJaW50CQkJajsKKworCQlwcmlt YXJ5X3R5cGUgPSBnZXRfYXR0dHlwZShwcmltYXJ5X3JlbGlkLCBwcmltYXJ5X2pvaW5rZXkpOwor CisJCS8qIEdldCB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgZm9yIGxvb2t1cHMgKi8KKwkJZXFfb3By ID0gZ2V0X29wZmFtaWx5X21lbWJlcihnZXRfb3BjbGFzc19mYW1pbHkoCisJCQkJCQkJCQkJCQkJ CUdldERlZmF1bHRPcENsYXNzKHByaW1hcnlfdHlwZSwgQlRSRUVfQU1fT0lEKSksCisJCQkJCQkJ CQkgcHJpbWFyeV90eXBlLCBwcmltYXJ5X3R5cGUsCisJCQkJCQkJCQkgQlRFcXVhbFN0cmF0ZWd5 TnVtYmVyKTsKKwkJZXFfZnVuYyA9IGdldF9vcGNvZGUoZXFfb3ByKTsKKworCQlTY2FuS2V5SW5p dCgmc2NhbmtleSwKKwkJCQkJb3RoZXJfam9pbmtleSwKKwkJCQkJQlRFcXVhbFN0cmF0ZWd5TnVt YmVyLAorCQkJCQllcV9mdW5jLAorCQkJCQlqb2lua2V5X3ZhbHVlKTsKKworCQkvKiBTZXQgY29s bGF0aW9uIGZvciB0aGUgc2NhbiBrZXkgKi8KKwkJc2NhbmtleS5za19jb2xsYXRpb24gPSBUdXBs ZURlc2NBdHRyKG90aGVyX2Rlc2MsIG90aGVyX2pvaW5rZXkgLSAxKS0+YXR0Y29sbGF0aW9uOwor CisJCS8qIFRPRE86IHRhYmxlX2JlZ2luc2NhbiBkb2VzIHNlcXVlbnRpYWwgc2NhbiAtIHVzZSBp bmRleCBpZiBhdmFpbGFibGUgKi8KKwkJc2NhbiA9IHRhYmxlX2JlZ2luc2NhbihvdGhlcl9yZWws IHNuYXBzaG90LCAxLCAmc2NhbmtleSk7CisJCW9ydGhlcnR1cGxlID0gaGVhcF9nZXRuZXh0KHNj YW4sIEZvcndhcmRTY2FuRGlyZWN0aW9uKTsKKworCQkvKiBBbGxvY2F0ZSBhcnJheXMgZm9yIGFs bCBmaWx0ZXIgY29sdW1ucyAqLworCQltY3ZsaXN0LT5pdGVtc1tpXS5mcmVxdWVuY3kgPSBmcmVx dWVuY3k7CisJCW1jdmxpc3QtPml0ZW1zW2ldLmlzbnVsbCA9IChib29sICopIHBhbGxvYyhuZmls dGVycyAqIHNpemVvZihib29sKSk7CisJCW1jdmxpc3QtPml0ZW1zW2ldLnZhbHVlcyA9IChEYXR1 bSAqKSBwYWxsb2MobmZpbHRlcnMgKiBzaXplb2YoRGF0dW0pKTsKKworCQlpZiAoSGVhcFR1cGxl SXNWYWxpZChvcnRoZXJ0dXBsZSkpCisJCXsKKwkJCS8qIEV4dHJhY3QgYWxsIGZpbHRlciBjb2x1 bW4gdmFsdWVzICovCisJCQlmb3IgKGogPSAwOyBqIDwgbmZpbHRlcnM7IGorKykKKwkJCXsKKwkJ CQlBdHRyTnVtYmVyCWZpbHRlcl9hdHRyID0gZmlsdGVyX2F0dG51bXMtPnZhbHVlc1tqXTsKKwkJ CQlEYXR1bQkJZmlsdGVyX3ZhbHVlOworCQkJCWJvb2wJCWZpbHRlcl9pc251bGw7CisKKwkJCQlm aWx0ZXJfdmFsdWUgPSBoZWFwX2dldGF0dHIob3J0aGVydHVwbGUsIGZpbHRlcl9hdHRyLAorCQkJ CQkJCQkJCQlvdGhlcl9kZXNjLCAmZmlsdGVyX2lzbnVsbCk7CisKKwkJCQkvKiBDb3B5IHRoZSB2 YWx1ZSBpZiBub3QgbnVsbCAqLworCQkJCWlmICghZmlsdGVyX2lzbnVsbCkKKwkJCQkJZmlsdGVy X3ZhbHVlID0gZGF0dW1Db3B5KGZpbHRlcl92YWx1ZSwKKwkJCQkJCQkJCQkJIFR1cGxlRGVzY0F0 dHIob3RoZXJfZGVzYywgZmlsdGVyX2F0dHIgLSAxKS0+YXR0Ynl2YWwsCisJCQkJCQkJCQkJCSBU dXBsZURlc2NBdHRyKG90aGVyX2Rlc2MsIGZpbHRlcl9hdHRyIC0gMSktPmF0dGxlbik7CisKKwkJ CQltY3ZsaXN0LT5pdGVtc1tpXS5pc251bGxbal0gPSBmaWx0ZXJfaXNudWxsOworCQkJCW1jdmxp c3QtPml0ZW1zW2ldLnZhbHVlc1tqXSA9IGZpbHRlcl92YWx1ZTsKKwkJCX0KKwkJfQorCQllbHNl CisJCXsKKwkJCS8qIE5vIG1hdGNoaW5nIHJvdyBmb3VuZCAtIG1hcmsgYWxsIGZpbHRlciB2YWx1 ZXMgYXMgTlVMTCAqLworCQkJZm9yIChqID0gMDsgaiA8IG5maWx0ZXJzOyBqKyspCisJCQl7CisJ CQkJbWN2bGlzdC0+aXRlbXNbaV0uaXNudWxsW2pdID0gdHJ1ZTsKKwkJCQltY3ZsaXN0LT5pdGVt c1tpXS52YWx1ZXNbal0gPSAoRGF0dW0pIDA7CisJCQl9CisJCX0KKworCQl0YWJsZV9lbmRzY2Fu KHNjYW4pOworCisJCXRvdGFsX2ZyZXEgKz0gZnJlcXVlbmN5OworCX0KKworCS8qIENsZWFuIHVw ICovCisJaWYgKHB1c2hlZF9zbmFwc2hvdCkKKwkJUG9wQWN0aXZlU25hcHNob3QoKTsKKworCXRh YmxlX2Nsb3NlKG90aGVyX3JlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCWVsb2coREVCVUcxLCAi c3RhdGV4dF9qb2luX21jdl9idWlsZDogQnVpbHQgam9pbiBNQ1Ygd2l0aCAlZCBpdGVtcywgbmRp bWVuc2lvbnM9JWQsIHRvdGFsX2ZyZXE9JS4zZiIsCisJCSBudW1fcHJpbWFyeV9qb2lua2V5X21j dnMsIG5maWx0ZXJzLCB0b3RhbF9mcmVxKTsKKworCXJldHVybiBtY3ZsaXN0OworfQorCisvKgor ICogc3RhdGV4dF9qb2luX21jdl9sb2FkCisgKgkJTG9vayB1cCBqb2luIE1DViBzdGF0aXN0aWNz IGZyb20gdGhlIGNhdGFsb2cKKyAqCisgKiBVc2VzIHRoZSBpbmRleCBvbiAoc3R4cmVsaWQsIHN0 eG90aGVycmVsKSBmb3IgbG9va3VwLCB0aGVuIHBvc3QtZmlsdGVycworICogb24gc3R4am9pbmtl eXMgYW5kIGZpbHRlcl9hdHRudW1zIHNpbmNlIGludDJ2ZWN0b3IgY2FuJ3QgYmUgaW5kZXhlZC4K KyAqCisgKiBSZXR1cm5zIGRlc2VyaWFsaXplZCBKb2luTUNWTGlzdCBpZiBmb3VuZCwgTlVMTCBv dGhlcndpc2UuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSBy ZXR1cm5lZCBzdHJ1Y3R1cmUuCisgKi8KK0pvaW5NQ1ZMaXN0ICoKK3N0YXRleHRfam9pbl9tY3Zf bG9hZChPaWQgcmVsaWQsCisJCQkJCSAgQXR0ck51bWJlciByZWxfam9pbmtleV9hdHRudW0sCisJ CQkJCSAgT2lkIG90aGVyX3JlbGlkLAorCQkJCQkgIEF0dHJOdW1iZXIgb3RoZXJyZWxfam9pbmtl eV9hdHRudW0sCisJCQkJCSAgTGlzdCAqZmlsdGVyX2F0dG51bXMpCit7CisJUmVsYXRpb24Jc3Rh dGV4dF9yZWw7CisJUmVsYXRpb24Jc3RhdGV4dF9kYXRhX3JlbDsKKwlTeXNTY2FuRGVzYyBzY2Fu OworCVNjYW5LZXlEYXRhIGtleXNbMl07CisJSGVhcFR1cGxlCWh0dXA7CisJSm9pbk1DVkxpc3Qg Km1jdmxpc3QgPSBOVUxMOworCWludDE2CQlleHBlY3RlZF9qb2lua2V5c1syXTsKKworCS8qIEJ1 aWxkIGV4cGVjdGVkIGpvaW5rZXlzIGZvciBjb21wYXJpc29uICovCisJZXhwZWN0ZWRfam9pbmtl eXNbMF0gPSByZWxfam9pbmtleV9hdHRudW07CisJZXhwZWN0ZWRfam9pbmtleXNbMV0gPSBvdGhl cnJlbF9qb2lua2V5X2F0dG51bTsKKworCS8qIE9wZW4gYm90aCBjYXRhbG9nIHJlbGF0aW9ucyAq LworCXN0YXRleHRfcmVsID0gdGFibGVfb3BlbihTdGF0aXN0aWNFeHRSZWxhdGlvbklkLCBBY2Nl c3NTaGFyZUxvY2spOworCXN0YXRleHRfZGF0YV9yZWwgPSB0YWJsZV9vcGVuKFN0YXRpc3RpY0V4 dERhdGFSZWxhdGlvbklkLCBBY2Nlc3NTaGFyZUxvY2spOworCisJLyoKKwkgKiBVc2UgdGhlIGlu ZGV4IG9uIChzdHhyZWxpZCwgc3R4b3RoZXJyZWwpIHRvIGZpbmQgc3RhdGlzdGljcyBvYmplY3Rz IGZvcgorCSAqIHRoaXMgdGFibGUgcGFpci4KKwkgKi8KKwlTY2FuS2V5SW5pdCgma2V5c1swXSwK KwkJCQlBbnVtX3BnX3N0YXRpc3RpY19leHRfc3R4cmVsaWQsCisJCQkJQlRFcXVhbFN0cmF0ZWd5 TnVtYmVyLCBGX09JREVRLAorCQkJCU9iamVjdElkR2V0RGF0dW0ocmVsaWQpKTsKKworCVNjYW5L ZXlJbml0KCZrZXlzWzFdLAorCQkJCUFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhvdGhlcnJlbCwK KwkJCQlCVEVxdWFsU3RyYXRlZ3lOdW1iZXIsIEZfT0lERVEsCisJCQkJT2JqZWN0SWRHZXREYXR1 bShvdGhlcl9yZWxpZCkpOworCisJc2NhbiA9IHN5c3RhYmxlX2JlZ2luc2NhbihzdGF0ZXh0X3Jl bCwgU3RhdGlzdGljRXh0T3RoZXJyZWxJbmRleElkLCB0cnVlLAorCQkJCQkJCSAgTlVMTCwgMiwg a2V5cyk7CisKKwkvKgorCSAqIEl0ZXJhdGUgdGhyb3VnaCBtYXRjaGluZyByb3dzICh0eXBpY2Fs bHkgMS0yIGZvciBhIGdpdmVuIHRhYmxlIHBhaXIpLgorCSAqIFBvc3QtZmlsdGVyIG9uIHN0eGpv aW5rZXlzIGFuZCBmaWx0ZXJfYXR0bnVtcy4KKwkgKi8KKwl3aGlsZSAoSGVhcFR1cGxlSXNWYWxp ZChodHVwID0gc3lzdGFibGVfZ2V0bmV4dChzY2FuKSkpCisJeworCQlGb3JtX3BnX3N0YXRpc3Rp Y19leHQgc3QgPSAoRm9ybV9wZ19zdGF0aXN0aWNfZXh0KSBHRVRTVFJVQ1QoaHR1cCk7CisJCURh dHVtCQlkYXR1bTsKKwkJYm9vbAkJaXNudWxsOworCQlpbnQydmVjdG9yICpqb2lua2V5czsKKwkJ aW50MnZlY3RvciAqc3R4a2V5czsKKwkJYm9vbAkJbWF0Y2ggPSB0cnVlOworCQlBcnJheVR5cGUg ICphcnI7CisJCWNoYXIJICAgKmtpbmRzOworCQlpbnQJCQlua2luZHM7CisJCWJvb2wJCWhhc19q b2luX21jdiA9IGZhbHNlOworCQlIZWFwVHVwbGUJZGF0YV9odHVwOworCQlpbnQJCQlpLAorCQkJ CQlqOworCisJCS8qIFNraXAgaWYgbm90IGpvaW4gTUNWIHR5cGUgKi8KKwkJZGF0dW0gPSBTeXND YWNoZUdldEF0dHJOb3ROdWxsKFNUQVRFWFRPSUQsIGh0dXAsIEFudW1fcGdfc3RhdGlzdGljX2V4 dF9zdHhraW5kKTsKKwkJYXJyID0gRGF0dW1HZXRBcnJheVR5cGVQKGRhdHVtKTsKKwkJa2luZHMg PSAoY2hhciAqKSBBUlJfREFUQV9QVFIoYXJyKTsKKwkJbmtpbmRzID0gQXJyYXlHZXROSXRlbXMo QVJSX05ESU0oYXJyKSwgQVJSX0RJTVMoYXJyKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5raW5k czsgaSsrKQorCQl7CisJCQlpZiAoa2luZHNbaV0gPT0gU1RBVFNfRVhUX0pPSU5fTUNWKQorCQkJ eworCQkJCWhhc19qb2luX21jdiA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlp ZiAoIWhhc19qb2luX21jdikKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIHN0eGpvaW5rZXlz IG1hdGNoZXMgKi8KKwkJZGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoU1RBVEVYVE9JRCwgaHR1cCwg QW51bV9wZ19zdGF0aXN0aWNfZXh0X3N0eGpvaW5rZXlzLCAmaXNudWxsKTsKKwkJaWYgKGlzbnVs bCkKKwkJCWNvbnRpbnVlOworCisJCWpvaW5rZXlzID0gKGludDJ2ZWN0b3IgKikgRGF0dW1HZXRQ b2ludGVyKGRhdHVtKTsKKwkJaWYgKGpvaW5rZXlzLT5kaW0xICE9IDIgfHwKKwkJCWpvaW5rZXlz LT52YWx1ZXNbMF0gIT0gZXhwZWN0ZWRfam9pbmtleXNbMF0gfHwKKwkJCWpvaW5rZXlzLT52YWx1 ZXNbMV0gIT0gZXhwZWN0ZWRfam9pbmtleXNbMV0pCisJCQljb250aW51ZTsKKworCQkvKiBDaGVj ayBmaWx0ZXIgY29sdW1ucyBtYXRjaCAoc3R4a2V5cykgKi8KKwkJZGF0dW0gPSBTeXNDYWNoZUdl dEF0dHJOb3ROdWxsKFNUQVRFWFRPSUQsIGh0dXAsIEFudW1fcGdfc3RhdGlzdGljX2V4dF9zdHhr ZXlzKTsKKwkJc3R4a2V5cyA9IChpbnQydmVjdG9yICopIERhdHVtR2V0UG9pbnRlcihkYXR1bSk7 CisKKwkJaWYgKGZpbHRlcl9hdHRudW1zICE9IE5JTCkKKwkJeworCQkJLyoKKwkJCSAqIENoZWNr IGlmIHRoZSBzdGF0IGNvbnRhaW5zIEFMTCB0aGUgcXVlcmllZCBmaWx0ZXIgY29sdW1ucy4gRm9y CisJCQkgKiBtYXJnaW5hbGl6YXRpb24sIHdlIGFsbG93IHRoZSBzdGF0IHRvIGhhdmUgbW9yZSBj b2x1bW5zIHRoYW4KKwkJCSAqIHRoZSBxdWVyeSAoc3Vic2V0IG1hdGNoaW5nKSwgYnV0IHRoZSBx dWVyeSBjb2x1bW5zIG11c3QgYWxsIGJlCisJCQkgKiBwcmVzZW50IGluIHRoZSBzdGF0LgorCQkJ ICoKKwkJCSAqIEV4YW1wbGU6IFF1ZXJ5IGZpbHRlcnMgb24gcGhvbmV0aWNfY29kZSAoY29sIDMp LCBzdGF0IGhhcworCQkJICogKGtleXdvcmQsIHBob25ldGljX2NvZGUpID0gezIsIDN9IC0+IG1h dGNoIQorCQkJICovCisJCQlMaXN0Q2VsbCAgICpsYzsKKworCQkJZm9yZWFjaChsYywgZmlsdGVy X2F0dG51bXMpCisJCQl7CisJCQkJQXR0ck51bWJlcglhdHRudW0gPSBsZmlyc3RfaW50KGxjKTsK KwkJCQlib29sCQlmb3VuZCA9IGZhbHNlOworCisJCQkJZm9yIChqID0gMDsgaiA8IHN0eGtleXMt PmRpbTE7IGorKykKKwkJCQl7CisJCQkJCWlmIChhdHRudW0gPT0gc3R4a2V5cy0+dmFsdWVzW2pd KQorCQkJCQl7CisJCQkJCQlmb3VuZCA9IHRydWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJ CX0KKwkJCQlpZiAoIWZvdW5kKQorCQkJCXsKKwkJCQkJbWF0Y2ggPSBmYWxzZTsKKwkJCQkJYnJl YWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoIW1hdGNoKQorCQkJCWNvbnRpbnVlOworCQl9CisK KwkJLyoKKwkJICogRm91bmQgYSBtYXRjaGluZyBzdGF0cyBvYmplY3QhIE5vdyBsb2FkIHRoZSBq b2luIE1DViBkYXRhLgorCQkgKi8KKwkJZGF0YV9odHVwID0gU2VhcmNoU3lzQ2FjaGUyKFNUQVRF WFREQVRBU1RYT0lELAorCQkJCQkJCQkJT2JqZWN0SWRHZXREYXR1bShzdC0+b2lkKSwKKwkJCQkJ CQkJCUJvb2xHZXREYXR1bShmYWxzZSkpOworCisJCWlmIChIZWFwVHVwbGVJc1ZhbGlkKGRhdGFf aHR1cCkpCisJCXsKKwkJCWRhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKFNUQVRFWFREQVRBU1RYT0lE LCBkYXRhX2h0dXAsCisJCQkJCQkJCQlBbnVtX3BnX3N0YXRpc3RpY19leHRfZGF0YV9zdHhkam9p bm1jdiwKKwkJCQkJCQkJCSZpc251bGwpOworCisJCQlpZiAoIWlzbnVsbCkKKwkJCXsKKwkJCQkv KiBEZXNlcmlhbGl6ZSB0aGUgTUNWIGxpc3QgKi8KKwkJCQltY3ZsaXN0ID0gc3RhdGV4dF9qb2lu X21jdl9kZXNlcmlhbGl6ZShEYXR1bUdldEJ5dGVhUChkYXR1bSkpOworCQkJCVJlbGVhc2VTeXND YWNoZShkYXRhX2h0dXApOworCQkJCWJyZWFrOwkJCS8qIEZvdW5kIGl0ISAqLworCQkJfQorCisJ CQlSZWxlYXNlU3lzQ2FjaGUoZGF0YV9odHVwKTsKKwkJfQorCX0KKworCXN5c3RhYmxlX2VuZHNj YW4oc2Nhbik7CisJdGFibGVfY2xvc2Uoc3RhdGV4dF9kYXRhX3JlbCwgQWNjZXNzU2hhcmVMb2Nr KTsKKwl0YWJsZV9jbG9zZShzdGF0ZXh0X3JlbCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCXJldHVy biBtY3ZsaXN0OworfQorCisvKgorICogam9pbl9tY3ZfY2xhdXNlbGlzdF9zZWxlY3Rpdml0eQor ICoJCUFwcGx5IGpvaW4gTUNWIHN0YXRpc3RpY3MgdG8gZXN0aW1hdGUgc2VsZWN0aXZpdHkKKyAq CisgKiBHaXZlbiBhIEpvaW5NQ1ZMaXN0IGFuZCBmaWx0ZXIgdmFsdWVzLCBjb21wdXRlIHRoZSBz ZWxlY3Rpdml0eSBieQorICogc3VtbWluZyB0aGUgZnJlcXVlbmNpZXMgb2YgTUNWIGl0ZW1zIHRo YXQgbWF0Y2ggdGhlIGZpbHRlciBjcml0ZXJpYS4KKyAqCisgKiBGb3Igc2luZ2xlLWNvbHVtbiBx dWVyaWVzIG9uIG11bHRpLWNvbHVtbiBzdGF0cywgd2UgY29tcHV0ZSB0aGUKKyAqIG1hcmdpbmFs IGRpc3RyaWJ1dGlvbiBieSBzdW1taW5nIGZyZXF1ZW5jaWVzIGFjcm9zcyBub24tcXVlcmllZAor ICogZGltZW5zaW9ucy4KKyAqCisgKiBGb3IgbXVsdGktY29sdW1uIHF1ZXJpZXMsIHdlIG1hdGNo IEFMTCBxdWVyaWVkIGNvbHVtbnMgd2l0aCB0aGVpcgorICogY29ycmVzcG9uZGluZyBkaW1lbnNp b25zIGFuZCBmaW5kIE1DViBpdGVtcyB3aGVyZSBhbGwgZGltZW5zaW9ucyBtYXRjaC4KKyAqLwor U2VsZWN0aXZpdHkKK2pvaW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkoSm9pbk1DVkxpc3Qg KiBtY3ZsaXN0LAorCQkJCQkJCQlMaXN0ICpmaWx0ZXJfdmFsdWVzLAorCQkJCQkJCQlMaXN0ICpm aWx0ZXJfYXR0bnVtcywKKwkJCQkJCQkJT2lkIGNvbGxhdGlvbikKK3sKKwlpbnQJCQlpdGVtX2lk eDsKKwlTZWxlY3Rpdml0eSB0b3RhbF9zZWw7CisJTGlzdENlbGwgICAqbGM7CisJTGlzdENlbGwg ICAqbGNfYXR0bnVtOworCWludAkJCW5xY29sczsKKwlpbnQJCQlxY29sOworCWludAkJICAgKnFj b2xfZGltczsKKwlGbWdySW5mbyAgICplcV9mdW5jczsKKwlGdW5jdGlvbkNhbGxJbmZvICpmY2lu Zm9fYXJyOworCisJaWYgKCFtY3ZsaXN0IHx8IG1jdmxpc3QtPm5pdGVtcyA9PSAwIHx8IGZpbHRl cl92YWx1ZXMgPT0gTklMIHx8IGZpbHRlcl9hdHRudW1zID09IE5JTCkKKwkJcmV0dXJuIDAuMDsK KworCS8qCisJICogTWFwIHF1ZXJpZWQgY29sdW1ucyB0byBzdGF0IGRpbWVuc2lvbnMuCisJICoK KwkgKiBGb3Igc2luZ2xlLWNvbHVtbiBxdWVyaWVzIG9uIG11bHRpLWNvbHVtbiBzdGF0cywgd2Ug Y29tcHV0ZSB0aGUKKwkgKiBtYXJnaW5hbCBkaXN0cmlidXRpb24gYnkgc3VtbWluZyBmcmVxdWVu Y2llcyBhY3Jvc3Mgbm9uLXF1ZXJpZWQKKwkgKiBkaW1lbnNpb25zLgorCSAqCisJICogRm9yIG11 bHRpLWNvbHVtbiBxdWVyaWVzLCB3ZSBtYXRjaCBBTEwgcXVlcmllZCBjb2x1bW5zIHdpdGggdGhl aXIKKwkgKiBjb3JyZXNwb25kaW5nIGRpbWVuc2lvbnMgYW5kIGZpbmQgTUNWIGl0ZW1zIHdoZXJl IGFsbCBkaW1lbnNpb25zIG1hdGNoLgorCSAqLworCW5xY29scyA9IGxpc3RfbGVuZ3RoKGZpbHRl cl9hdHRudW1zKTsKKworCWlmIChucWNvbHMgPiBTVEFUU19NQVhfRElNRU5TSU9OUykKKwl7CisJ CWVsb2coREVCVUcxLCAiam9pbl9tY3ZfY2xhdXNlbGlzdF9zZWxlY3Rpdml0eTogdG9vIG1hbnkg cXVlcnkgY29sdW1uczogJWQiLCBucWNvbHMpOworCQlyZXR1cm4gMC4wOworCX0KKwlxY29sX2Rp bXMgPSAoaW50ICopIHBhbGxvYyhucWNvbHMgKiBzaXplb2YoaW50KSk7CisJcWNvbCA9IDA7CisK KwkvKiBNYXAgZWFjaCBxdWVyaWVkIGNvbHVtbiB0byBpdHMgZGltZW5zaW9uIGluIHRoZSBzdGF0 ICovCisJZm9yZWFjaChsY19hdHRudW0sIGZpbHRlcl9hdHRudW1zKQorCXsKKwkJQXR0ck51bWJl cglxYXR0bnVtID0gbGZpcnN0X2ludChsY19hdHRudW0pOworCQlib29sCQlmb3VuZCA9IGZhbHNl OworCisJCWZvciAoaW50IGQgPSAwOyBkIDwgbWN2bGlzdC0+bmRpbWVuc2lvbnM7IGQrKykKKwkJ eworCQkJaWYgKG1jdmxpc3QtPmZpbHRlcl9hdHRudW1zW2RdID09IHFhdHRudW0pCisJCQl7CisJ CQkJcWNvbF9kaW1zW3Fjb2xdID0gZDsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJ CQl9CisJCX0KKworCQlpZiAoIWZvdW5kKQorCQl7CisJCQllbG9nKERFQlVHMSwgImpvaW5fbWN2 X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHk6IHF1ZXJ5IGF0dG51bSAlZCBub3QgZm91bmQgaW4gc3Rh dCIsIHFhdHRudW0pOworCQkJcmV0dXJuIDAuMDsKKwkJfQorCQlxY29sKys7CisJfQorCisJZWxv ZyhERUJVRzEsICJqb2luX21jdl9jbGF1c2VsaXN0X3NlbGVjdGl2aXR5OiBtYXRjaGVkICVkIHF1 ZXJ5IGNvbHVtbnMgdG8gc3RhdCBkaW1lbnNpb25zIChuZGltZW5zaW9ucz0lZCkiLAorCQkgbnFj b2xzLCBtY3ZsaXN0LT5uZGltZW5zaW9ucyk7CisKKwkvKiBTZXR1cCBlcXVhbGl0eSBmdW5jdGlv bnMgZm9yIGVhY2ggcXVlcmllZCBkaW1lbnNpb24gKi8KKwllcV9mdW5jcyA9IChGbWdySW5mbyAq KSBwYWxsb2MobnFjb2xzICogc2l6ZW9mKEZtZ3JJbmZvKSk7CisJZmNpbmZvX2FyciA9IChGdW5j dGlvbkNhbGxJbmZvICopIHBhbGxvYyhucWNvbHMgKiBzaXplb2YoRnVuY3Rpb25DYWxsSW5mbykp OworCisJZm9yIChxY29sID0gMDsgcWNvbCA8IG5xY29sczsgcWNvbCsrKQorCXsKKwkJaW50CQkJ ZGltID0gcWNvbF9kaW1zW3Fjb2xdOworCQlPaWQJCQlxdHlwZSA9IG1jdmxpc3QtPmZpbHRlcl90 eXBlc1tkaW1dOworCQlUeXBlQ2FjaGVFbnRyeSAqdHlwZW50cnk7CisJCU9pZAkJCWVxX2Z1bmNf b2lkOworCisJCXR5cGVudHJ5ID0gbG9va3VwX3R5cGVfY2FjaGUocXR5cGUsIFRZUEVDQUNIRV9F UV9PUFIpOworCQlpZiAoIU9pZElzVmFsaWQodHlwZW50cnktPmVxX29wcikpCisJCQlyZXR1cm4g MC4wOworCisJCWVxX2Z1bmNfb2lkID0gZ2V0X29wY29kZSh0eXBlbnRyeS0+ZXFfb3ByKTsKKwkJ aWYgKCFPaWRJc1ZhbGlkKGVxX2Z1bmNfb2lkKSkKKwkJCXJldHVybiAwLjA7CisKKwkJZm1ncl9p bmZvKGVxX2Z1bmNfb2lkLCAmZXFfZnVuY3NbcWNvbF0pOworCisJCS8qIEFsbG9jYXRlIGZjaW5m byBmb3IgdGhpcyBkaW1lbnNpb24gKi8KKwkJZmNpbmZvX2FycltxY29sXSA9IChGdW5jdGlvbkNh bGxJbmZvKSBwYWxsb2MoU2l6ZUZvckZ1bmN0aW9uQ2FsbEluZm8oMikpOworCQlJbml0RnVuY3Rp b25DYWxsSW5mb0RhdGEoKmZjaW5mb19hcnJbcWNvbF0sICZlcV9mdW5jc1txY29sXSwgMiwgY29s bGF0aW9uLCBOVUxMLCBOVUxMKTsKKwl9CisKKwl0b3RhbF9zZWwgPSAwLjA7CisKKwllbG9nKERF QlVHMSwgImpvaW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHk6IHNlYXJjaGluZyAlZCBmaWx0 ZXIgdmFsdWVzIGluICVkIE1DViBpdGVtcyIsCisJCSBsaXN0X2xlbmd0aChmaWx0ZXJfdmFsdWVz KSwgbWN2bGlzdC0+bml0ZW1zKTsKKworCS8qIEZvciBzaW5nbGUtY29sdW1uIHF1ZXJpZXM6IGl0 ZXJhdGUgZmlsdGVyIHZhbHVlcyAqLworCWlmIChucWNvbHMgPT0gMSkKKwl7CisJCWludAkJCWRp bSA9IHFjb2xfZGltc1swXTsKKwkJYm9vbAkgICAqbWF0Y2hlZF9pdGVtczsKKworCQkvKgorCQkg KiBUcmFjayB3aGljaCBNQ1YgaXRlbXMgaGF2ZSBiZWVuIG1hdGNoZWQgdG8gYXZvaWQgZG91Ymxl LWNvdW50aW5nCisJCSAqIHdoZW4gbXVsdGlwbGUgZmlsdGVyIHZhbHVlcyBtYXRjaCB0aGUgc2Ft ZSBNQ1YgaXRlbS4KKwkJICovCisJCW1hdGNoZWRfaXRlbXMgPSAoYm9vbCAqKSBwYWxsb2MwKG1j dmxpc3QtPm5pdGVtcyAqIHNpemVvZihib29sKSk7CisKKwkJZm9yZWFjaChsYywgZmlsdGVyX3Zh bHVlcykKKwkJeworCQkJRGF0dW0JCWZpbHRlcl92YWx1ZSA9IFBvaW50ZXJHZXREYXR1bShsZmly c3QobGMpKTsKKworCQkJZmNpbmZvX2FyclswXS0+YXJnc1sxXS52YWx1ZSA9IGZpbHRlcl92YWx1 ZTsKKwkJCWZjaW5mb19hcnJbMF0tPmFyZ3NbMV0uaXNudWxsID0gZmFsc2U7CisKKwkJCWZvciAo aXRlbV9pZHggPSAwOyBpdGVtX2lkeCA8IG1jdmxpc3QtPm5pdGVtczsgaXRlbV9pZHgrKykKKwkJ CXsKKwkJCQlKb2luTUNWSXRlbSAqaXRlbTsKKwkJCQlEYXR1bQkJZnJlc3VsdDsKKworCQkJCWlm IChtYXRjaGVkX2l0ZW1zW2l0ZW1faWR4XSkKKwkJCQkJY29udGludWU7CisKKwkJCQlpdGVtID0g Jm1jdmxpc3QtPml0ZW1zW2l0ZW1faWR4XTsKKworCQkJCWlmIChpdGVtLT5pc251bGxbZGltXSkK KwkJCQkJY29udGludWU7CisKKwkJCQlmY2luZm9fYXJyWzBdLT5hcmdzWzBdLnZhbHVlID0gaXRl bS0+dmFsdWVzW2RpbV07CisJCQkJZmNpbmZvX2FyclswXS0+YXJnc1swXS5pc251bGwgPSBmYWxz ZTsKKwkJCQlmY2luZm9fYXJyWzBdLT5pc251bGwgPSBmYWxzZTsKKworCQkJCWZyZXN1bHQgPSBG dW5jdGlvbkNhbGxJbnZva2UoZmNpbmZvX2FyclswXSk7CisKKwkJCQlpZiAoIWZjaW5mb19hcnJb MF0tPmlzbnVsbCAmJiBEYXR1bUdldEJvb2woZnJlc3VsdCkpCisJCQkJeworCQkJCQllbG9nKERF QlVHMSwgIiAgTUFUQ0ggYXQgaXRlbVslZF0gZGltWyVkXSwgZnJlcXVlbmN5PSUuNmYiLCBpdGVt X2lkeCwgZGltLCBpdGVtLT5mcmVxdWVuY3kpOworCQkJCQl0b3RhbF9zZWwgKz0gaXRlbS0+ZnJl cXVlbmN5OworCQkJCQltYXRjaGVkX2l0ZW1zW2l0ZW1faWR4XSA9IHRydWU7CisKKwkJCQkJaWYg KG1jdmxpc3QtPm5kaW1lbnNpb25zID09IDEpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJ CX0KKwl9CisJLyogRm9yIG11bHRpLWNvbHVtbiBxdWVyaWVzOiBleGFjdCBtYXRjaCBvbiBhbGwg ZGltZW5zaW9ucyAqLworCWVsc2UKKwl7CisJCURhdHVtCSAgICpxdWVyeV92YWx1ZXM7CisKKwkJ LyoKKwkJICogVE9ETzogU3VwcG9ydCBJTiBjbGF1c2VzIG9uIG11bHRpcGxlIGNvbHVtbnMuIEN1 cnJlbnRseSB3ZSBvbmx5CisJCSAqIHN1cHBvcnQgZXhhY3QgZXF1YWxpdHkgKG9uZSB2YWx1ZSBw ZXIgY29sdW1uKSBpbiBtdWx0aS1jb2x1bW4KKwkJICogZmlsdGVycy4KKwkJICovCisJCWlmIChs aXN0X2xlbmd0aChmaWx0ZXJfdmFsdWVzKSAhPSBucWNvbHMpCisJCXsKKwkJCWVsb2coREVCVUcx LCAiam9pbiBNQ1Ygc2VsZWN0aXZpdHk6IG11bHRpLWNvbHVtbiBJTiBjbGF1c2VzIG5vdCB5ZXQg c3VwcG9ydGVkIChleHBlY3RlZCAlZCB2YWx1ZXMsIGdvdCAlZCkiLAorCQkJCSBucWNvbHMsIGxp c3RfbGVuZ3RoKGZpbHRlcl92YWx1ZXMpKTsKKwkJCXJldHVybiAwLjA7CisJCX0KKworCQkvKiBF eHRyYWN0IHF1ZXJ5IHZhbHVlcyBmb3IgZWFjaCBkaW1lbnNpb24gKi8KKwkJcXVlcnlfdmFsdWVz ID0gKERhdHVtICopIHBhbGxvYyhucWNvbHMgKiBzaXplb2YoRGF0dW0pKTsKKwkJcWNvbCA9IDA7 CisJCWZvcmVhY2gobGMsIGZpbHRlcl92YWx1ZXMpCisJCXsKKwkJCS8qIEVhY2ggZWxlbWVudCBz aG91bGQgYmUgYSBzaW5nbGUtZWxlbWVudCBsaXN0IGZvciBlcXVhbGl0eSAqLworCQkJTGlzdAkg ICAqdmFsX2xpc3QgPSAoTGlzdCAqKSBsZmlyc3QobGMpOworCisJCQlpZiAobGlzdF9sZW5ndGgo dmFsX2xpc3QpICE9IDEpCisJCQl7CisJCQkJZWxvZyhERUJVRzEsICJqb2luIE1DViBzZWxlY3Rp dml0eTogbXVsdGktdmFsdWUgZmlsdGVycyBub3QgeWV0IHN1cHBvcnRlZCBmb3IgbXVsdGktY29s dW1uIGZpbHRlcnMiKTsKKwkJCQlyZXR1cm4gMC4wOworCQkJfQorCQkJcXVlcnlfdmFsdWVzW3Fj b2xdID0gUG9pbnRlckdldERhdHVtKGxpbml0aWFsKHZhbF9saXN0KSk7CisJCQlxY29sKys7CisJ CX0KKworCQkvKiBGaW5kIE1DViBpdGVtcyB0aGF0IG1hdGNoIG9uIEFMTCBxdWVyaWVkIGRpbWVu c2lvbnMgKi8KKwkJZm9yIChpdGVtX2lkeCA9IDA7IGl0ZW1faWR4IDwgbWN2bGlzdC0+bml0ZW1z OyBpdGVtX2lkeCsrKQorCQl7CisJCQlKb2luTUNWSXRlbSAqaXRlbSA9ICZtY3ZsaXN0LT5pdGVt c1tpdGVtX2lkeF07CisJCQlib29sCQlhbGxfbWF0Y2ggPSB0cnVlOworCisJCQkvKiBDaGVjayBl YWNoIHF1ZXJpZWQgZGltZW5zaW9uICovCisJCQlmb3IgKHFjb2wgPSAwOyBxY29sIDwgbnFjb2xz OyBxY29sKyspCisJCQl7CisJCQkJaW50CQkJZGltID0gcWNvbF9kaW1zW3Fjb2xdOworCQkJCURh dHVtCQlmcmVzdWx0OworCisJCQkJaWYgKGl0ZW0tPmlzbnVsbFtkaW1dKQorCQkJCXsKKwkJCQkJ YWxsX21hdGNoID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWZjaW5mb19hcnJb cWNvbF0tPmFyZ3NbMF0udmFsdWUgPSBpdGVtLT52YWx1ZXNbZGltXTsKKwkJCQlmY2luZm9fYXJy W3Fjb2xdLT5hcmdzWzBdLmlzbnVsbCA9IGZhbHNlOworCQkJCWZjaW5mb19hcnJbcWNvbF0tPmFy Z3NbMV0udmFsdWUgPSBxdWVyeV92YWx1ZXNbcWNvbF07CisJCQkJZmNpbmZvX2FycltxY29sXS0+ YXJnc1sxXS5pc251bGwgPSBmYWxzZTsKKwkJCQlmY2luZm9fYXJyW3Fjb2xdLT5pc251bGwgPSBm YWxzZTsKKworCQkJCWZyZXN1bHQgPSBGdW5jdGlvbkNhbGxJbnZva2UoZmNpbmZvX2FycltxY29s XSk7CisKKwkJCQlpZiAoZmNpbmZvX2FycltxY29sXS0+aXNudWxsIHx8ICFEYXR1bUdldEJvb2wo ZnJlc3VsdCkpCisJCQkJeworCQkJCQlhbGxfbWF0Y2ggPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJ CQkJfQorCQkJfQorCisJCQlpZiAoYWxsX21hdGNoKQorCQkJeworCQkJCWVsb2coREVCVUcxLCAi ICBNQVRDSCBhdCBpdGVtWyVkXSAoYWxsICVkIGRpbWVuc2lvbnMpLCBmcmVxdWVuY3k9JS42ZiIs IGl0ZW1faWR4LCBucWNvbHMsIGl0ZW0tPmZyZXF1ZW5jeSk7CisJCQkJdG90YWxfc2VsICs9IGl0 ZW0tPmZyZXF1ZW5jeTsKKwkJCX0KKwkJfQorCX0KKworCWVsb2coREVCVUcxLCAiam9pbl9tY3Zf Y2xhdXNlbGlzdF9zZWxlY3Rpdml0eTogdG90YWxfc2VsPSUuNmYiLCB0b3RhbF9zZWwpOworCisJ LyoKKwkgKiBGb3IgSU4gY2xhdXNlcyB3aXRoIG11bHRpcGxlIHZhbHVlcywgcmV0dXJuIFBFUi1W QUxVRSBzZWxlY3Rpdml0eS4KKwkgKiBQb3N0Z3JlU1FMJ3Mgam9pbiBzaXplIGZvcm11bGEgbXVs dGlwbGllcyBieSBpbm5lcl9yb3dzIChudW1iZXIgb2YKKwkgKiB2YWx1ZXMgaW4gSU4gbGlzdCks IHNvIHJldHVybmluZyBwZXItdmFsdWUgc2VsZWN0aXZpdHkgZ2l2ZXMgdGhlCisJICogY29ycmVj dCByZXN1bHQuCisJICoKKwkgKiBDdXJyZW50bHkgb25seSBzaW5nbGUtY29sdW1uIHF1ZXJpZXMg c3VwcG9ydCBtdWx0aXBsZSBmaWx0ZXIgdmFsdWVzOworCSAqIG11bHRpLWNvbHVtbiBxdWVyaWVz IGJhaWxzIG91dCBlYXJseS4gV2hlbiBtdWx0aS1jb2x1bW4gSU4gc3VwcG9ydCBpcworCSAqIGFk ZGVkLCB0aGlzIGFkanVzdG1lbnQgd2lsbCBhcHBseSB0aGVyZSB0b28uCisJICovCisJaWYgKG5x Y29scyA9PSAxICYmIGxpc3RfbGVuZ3RoKGZpbHRlcl92YWx1ZXMpID4gMSkKKwl7CisJCWludAkJ CW51bV92YWx1ZXMgPSBsaXN0X2xlbmd0aChmaWx0ZXJfdmFsdWVzKTsKKworCQllbG9nKERFQlVH MSwgImpvaW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHk6IElOIGNsYXVzZSB3aXRoICVkIHZh bHVlcywgcmV0dXJuaW5nIHBlci12YWx1ZTogJS42ZiAvICVkID0gJS42ZiIsCisJCQkgbnVtX3Zh bHVlcywgdG90YWxfc2VsLCBudW1fdmFsdWVzLCB0b3RhbF9zZWwgLyBudW1fdmFsdWVzKTsKKwor CQl0b3RhbF9zZWwgLz0gbnVtX3ZhbHVlczsKKwl9CisKKwlyZXR1cm4gdG90YWxfc2VsOworfQor CisvKgorICogZXh0cmFjdF9maWx0ZXJfaW5mbworICoJCUV4dHJhY3QgZmlsdGVyIGNvbHVtbiBh bmQgY29uc3RhbnQgdmFsdWUocykgZnJvbSBhIGZpbHRlciBjbGF1c2UKKyAqCisgKiBIYW5kbGVz IHR3byB0eXBlcyBvZiBmaWx0ZXIgY2xhdXNlczoKKyAqIDEuIE9wRXhwcjogY29sID0gY29uc3Rh bnQKKyAqIDIuIFNjYWxhckFycmF5T3BFeHByOiBjb2wgSU4gKGNvbnN0MSwgY29uc3QyLCAuLi4p CisgKgorICogUmV0dXJucyB0cnVlIGlmIGEgdmFsaWQgZmlsdGVyIHBhdHRlcm4gaXMgZm91bmQs IGZhbHNlIG90aGVyd2lzZS4KKyAqIE9uIHN1Y2Nlc3MsIHNldHMgKmZpbHRlcl92YXIsICpmaWx0 ZXJfdmFsdWVzIChsaXN0IG9mIERhdHVtcyksCisgKiAqZmlsdGVyX3R5cGUsICpjb2xsYXRpb24s IGFuZCAqaXNfaW5fY2xhdXNlLgorICovCitzdGF0aWMgYm9vbAorZXh0cmFjdF9maWx0ZXJfaW5m byhOb2RlICpjbGF1c2UsCisJCQkJCUluZGV4IGV4cGVjdGVkX3JlbGlkLAorCQkJCQlWYXIgKipm aWx0ZXJfdmFyLAorCQkJCQlMaXN0ICoqZmlsdGVyX3ZhbHVlcywKKwkJCQkJT2lkICpmaWx0ZXJf dHlwZSwKKwkJCQkJT2lkICpjb2xsYXRpb24sCisJCQkJCWJvb2wgKmlzX2luX2NsYXVzZSkKK3sK KwkqZmlsdGVyX3ZhciA9IE5VTEw7CisJKmZpbHRlcl92YWx1ZXMgPSBOSUw7CisJKmlzX2luX2Ns YXVzZSA9IGZhbHNlOworCisJLyogQ2FzZSAxOiBPcEV4cHIgLSBzaW1wbGUgZXF1YWxpdHkgKGNv bCA9IGNvbnN0KSAqLworCWlmIChJc0EoY2xhdXNlLCBPcEV4cHIpKQorCXsKKwkJT3BFeHByCSAg ICpvcGV4cHIgPSAoT3BFeHByICopIGNsYXVzZTsKKwkJTm9kZQkgICAqdmFyX25vZGUgPSBOVUxM OworCQlDb25zdAkgICAqY29uc3Rfbm9kZSA9IE5VTEw7CisJCWJvb2wJCWV4cHJvbmxlZnQ7CisK KwkJaWYgKGxpc3RfbGVuZ3RoKG9wZXhwci0+YXJncykgIT0gMikKKwkJCXJldHVybiBmYWxzZTsK KworCQkvKiBDaGVjayBmb3IgcGF0dGVybjogVmFyID0gQ29uc3Qgb3IgQ29uc3QgPSBWYXIgKi8K KwkJaWYgKCFleGFtaW5lX29wY2xhdXNlX2FyZ3Mob3BleHByLT5hcmdzLCAmdmFyX25vZGUsICZj b25zdF9ub2RlLCAmZXhwcm9ubGVmdCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKCF2YXJf bm9kZSB8fCAhY29uc3Rfbm9kZSB8fCAhSXNBKHZhcl9ub2RlLCBWYXIpKQorCQkJcmV0dXJuIGZh bHNlOworCisJCSpmaWx0ZXJfdmFyID0gKFZhciAqKSB2YXJfbm9kZTsKKworCQkvKiBWZXJpZnkg dGhlIFZhciBpcyBmcm9tIHRoZSBleHBlY3RlZCByZWxhdGlvbiAqLworCQlpZiAoKCpmaWx0ZXJf dmFyKS0+dmFybm8gIT0gZXhwZWN0ZWRfcmVsaWQpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyog Q3JlYXRlIHNpbmdsZS1lbGVtZW50IGxpc3QgLSBzdG9yZSBEYXR1bSBhcyBwb2ludGVyICovCisJ CSpmaWx0ZXJfdmFsdWVzID0gbGlzdF9tYWtlMShEYXR1bUdldFBvaW50ZXIoY29uc3Rfbm9kZS0+ Y29uc3R2YWx1ZSkpOworCQkqZmlsdGVyX3R5cGUgPSBjb25zdF9ub2RlLT5jb25zdHR5cGU7CisJ CSpjb2xsYXRpb24gPSAoKmZpbHRlcl92YXIpLT52YXJjb2xsaWQ7CisJCSppc19pbl9jbGF1c2Ug PSBmYWxzZTsKKworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBDYXNlIDI6IFNjYWxhckFycmF5 T3BFeHByIC0gSU4gY2xhdXNlIChjb2wgSU4gKC4uLikpICovCisJZWxzZSBpZiAoSXNBKGNsYXVz ZSwgU2NhbGFyQXJyYXlPcEV4cHIpKQorCXsKKwkJU2NhbGFyQXJyYXlPcEV4cHIgKnNhb3AgPSAo U2NhbGFyQXJyYXlPcEV4cHIgKikgY2xhdXNlOworCQlOb2RlCSAgICpzY2FsYXJfbm9kZTsKKwkJ Tm9kZQkgICAqYXJyYXlfbm9kZTsKKwkJQ29uc3QJICAgKmFycmF5X2NvbnN0OworCQlBcnJheVR5 cGUgICphcnI7CisJCWludAkJCW5pdGVtczsKKwkJRGF0dW0JICAgKml0ZW1zOworCQlib29sCSAg ICpudWxsczsKKwkJaW50CQkJaTsKKwkJT2lkCQkJZWxtdHlwZTsKKwkJaW50MTYJCWVsbWxlbjsK KwkJYm9vbAkJZWxtYnl2YWw7CisJCWNoYXIJCWVsbWFsaWduOworCisJCS8qIE9ubHkgc3VwcG9y dCBBTlkgKElOKSwgbm90IEFMTCAqLworCQlpZiAoIXNhb3AtPnVzZU9yKQorCQkJcmV0dXJuIGZh bHNlOworCisJCWlmIChsaXN0X2xlbmd0aChzYW9wLT5hcmdzKSAhPSAyKQorCQkJcmV0dXJuIGZh bHNlOworCisJCXNjYWxhcl9ub2RlID0gKE5vZGUgKikgbGluaXRpYWwoc2FvcC0+YXJncyk7CisJ CWFycmF5X25vZGUgPSAoTm9kZSAqKSBsc2Vjb25kKHNhb3AtPmFyZ3MpOworCisJCS8qIFN0cmlw IGFueSBSZWxhYmVsVHlwZSBub2RlcyAoZS5nLiwgdmFyY2hhciBjYXN0IHRvIHRleHQpICovCisJ CXNjYWxhcl9ub2RlID0gc3RyaXBfaW1wbGljaXRfY29lcmNpb25zKHNjYWxhcl9ub2RlKTsKKwor CQkvKiBTY2FsYXIgbXVzdCBiZSBhIFZhciBhZnRlciBzdHJpcHBpbmcgY29lcmNpb25zICovCisJ CWlmICghSXNBKHNjYWxhcl9ub2RlLCBWYXIpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSpmaWx0 ZXJfdmFyID0gKFZhciAqKSBzY2FsYXJfbm9kZTsKKworCQkvKiBWZXJpZnkgdGhlIFZhciBpcyBm cm9tIHRoZSBleHBlY3RlZCByZWxhdGlvbiAqLworCQlpZiAoKCpmaWx0ZXJfdmFyKS0+dmFybm8g IT0gZXhwZWN0ZWRfcmVsaWQpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJLyogQXJyYXkgbXVzdCBi ZSBhIENvbnN0IGZvciB1cyB0byBleHRyYWN0IHZhbHVlcyAqLworCQlpZiAoIUlzQShhcnJheV9u b2RlLCBDb25zdCkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJYXJyYXlfY29uc3QgPSAoQ29uc3Qg KikgYXJyYXlfbm9kZTsKKworCQkvKiBDYW4ndCBoYW5kbGUgTlVMTCBhcnJheXMgKi8KKwkJaWYg KGFycmF5X2NvbnN0LT5jb25zdGlzbnVsbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkvKiBEZWNv bnN0cnVjdCB0aGUgYXJyYXkgKi8KKwkJYXJyID0gRGF0dW1HZXRBcnJheVR5cGVQKGFycmF5X2Nv bnN0LT5jb25zdHZhbHVlKTsKKwkJZWxtdHlwZSA9IEFSUl9FTEVNVFlQRShhcnIpOworCisJCS8q IEdldCB0eXBlIGluZm8gZm9yIGRlY29uc3RydWN0aW9uICovCisJCWdldF90eXBsZW5ieXZhbGFs aWduKGVsbXR5cGUsICZlbG1sZW4sICZlbG1ieXZhbCwgJmVsbWFsaWduKTsKKworCQlkZWNvbnN0 cnVjdF9hcnJheShhcnIsIGVsbXR5cGUsIGVsbWxlbiwgZWxtYnl2YWwsIGVsbWFsaWduLAorCQkJ CQkJICAmaXRlbXMsICZudWxscywgJm5pdGVtcyk7CisKKwkJLyogQnVpbGQgbGlzdCBvZiBub24t TlVMTCBEYXR1bXMgKi8KKwkJKmZpbHRlcl92YWx1ZXMgPSBOSUw7CisJCWZvciAoaSA9IDA7IGkg PCBuaXRlbXM7IGkrKykKKwkJeworCQkJaWYgKCFudWxsc1tpXSkKKwkJCXsKKwkJCQkvKgorCQkJ CSAqIFN0b3JlIERhdHVtIGFzIHBvaW50ZXIgLSBzYWZlIHNpbmNlIERhdHVtIGFuZCBwb2ludGVy IGFyZQorCQkJCSAqIHNhbWUgc2l6ZQorCQkJCSAqLworCQkJCSpmaWx0ZXJfdmFsdWVzID0gbGFw cGVuZCgqZmlsdGVyX3ZhbHVlcywgRGF0dW1HZXRQb2ludGVyKGl0ZW1zW2ldKSk7CisJCQl9CisJ CX0KKworCQkvKiBJZiBhbGwgdmFsdWVzIHdlcmUgTlVMTCwgd2UgY2FuJ3QgdXNlIHRoaXMgKi8K KwkJaWYgKCpmaWx0ZXJfdmFsdWVzID09IE5JTCkKKwkJCXJldHVybiBmYWxzZTsKKworCQkqZmls dGVyX3R5cGUgPSBlbG10eXBlOworCQkqY29sbGF0aW9uID0gc2FvcC0+aW5wdXRjb2xsaWQ7CisJ CSppc19pbl9jbGF1c2UgPSB0cnVlOworCisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBm YWxzZTsKK30KKworLyoKKyAqIGZpbmRfam9pbl9tY3Zfb3Bwb3J0dW5pdHkKKyAqCQlEZXRlY3Qg aWYgYSBqb2luK2ZpbHRlciBjb21iaW5hdGlvbiBjYW4gdXNlIGpvaW4gTUNWIHN0YXRpc3RpY3Mu CisgKgorICogTG9va3MgZm9yIHR3byBwYXR0ZXJuczoKKyAqCisgKiBQYXR0ZXJuIDE6IG91dGVy X3JlbCAocmVmZXJlbmNpbmcpIEpPSU4gaW5uZXJfcmVsIChyZWZlcmVuY2VkKQorICogICAgICAg ICAgICBXSEVSRSBpbm5lcl9yZWwuY29sID0gY29uc3RhbnQgW29yIElOICguLi4pXQorICogUGF0 dGVybiAyOiBvdXRlcl9yZWwgKHJlZmVyZW5jZWQpIEpPSU4gaW5uZXJfcmVsIChyZWZlcmVuY2lu ZykKKyAqICAgICAgICAgICAgV0hFUkUgb3V0ZXJfcmVsLmNvbCA9IGNvbnN0YW50IFtvciBJTiAo Li4uKV0KKyAqCisgKiBSZXR1cm5zIGFuIGFsbG9jYXRlZCBKb2luTUNWT3Bwb3J0dW5pdHkgaWYg cGF0dGVybiBpcyBmb3VuZCwgTlVMTCBvdGhlcndpc2UuCisgKiBUaGUgY2FsbGVyIGlzIHJlc3Bv bnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZCBzdHJ1Y3R1cmUuCisgKi8KK0pvaW5NQ1ZP cHBvcnR1bml0eSAqCitmaW5kX2pvaW5fbWN2X29wcG9ydHVuaXR5KFBsYW5uZXJJbmZvICpyb290 LAorCQkJCQkJICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCisJCQkJCQkgIFJlbE9wdEluZm8gKmlu bmVyX3JlbCwKKwkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0KQoreworCUxpc3RDZWxsICAgKmxj OworCVZhcgkJICAgKmpvaW5fdmFyX291dGVyID0gTlVMTDsKKwlWYXIJCSAgICpqb2luX3Zhcl9p bm5lciA9IE5VTEw7CisJUmVzdHJpY3RJbmZvICpqb2luX3JpbmZvID0gTlVMTDsKKwlSZWxPcHRJ bmZvICpmaWx0ZXJlZF9yZWw7CisJVmFyCQkgICAqZmlsdGVyZWRfdmFyOworCVZhcgkJICAgKnRh cmdldF92YXI7CisJUmFuZ2VUYmxFbnRyeSAqZmlsdGVyZWRfcnRlOworCVJhbmdlVGJsRW50cnkg KnRhcmdldF9ydGU7CisJTGlzdAkgICAqZmlsdGVyX2F0dG51bXNfbGlzdCA9IE5JTDsKKwlMaXN0 CSAgICpmaWx0ZXJfdmFsdWVzX2xpc3QgPSBOSUw7CisJTGlzdAkgICAqZmlsdGVyX3R5cGVzX2xp c3QgPSBOSUw7CisJTGlzdAkgICAqZmlsdGVyX3JpbmZvc19saXN0ID0gTklMOworCU9pZAkJCWNv bGxhdGlvbiA9IEludmFsaWRPaWQ7CisJYm9vbAkJYWxsX2ZpbHRlcnNfdmFsaWQgPSB0cnVlOwor CUpvaW5NQ1ZPcHBvcnR1bml0eSAqam9pbl9vcHA7CisKKwkvKiBGaW5kIGpvaW4gY2xhdXNlOiBv dXRlcl9yZWwuY29sID0gaW5uZXJfcmVsLmNvbCAqLworCWZvcmVhY2gobGMsIHJlc3RyaWN0bGlz dCkKKwl7CisJCVJlc3RyaWN0SW5mbyAqcmluZm87CisJCU9wRXhwcgkgICAqb3BleHByOworCQlW YXIJCSAgICpsZWZ0X3ZhcjsKKwkJVmFyCQkgICAqcmlnaHRfdmFyOworCQlOb2RlCSAgICpub2Rl ID0gbGZpcnN0KGxjKTsKKworCQkvKgorCQkgKiBTa2lwIGlmIG5vdCBhIFJlc3RyaWN0SW5mby4g RHVyaW5nIGluZGV4IHBhdGggY29zdGluZywgcmVzdHJpY3RsaXN0CisJCSAqIGNhbiBjb250YWlu IHJhdyBleHByZXNzaW9uIG5vZGVzIChPcEV4cHIsIFNjYWxhckFycmF5T3BFeHByLCBldGMuKQor CQkgKiBmcm9tIGluZGV4IHByZWRpY2F0ZXMsIG5vdCBqdXN0IFJlc3RyaWN0SW5mbyB3cmFwcGVy cy4KKwkJICovCisJCWlmICghSXNBKG5vZGUsIFJlc3RyaWN0SW5mbykpCisJCQljb250aW51ZTsK KworCQlyaW5mbyA9IChSZXN0cmljdEluZm8gKikgbm9kZTsKKwkJaWYgKCFJc0EocmluZm8tPmNs YXVzZSwgT3BFeHByKSkKKwkJCWNvbnRpbnVlOworCisJCW9wZXhwciA9IChPcEV4cHIgKikgcmlu Zm8tPmNsYXVzZTsKKworCQlpZiAobGlzdF9sZW5ndGgob3BleHByLT5hcmdzKSAhPSAyKQorCQkJ Y29udGludWU7CisKKwkJLyogRklYTUU6IEV4dHJhY3QgbGVmdCBhbmQgcmlnaHQgYXJndW1lbnRz IHNtYXJ0ZXIgKi8KKwkJbGVmdF92YXIgPSAoVmFyICopIGxpbml0aWFsKG9wZXhwci0+YXJncyk7 CisJCXJpZ2h0X3ZhciA9IChWYXIgKikgbHNlY29uZChvcGV4cHItPmFyZ3MpOworCisJCS8qIENo ZWNrIGlmIHRoaXMgbWF0Y2hlcyBvdXIgam9pbiBwYXR0ZXJuICovCisJCWlmIChJc0EobGVmdF92 YXIsIFZhcikgJiYgSXNBKHJpZ2h0X3ZhciwgVmFyKSkKKwkJeworCQkJaWYgKGJtc19pc19tZW1i ZXIobGVmdF92YXItPnZhcm5vLCBvdXRlcl9yZWwtPnJlbGlkcykgJiYKKwkJCQlibXNfaXNfbWVt YmVyKHJpZ2h0X3Zhci0+dmFybm8sIGlubmVyX3JlbC0+cmVsaWRzKSkKKwkJCXsKKwkJCQlqb2lu X3Zhcl9vdXRlciA9IGxlZnRfdmFyOworCQkJCWpvaW5fdmFyX2lubmVyID0gcmlnaHRfdmFyOwor CQkJCWpvaW5fcmluZm8gPSByaW5mbzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKGJt c19pc19tZW1iZXIocmlnaHRfdmFyLT52YXJubywgb3V0ZXJfcmVsLT5yZWxpZHMpICYmCisJCQkJ CSBibXNfaXNfbWVtYmVyKGxlZnRfdmFyLT52YXJubywgaW5uZXJfcmVsLT5yZWxpZHMpKQorCQkJ eworCQkJCWpvaW5fdmFyX291dGVyID0gcmlnaHRfdmFyOworCQkJCWpvaW5fdmFyX2lubmVyID0g bGVmdF92YXI7CisJCQkJam9pbl9yaW5mbyA9IHJpbmZvOworCQkJCWJyZWFrOworCQkJfQorCQl9 CisJfQorCisJaWYgKCFqb2luX3Zhcl9vdXRlciB8fCAham9pbl92YXJfaW5uZXIgfHwgIWpvaW5f cmluZm8pCisJCXJldHVybiBOVUxMOwkJCS8qIE5vIGpvaW4gY2xhdXNlIGZvdW5kICovCisKKwkv KgorCSAqIEZpbmQgZmlsdGVyIGNsYXVzZXM6IG90aGVyX3JlbC5jb2wgPSBjb25zdGFudCBbb3Ig SU4gKC4uLildCisJICoKKwkgKiBEZXRlcm1pbmUgd2hpY2ggcmVsYXRpb24gaGFzIGZpbHRlciBj b25kaXRpb25zLiBXZSBsb29rIGZvciBhIGJhc2UKKwkgKiByZWxhdGlvbiAoc2luZ2xldG9uKSB3 aXRoIGJhc2VyZXN0cmljdGluZm8gY2xhdXNlcy4KKwkgKi8KKwlpZiAoYm1zX21lbWJlcnNoaXAo aW5uZXJfcmVsLT5yZWxpZHMpID09IEJNU19TSU5HTEVUT04gJiYKKwkJaW5uZXJfcmVsLT5iYXNl cmVzdHJpY3RpbmZvICE9IE5JTCkKKwl7CisJCS8qIFBhdHRlcm4gMTogaW5uZXIgaGFzIGZpbHRl cnMsIG91dGVyIGlzIHRhcmdldCAqLworCQlmaWx0ZXJlZF9yZWwgPSBpbm5lcl9yZWw7CisJCWZp bHRlcmVkX3ZhciA9IGpvaW5fdmFyX2lubmVyOworCQl0YXJnZXRfdmFyID0gam9pbl92YXJfb3V0 ZXI7CisJfQorCWVsc2UgaWYgKGJtc19tZW1iZXJzaGlwKG91dGVyX3JlbC0+cmVsaWRzKSA9PSBC TVNfU0lOR0xFVE9OICYmCisJCQkgb3V0ZXJfcmVsLT5iYXNlcmVzdHJpY3RpbmZvICE9IE5JTCkK Kwl7CisJCS8qIFBhdHRlcm4gMjogb3V0ZXIgaGFzIGZpbHRlcnMsIGlubmVyIGlzIHRhcmdldCAq LworCQlmaWx0ZXJlZF9yZWwgPSBvdXRlcl9yZWw7CisJCWZpbHRlcmVkX3ZhciA9IGpvaW5fdmFy X291dGVyOworCQl0YXJnZXRfdmFyID0gam9pbl92YXJfaW5uZXI7CisJfQorCWVsc2UKKwl7CisJ CS8qIE5vIGJhc2UgcmVsYXRpb24gd2l0aCBmaWx0ZXJzIGZvdW5kICovCisJCXJldHVybiBOVUxM OworCX0KKworCS8qIFRyeSB0byBleHRyYWN0IGZpbHRlciBpbmZvIGZyb20gQUxMIGJhc2VyZXN0 cmljdGluZm8gY2xhdXNlcyAqLworCWZvcmVhY2gobGMsIGZpbHRlcmVkX3JlbC0+YmFzZXJlc3Ry aWN0aW5mbykKKwl7CisJCVJlc3RyaWN0SW5mbyAqcmluZm8gPSBsZmlyc3Rfbm9kZShSZXN0cmlj dEluZm8sIGxjKTsKKwkJVmFyCQkgICAqZmlsdGVyX3ZhcjsKKwkJTGlzdAkgICAqZmlsdGVyX3Zh bHVlczsKKwkJT2lkCQkJZmlsdGVyX3R5cGU7CisJCU9pZAkJCWZpbHRlcl9jb2xsYXRpb247CisJ CWJvb2wJCWZpbHRlcl9pc19pbjsKKworCQlpZiAoZXh0cmFjdF9maWx0ZXJfaW5mbygoTm9kZSAq KSByaW5mby0+Y2xhdXNlLCBmaWx0ZXJlZF9yZWwtPnJlbGlkLAorCQkJCQkJCQkmZmlsdGVyX3Zh ciwgJmZpbHRlcl92YWx1ZXMsICZmaWx0ZXJfdHlwZSwKKwkJCQkJCQkJJmZpbHRlcl9jb2xsYXRp b24sICZmaWx0ZXJfaXNfaW4pKQorCQl7CisJCQlmaWx0ZXJfYXR0bnVtc19saXN0ID0gbGFwcGVu ZF9pbnQoZmlsdGVyX2F0dG51bXNfbGlzdCwgZmlsdGVyX3Zhci0+dmFyYXR0bm8pOworCQkJZmls dGVyX3ZhbHVlc19saXN0ID0gbGFwcGVuZChmaWx0ZXJfdmFsdWVzX2xpc3QsIGZpbHRlcl92YWx1 ZXMpOworCQkJZmlsdGVyX3R5cGVzX2xpc3QgPSBsYXBwZW5kX29pZChmaWx0ZXJfdHlwZXNfbGlz dCwgZmlsdGVyX3R5cGUpOworCQkJZmlsdGVyX3JpbmZvc19saXN0ID0gbGFwcGVuZChmaWx0ZXJf cmluZm9zX2xpc3QsIHJpbmZvKTsKKworCQkJLyogVXNlIGZpcnN0IGZpbHRlcidzIGNvbGxhdGlv biAoc2hvdWxkIGJlIGNvbnNpc3RlbnQpICovCisJCQlpZiAoIU9pZElzVmFsaWQoY29sbGF0aW9u KSkKKwkJCQljb2xsYXRpb24gPSBmaWx0ZXJfY29sbGF0aW9uOworCQl9CisJCWVsc2UKKwkJewor CQkJLyogVGhpcyBmaWx0ZXIgY2xhdXNlIGRvZXNuJ3QgbWF0Y2ggb3VyIHBhdHRlcm4gKi8KKwkJ CWFsbF9maWx0ZXJzX3ZhbGlkID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIElm IGFsbCBmaWx0ZXJzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZCwgY3JlYXRlIHRoZSBtYXRj aCAqLworCWlmICghYWxsX2ZpbHRlcnNfdmFsaWQgfHwgZmlsdGVyX2F0dG51bXNfbGlzdCA9PSBO SUwpCisJCXJldHVybiBOVUxMOworCisJLyogQnVpbGQgdGhlIEpvaW5NQ1ZPcHBvcnR1bml0eSBy ZXN1bHQgKi8KKwlqb2luX29wcCA9IHBhbGxvYyhzaXplb2YoSm9pbk1DVk9wcG9ydHVuaXR5KSk7 CisKKwkvKiBVc2UgVmFyJ3MgdmFybm8gdG8gZ2V0IHRoZSBhY3R1YWwgdGFibGUgUlRFcywgbm90 IHRoZSBqb2luIHJlbGlkICovCisJdGFyZ2V0X3J0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlb dGFyZ2V0X3Zhci0+dmFybm9dOworCWZpbHRlcmVkX3J0ZSA9IHJvb3QtPnNpbXBsZV9ydGVfYXJy YXlbZmlsdGVyZWRfdmFyLT52YXJub107CisKKwlqb2luX29wcC0+dGFyZ2V0X3JlbCA9IHRhcmdl dF9ydGUtPnJlbGlkOworCWpvaW5fb3BwLT50YXJnZXRfam9pbmtleSA9IHRhcmdldF92YXItPnZh cmF0dG5vOworCWpvaW5fb3BwLT5vdGhlcl9yZWwgPSBmaWx0ZXJlZF9ydGUtPnJlbGlkOworCWpv aW5fb3BwLT5vdGhlcl9qb2lua2V5ID0gZmlsdGVyZWRfdmFyLT52YXJhdHRubzsKKwlqb2luX29w cC0+ZmlsdGVyX2F0dG51bXMgPSBmaWx0ZXJfYXR0bnVtc19saXN0OworCWpvaW5fb3BwLT5maWx0 ZXJfdmFsdWVzID0gbGlzdF9sZW5ndGgoZmlsdGVyX3ZhbHVlc19saXN0KSA9PSAxID8KKwkJbGlu aXRpYWwoZmlsdGVyX3ZhbHVlc19saXN0KSA6IGZpbHRlcl92YWx1ZXNfbGlzdDsKKwlqb2luX29w cC0+Y29sbGF0aW9uID0gY29sbGF0aW9uOworCisJLyogVHJhY2sgd2hpY2ggY2xhdXNlcyB3ZXJl IHVzZWQgKi8KKwlqb2luX29wcC0+am9pbl9yaW5mb3MgPSBsaXN0X21ha2UxKGpvaW5fcmluZm8p OworCWpvaW5fb3BwLT5maWx0ZXJfcmluZm9zID0gZmlsdGVyX3JpbmZvc19saXN0OworCisJcmV0 dXJuIGpvaW5fb3BwOworfQorCisvKgorICogZmluZF9qb2luX21jdl9vcHBvcnR1bml0eV9pbl9j bGF1c2VzCisgKgkJRGV0ZWN0IGpvaW4gTUNWIG9wcG9ydHVuaXR5IGZyb20gYSBsaXN0IG9mIGNs YXVzZXMKKyAqCisgKiBFeGFtaW5lcyB0aGUgY2xhdXNlIGxpc3QgdG8gaWRlbnRpZnkgaWYgZXhh Y3RseSB0d28gYmFzZSByZWxhdGlvbnMgYXJlIGludm9sdmVkLAorICogdGhlbiBjYWxscyBmaW5k X2pvaW5fbWN2X29wcG9ydHVuaXR5KCkgd2l0aCB0aG9zZSByZWxhdGlvbnMuCisgKgorICogUmV0 dXJucyBOVUxMIGlmIG5vIGpvaW4gbWN2IHN0YXRzIHdvdWxkIHBvc3NpYmx5IGJlIGFwcGxpY2Fi bGUuCisgKi8KK0pvaW5NQ1ZPcHBvcnR1bml0eSAqCitmaW5kX2pvaW5fbWN2X29wcG9ydHVuaXR5 X2luX2NsYXVzZXMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmNsYXVzZXMpCit7CisJUmVsaWRz CQljbGF1c2VfcmVsaWRzID0gTlVMTDsKKwlMaXN0Q2VsbCAgICpsYzsKKwlpbnQJCQlyZWxpZDEg PSAtMTsKKwlpbnQJCQlyZWxpZDIgPSAtMTsKKwlSZWxPcHRJbmZvICpyZWwxOworCVJlbE9wdElu Zm8gKnJlbDI7CisJSm9pbk1DVk9wcG9ydHVuaXR5ICpqb2luX29wcDsKKworCS8qIENvbGxlY3Qg YWxsIHJlbGlkcyBtZW50aW9uZWQgaW4gY2xhdXNlcyAqLworCWZvcmVhY2gobGMsIGNsYXVzZXMp CisJeworCQlSZXN0cmljdEluZm8gKnJpbmZvOworCisJCWlmICghSXNBKGxmaXJzdChsYyksIFJl c3RyaWN0SW5mbykpCisJCQljb250aW51ZTsKKworCQlyaW5mbyA9IChSZXN0cmljdEluZm8gKikg bGZpcnN0KGxjKTsKKwkJY2xhdXNlX3JlbGlkcyA9IGJtc191bmlvbihjbGF1c2VfcmVsaWRzLCBy aW5mby0+Y2xhdXNlX3JlbGlkcyk7CisJfQorCisJaWYgKGNsYXVzZV9yZWxpZHMgPT0gTlVMTCkK KwkJcmV0dXJuIE5VTEw7CisKKwkvKiBFeHRyYWN0IGV4YWN0bHkgdHdvIGJhc2UgcmVsaWRzICov CisJcmVsaWQxID0gYm1zX25leHRfbWVtYmVyKGNsYXVzZV9yZWxpZHMsIC0xKTsKKwlpZiAocmVs aWQxIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZWxpZDIgPSBibXNfbmV4dF9tZW1iZXIoY2xh dXNlX3JlbGlkcywgcmVsaWQxKTsKKwlpZiAocmVsaWQyIDwgMCkKKwkJcmV0dXJuIE5VTEw7CQkJ LyogT25seSBvbmUgcmVsYXRpb24gKi8KKworCWlmIChibXNfbmV4dF9tZW1iZXIoY2xhdXNlX3Jl bGlkcywgcmVsaWQyKSA+PSAwKQorCQlyZXR1cm4gTlVMTDsJCQkvKiBNb3JlIHRoYW4gdHdvIHJl bGF0aW9ucyAqLworCisJLyogR2V0IFJlbE9wdEluZm8gZm9yIGJvdGggcmVsYXRpb25zIChza2lw IGlmIG5vdCBiYXNlIHJlbGF0aW9ucykgKi8KKwlyZWwxID0gZmluZF9iYXNlX3JlbF9pZ25vcmVf am9pbihyb290LCByZWxpZDEpOworCXJlbDIgPSBmaW5kX2Jhc2VfcmVsX2lnbm9yZV9qb2luKHJv b3QsIHJlbGlkMik7CisKKwlpZiAoIXJlbDEgfHwgIXJlbDIpCisJCXJldHVybiBOVUxMOwkJCS8q IE9uZSBvciBib3RoIGFyZSBqb2luIHJlbGF0aW9ucywgbm90IGJhc2UKKwkJCQkJCQkJICogdGFi bGVzICovCisKKwkvKiBDYWxsIHRoZSBtYWluIGRldGVjdGlvbiBmdW5jdGlvbiAtIHRyeSBib3Ro IG9yZGVycyAqLworCWpvaW5fb3BwID0gZmluZF9qb2luX21jdl9vcHBvcnR1bml0eShyb290LCBy ZWwxLCByZWwyLCBjbGF1c2VzKTsKKwlpZiAoam9pbl9vcHApCisJCXJldHVybiBqb2luX29wcDsK KworCXJldHVybiBmaW5kX2pvaW5fbWN2X29wcG9ydHVuaXR5KHJvb3QsIHJlbDIsIHJlbDEsIGNs YXVzZXMpOworfQorCisvKgorICogcGdfam9pbl9tY3ZfbGlzdF9pdGVtcworICoJCVJldHVybnMg YSBzZXQgb2Ygcm93cyB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGpvaW4gTUNWIGl0ZW1zLgorICoK KyAqIEZvciB0aGUgbGVhbiBzdHJ1Y3R1cmUsIHdlIG9ubHkgcmV0dXJuIGZpbHRlciBjb2x1bW4g dmFsdWVzIChubyBqb2luIHZhbHVlcykuCisgKiBSZXR1cm5zIHR1cGxlcyB3aXRoOgorICogLSBp bmRleCAoaW50KQorICogLSB2YWx1ZXMgKHRleHRbXSkgLSBmaWx0ZXIgY29sdW1uIHZhbHVlcyBh cyB0ZXh0IGFycmF5CisgKiAtIG51bGxzIChib29sW10pIC0gTlVMTCBmbGFncyBmb3IgZmlsdGVy IGNvbHVtbnMKKyAqIC0gZnJlcXVlbmN5IChmbG9hdDgpCisgKi8KK0RhdHVtCitwZ19qb2luX21j dl9saXN0X2l0ZW1zKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJRnVuY0NhbGxDb250ZXh0ICpmdW5j Y3R4OworCisJaWYgKFNSRl9JU19GSVJTVENBTEwoKSkKKwl7CisJCU1lbW9yeUNvbnRleHQgb2xk Y29udGV4dDsKKwkJSm9pbk1DVkxpc3QgKm1jdmxpc3Q7CisJCVR1cGxlRGVzYwl0dXBkZXNjOwor CisJCWZ1bmNjdHggPSBTUkZfRklSU1RDQUxMX0lOSVQoKTsKKwkJb2xkY29udGV4dCA9IE1lbW9y eUNvbnRleHRTd2l0Y2hUbyhmdW5jY3R4LT5tdWx0aV9jYWxsX21lbW9yeV9jdHgpOworCisJCW1j dmxpc3QgPSBzdGF0ZXh0X2pvaW5fbWN2X2Rlc2VyaWFsaXplKFBHX0dFVEFSR19CWVRFQV9QKDAp KTsKKwkJZnVuY2N0eC0+dXNlcl9mY3R4ID0gbWN2bGlzdDsKKworCQlmdW5jY3R4LT5tYXhfY2Fs bHMgPSAwOworCQlpZiAobWN2bGlzdCAhPSBOVUxMKQorCQkJZnVuY2N0eC0+bWF4X2NhbGxzID0g bWN2bGlzdC0+bml0ZW1zOworCisJCWlmIChnZXRfY2FsbF9yZXN1bHRfdHlwZShmY2luZm8sIE5V TEwsICZ0dXBkZXNjKSAhPSBUWVBFRlVOQ19DT01QT1NJVEUpCisJCQllcmVwb3J0KEVSUk9SLAor CQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJCSBlcnJt c2coImZ1bmN0aW9uIHJldHVybmluZyByZWNvcmQgY2FsbGVkIGluIGNvbnRleHQgdGhhdCBjYW5u b3QgYWNjZXB0IHR5cGUgcmVjb3JkIikpKTsKKworCQlmdW5jY3R4LT50dXBsZV9kZXNjID0gQmxl c3NUdXBsZURlc2ModHVwZGVzYyk7CisJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjb250ZXh0 KTsKKwl9CisKKwlmdW5jY3R4ID0gU1JGX1BFUkNBTExfU0VUVVAoKTsKKworCWlmIChmdW5jY3R4 LT5jYWxsX2NudHIgPCBmdW5jY3R4LT5tYXhfY2FsbHMpCisJeworCQlEYXR1bQkJdmFsdWVzWzRd OworCQlib29sCQludWxsc1s0XTsKKwkJSGVhcFR1cGxlCXR1cGxlOworCQlKb2luTUNWTGlzdCAq bWN2bGlzdDsKKwkJSm9pbk1DVkl0ZW0gKml0ZW07CisJCWludAkJCWk7CisJCWludAkJCWRpbXNb MV07CisJCWludAkJCWxic1sxXTsKKwkJRGF0dW0JICAgKnRleHRfdmFsdWVzOworCQlib29sCSAg ICp0ZXh0X251bGxzOworCQlBcnJheVR5cGUgICp0ZXh0X2FycmF5OworCQlBcnJheVR5cGUgICpu dWxsc19hcnJheTsKKworCQltY3ZsaXN0ID0gKEpvaW5NQ1ZMaXN0ICopIGZ1bmNjdHgtPnVzZXJf ZmN0eDsKKwkJaXRlbSA9ICZtY3ZsaXN0LT5pdGVtc1tmdW5jY3R4LT5jYWxsX2NudHJdOworCisJ CWlmIChtY3ZsaXN0LT5uZGltZW5zaW9ucyA8PSAwIHx8IG1jdmxpc3QtPm5kaW1lbnNpb25zID4g U1RBVFNfTUFYX0RJTUVOU0lPTlMpCisJCQllbG9nKEVSUk9SLCAicGdfam9pbl9tY3ZfbGlzdF9p dGVtczogY29ycnVwdGVkIG1jdmxpc3QtPm5kaW1lbnNpb25zPSVkIChtYWdpYz0ldSwgbml0ZW1z PSV1KSIsCisJCQkJIG1jdmxpc3QtPm5kaW1lbnNpb25zLCBtY3ZsaXN0LT5tYWdpYywgbWN2bGlz dC0+bml0ZW1zKTsKKworCQl2YWx1ZXNbMF0gPSBJbnQzMkdldERhdHVtKGZ1bmNjdHgtPmNhbGxf Y250cik7CisJCW51bGxzWzBdID0gZmFsc2U7CisKKwkJLyogdmFsdWVzW10gLSBjb252ZXJ0IGZp bHRlciBEYXR1bXMgdG8gdGV4dCBhcnJheSAqLworCQl0ZXh0X3ZhbHVlcyA9IChEYXR1bSAqKSBw YWxsb2MobWN2bGlzdC0+bmRpbWVuc2lvbnMgKiBzaXplb2YoRGF0dW0pKTsKKwkJdGV4dF9udWxs cyA9IChib29sICopIHBhbGxvYyhtY3ZsaXN0LT5uZGltZW5zaW9ucyAqIHNpemVvZihib29sKSk7 CisKKwkJZm9yIChpID0gMDsgaSA8IG1jdmxpc3QtPm5kaW1lbnNpb25zOyBpKyspCisJCXsKKwkJ CWlmIChpdGVtLT5pc251bGxbaV0pCisJCQl7CisJCQkJdGV4dF92YWx1ZXNbaV0gPSAoRGF0dW0p IDA7CisJCQkJdGV4dF9udWxsc1tpXSA9IHRydWU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJ T2lkCQkJb3V0ZnVuYzsKKwkJCQlib29sCQlpc3ZhcmxlbmE7CisKKwkJCQlnZXRUeXBlT3V0cHV0 SW5mbyhtY3ZsaXN0LT5maWx0ZXJfdHlwZXNbaV0sICZvdXRmdW5jLCAmaXN2YXJsZW5hKTsKKwkJ CQl0ZXh0X3ZhbHVlc1tpXSA9IFBvaW50ZXJHZXREYXR1bShjc3RyaW5nX3RvX3RleHQoCisJCQkJ CQkJCQkJCQkJCQkJIE9pZE91dHB1dEZ1bmN0aW9uQ2FsbChvdXRmdW5jLCBpdGVtLT52YWx1ZXNb aV0pKSk7CisJCQkJdGV4dF9udWxsc1tpXSA9IGZhbHNlOworCQkJfQorCQl9CisJCWRpbXNbMF0g PSBtY3ZsaXN0LT5uZGltZW5zaW9uczsKKwkJbGJzWzBdID0gMTsJCQkJLyogQXJyYXlzIGFyZSAx LWluZGV4ZWQgKi8KKworCQl0ZXh0X2FycmF5ID0gY29uc3RydWN0X21kX2FycmF5KHRleHRfdmFs dWVzLCB0ZXh0X251bGxzLCAxLCBkaW1zLCBsYnMsIFRFWFRPSUQsIC0xLCBmYWxzZSwgVFlQQUxJ R05fSU5UKTsKKwkJdmFsdWVzWzFdID0gUG9pbnRlckdldERhdHVtKHRleHRfYXJyYXkpOworCQlu dWxsc1sxXSA9IGZhbHNlOworCisJCS8qIENvbnZlcnQgYm9vbCBhcnJheSB0byBEYXR1bSBhcnJh eSAqLworCQl7CisJCQlEYXR1bQkgICAqYm9vbF9kYXR1bXMgPSAoRGF0dW0gKikgcGFsbG9jKG1j dmxpc3QtPm5kaW1lbnNpb25zICogc2l6ZW9mKERhdHVtKSk7CisKKwkJCWZvciAoaSA9IDA7IGkg PCBtY3ZsaXN0LT5uZGltZW5zaW9uczsgaSsrKQorCQkJCWJvb2xfZGF0dW1zW2ldID0gQm9vbEdl dERhdHVtKGl0ZW0tPmlzbnVsbFtpXSk7CisKKwkJCW51bGxzX2FycmF5ID0gY29uc3RydWN0X2Fy cmF5KGJvb2xfZGF0dW1zLCBtY3ZsaXN0LT5uZGltZW5zaW9ucywgQk9PTE9JRCwKKwkJCQkJCQkJ CQkgIHNpemVvZihib29sKSwgdHJ1ZSwgVFlQQUxJR05fQ0hBUik7CisJCQlwZnJlZShib29sX2Rh dHVtcyk7CisJCX0KKwkJdmFsdWVzWzJdID0gUG9pbnRlckdldERhdHVtKG51bGxzX2FycmF5KTsK KwkJbnVsbHNbMl0gPSBmYWxzZTsKKworCQkvKiBmcmVxdWVuY3kgKi8KKwkJdmFsdWVzWzNdID0g RmxvYXQ4R2V0RGF0dW0oaXRlbS0+ZnJlcXVlbmN5KTsKKwkJbnVsbHNbM10gPSBmYWxzZTsKKwor CQl0dXBsZSA9IGhlYXBfZm9ybV90dXBsZShmdW5jY3R4LT50dXBsZV9kZXNjLCB2YWx1ZXMsIG51 bGxzKTsKKwkJU1JGX1JFVFVSTl9ORVhUKGZ1bmNjdHgsIEhlYXBUdXBsZUdldERhdHVtKHR1cGxl KSk7CisJfQorCisJU1JGX1JFVFVSTl9ET05FKGZ1bmNjdHgpOworfQorCisvKgorICogcGdfam9p bl9tY3ZfbGlzdF9pbiAtIGlucHV0IHJvdXRpbmUgZm9yIHR5cGUgcGdfam9pbl9tY3ZfbGlzdC4K KyAqCisgKiBwZ19qb2luX21jdl9saXN0IHN0b3JlcyBkYXRhIGluIGJpbmFyeSBmb3JtIGFuZCBw YXJzaW5nIHRleHQgaW5wdXQKKyAqIGlzIG5vdCBuZWVkZWQsIHNvIGRpc2FsbG93IHRoaXMuCisg Ki8KK0RhdHVtCitwZ19qb2luX21jdl9saXN0X2luKFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJZXJl cG9ydChFUlJPUiwKKwkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwK KwkJCSBlcnJtc2coImNhbm5vdCBhY2NlcHQgYSB2YWx1ZSBvZiB0eXBlICVzIiwgInBnX2pvaW5f bWN2X2xpc3QiKSkpOworCisJUEdfUkVUVVJOX1ZPSUQoKTsJCQkvKiBrZWVwIGNvbXBpbGVyIHF1 aWV0ICovCit9CisKKy8qCisgKiBwZ19qb2luX21jdl9saXN0X291dCAtIG91dHB1dCByb3V0aW5l IGZvciB0eXBlIHBnX2pvaW5fbWN2X2xpc3QuCisgKgorICogSm9pbiBNQ1YgbGlzdHMgYXJlIHNl cmlhbGl6ZWQgaW50byBhIGJ5dGVhIHZhbHVlLCBzbyB3ZSBzaW1wbHkgY2FsbAorICogYnl0ZWFv dXQoKSB0byBzZXJpYWxpemUgdGhlIHZhbHVlIGludG8gdGV4dC4KKyAqLworRGF0dW0KK3BnX2pv aW5fbWN2X2xpc3Rfb3V0KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJcmV0dXJuIGJ5dGVhb3V0KGZj aW5mbyk7Cit9CisKKy8qCisgKiBwZ19qb2luX21jdl9saXN0X3JlY3YgLSBiaW5hcnkgaW5wdXQg cm91dGluZSBmb3IgdHlwZSBwZ19qb2luX21jdl9saXN0LgorICovCitEYXR1bQorcGdfam9pbl9t Y3ZfbGlzdF9yZWN2KFBHX0ZVTkNUSU9OX0FSR1MpCit7CisJZXJlcG9ydChFUlJPUiwKKwkJCShl cnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCSBlcnJtc2coImNhbm5v dCBhY2NlcHQgYSB2YWx1ZSBvZiB0eXBlICVzIiwgInBnX2pvaW5fbWN2X2xpc3QiKSkpOworCisJ UEdfUkVUVVJOX1ZPSUQoKTsJCQkvKiBrZWVwIGNvbXBpbGVyIHF1aWV0ICovCit9CisKKy8qCisg KiBwZ19qb2luX21jdl9saXN0X3NlbmQgLSBiaW5hcnkgb3V0cHV0IHJvdXRpbmUgZm9yIHR5cGUg cGdfam9pbl9tY3ZfbGlzdC4KKyAqLworRGF0dW0KK3BnX2pvaW5fbWN2X2xpc3Rfc2VuZChQR19G VU5DVElPTl9BUkdTKQoreworCXJldHVybiBieXRlYXNlbmQoZmNpbmZvKTsKK30KZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3MvbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC9zdGF0 aXN0aWNzL21lc29uLmJ1aWxkCmluZGV4IDlhN2JmNTVlMzAxLi40NTBiNWVmMGM2NCAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9tZXNvbi5idWlsZAorKysgYi9zcmMvYmFja2Vu ZC9zdGF0aXN0aWNzL21lc29uLmJ1aWxkCkBAIC01LDYgKzUsNyBAQCBiYWNrZW5kX3NvdXJjZXMg Kz0gZmlsZXMoCiAgICdkZXBlbmRlbmNpZXMuYycsCiAgICdleHRlbmRlZF9zdGF0cy5jJywKICAg J2V4dGVuZGVkX3N0YXRzX2Z1bmNzLmMnLAorICAnam9pbl9tY3YuYycsCiAgICdtY3YuYycsCiAg ICdtdmRpc3RpbmN0LmMnLAogICAncmVsYXRpb25fc3RhdHMuYycsCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC90Y29wL3V0aWxpdHkuYyBiL3NyYy9iYWNrZW5kL3Rjb3AvdXRpbGl0eS5jCmluZGV4 IDM0ZGQ2ZTE4ZGY1Li5lZGQ0NDFiZDliNiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC91 dGlsaXR5LmMKKysrIGIvc3JjL2JhY2tlbmQvdGNvcC91dGlsaXR5LmMKQEAgLTE4NzgsMjggKzE4 NzgsNDQgQEAgUHJvY2Vzc1V0aWxpdHlTbG93KFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAkJCQl7CiAJ CQkJCU9pZAkJCXJlbGlkOwogCQkJCQlDcmVhdGVTdGF0c1N0bXQgKnN0bXQgPSAoQ3JlYXRlU3Rh dHNTdG10ICopIHBhcnNldHJlZTsKLQkJCQkJUmFuZ2VWYXIgICAqcmVsID0gKFJhbmdlVmFyICop IGxpbml0aWFsKHN0bXQtPnJlbGF0aW9ucyk7Ci0KLQkJCQkJaWYgKCFJc0EocmVsLCBSYW5nZVZh cikpCi0JCQkJCQllcmVwb3J0KEVSUk9SLAotCQkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRV UkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJCQkJCSBlcnJtc2coIkNSRUFURSBTVEFUSVNUSUNTIG9u bHkgc3VwcG9ydHMgcmVsYXRpb24gbmFtZXMgaW4gdGhlIEZST00gY2xhdXNlIikpKTsKKwkJCQkJ Tm9kZQkgICAqZnJvbU5vZGUgPSAoTm9kZSAqKSBsaW5pdGlhbChzdG10LT5yZWxhdGlvbnMpOwog CiAJCQkJCS8qCi0JCQkJCSAqIENSRUFURSBTVEFUSVNUSUNTIHdpbGwgaW5mbHVlbmNlIGZ1dHVy ZSBleGVjdXRpb24gcGxhbnMKLQkJCQkJICogYnV0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIGN1 cnJlbnRseSBleGVjdXRpbmcgcGxhbnMuCi0JCQkJCSAqIFNvIGl0IHNob3VsZCBiZSBlbm91Z2gg dG8gdGFrZSBTaGFyZVVwZGF0ZUV4Y2x1c2l2ZUxvY2sKLQkJCQkJICogb24gcmVsYXRpb24sIGNv bmZsaWN0aW5nIHdpdGggQU5BTFlaRSBhbmQgb3RoZXIgRERMCi0JCQkJCSAqIHRoYXQgc2V0cyBz dGF0aXN0aWNhbCBpbmZvcm1hdGlvbiwgYnV0IG5vdCB3aXRoIG5vcm1hbAotCQkJCQkgKiBxdWVy aWVzLgotCQkJCQkgKgotCQkJCQkgKiBYWFggUmFuZ2VWYXJDYWxsYmFja093bnNSZWxhdGlvbiBu b3QgbmVlZGVkIGhlcmUsIHRvCi0JCQkJCSAqIGtlZXAgdGhlIHNhbWUgYmVoYXZpb3IgYXMgYmVm b3JlLgorCQkJCQkgKiBGb3Igc2luZ2xlLXRhYmxlIHN0YXRzOiBGUk9NIGNsYXVzZSBpcyBhIHNp bXBsZQorCQkJCQkgKiBSYW5nZVZhciwgZm9yIGpvaW4gc3RhdHM6IEZST00gY2xhdXNlIGlzIGEg Sm9pbkV4cHIKIAkJCQkJICovCi0JCQkJCXJlbGlkID0gUmFuZ2VWYXJHZXRSZWxpZChyZWwsIFNo YXJlVXBkYXRlRXhjbHVzaXZlTG9jaywgZmFsc2UpOworCQkJCQlpZiAoSXNBKGZyb21Ob2RlLCBS YW5nZVZhcikpCisJCQkJCXsKKwkJCQkJCVJhbmdlVmFyICAgKnJlbCA9IChSYW5nZVZhciAqKSBm cm9tTm9kZTsKIAotCQkJCQkvKiBSdW4gcGFyc2UgYW5hbHlzaXMgLi4uICovCi0JCQkJCXN0bXQg PSB0cmFuc2Zvcm1TdGF0c1N0bXQocmVsaWQsIHN0bXQsIHF1ZXJ5U3RyaW5nKTsKKwkJCQkJCS8q CisJCQkJCQkgKiBDUkVBVEUgU1RBVElTVElDUyB3aWxsIGluZmx1ZW5jZSBmdXR1cmUgZXhlY3V0 aW9uCisJCQkJCQkgKiBwbGFucyBidXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggY3VycmVudGx5 CisJCQkJCQkgKiBleGVjdXRpbmcgcGxhbnMuIFNvIGl0IHNob3VsZCBiZSBlbm91Z2ggdG8gdGFr ZQorCQkJCQkJICogU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2NrIG9uIHJlbGF0aW9uLCBjb25mbGlj dGluZworCQkJCQkJICogd2l0aCBBTkFMWVpFIGFuZCBvdGhlciBEREwgdGhhdCBzZXRzIHN0YXRp c3RpY2FsCisJCQkJCQkgKiBpbmZvcm1hdGlvbiwgYnV0IG5vdCB3aXRoIG5vcm1hbCBxdWVyaWVz LgorCQkJCQkJICoKKwkJCQkJCSAqIFhYWCBSYW5nZVZhckNhbGxiYWNrT3duc1JlbGF0aW9uIG5v dCBuZWVkZWQgaGVyZSwKKwkJCQkJCSAqIHRvIGtlZXAgdGhlIHNhbWUgYmVoYXZpb3IgYXMgYmVm b3JlLgorCQkJCQkJICovCisJCQkJCQlyZWxpZCA9IFJhbmdlVmFyR2V0UmVsaWQocmVsLCBTaGFy ZVVwZGF0ZUV4Y2x1c2l2ZUxvY2ssIGZhbHNlKTsKKworCQkJCQkJLyogUnVuIHBhcnNlIGFuYWx5 c2lzIC4uLiAqLworCQkJCQkJc3RtdCA9IHRyYW5zZm9ybVN0YXRzU3RtdChyZWxpZCwgc3RtdCwg cXVlcnlTdHJpbmcpOworCQkJCQl9CisJCQkJCWVsc2UgaWYgKElzQShmcm9tTm9kZSwgSm9pbkV4 cHIpKQorCQkJCQl7CisJCQkJCQkvKiBKb2luIHN0YXRpc3RpY3MgcGFzc2VzIDAgYXMgcmVsaWQg Ki8KKwkJCQkJCXJlbGlkID0gSW52YWxpZE9pZDsKKworCQkJCQkJLyogUnVuIHBhcnNlIGFuYWx5 c2lzIC4uLiAqLworCQkJCQkJc3RtdCA9IHRyYW5zZm9ybVN0YXRzU3RtdChyZWxpZCwgc3RtdCwg cXVlcnlTdHJpbmcpOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCWVyZXBvcnQoRVJST1IsCisJ CQkJCQkJCShlcnJjb2RlKEVSUkNPREVfRkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkJCQkJ IGVycm1zZygiQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0cyByZWxhdGlvbiBuYW1lcyBv ciBKT0lOIGNsYXVzZXMgaW4gdGhlIEZST00gY2xhdXNlIikpKTsKIAogCQkJCQlhZGRyZXNzID0g Q3JlYXRlU3RhdGlzdGljcyhzdG10LCB0cnVlKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jYXRhbG9nL2NhdHZlcnNpb24uaCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvY2F0dmVyc2lv bi5oCmluZGV4IGZiNTc3MDI2NjY2Li42Y2Y2ZWE5OThlYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9jYXR2ZXJzaW9uLmgKKysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9jYXR2ZXJz aW9uLmgKQEAgLTU3LDYgKzU3LDYgQEAKICAqLwogCiAvKgkJCQkJCQl5eXl5bW1kZE4gKi8KLSNk ZWZpbmUgQ0FUQUxPR19WRVJTSU9OX05PCTIwMjYwMTI2MQorI2RlZmluZSBDQVRBTE9HX1ZFUlNJ T05fTk8JMjAyNjAxMjYyCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19wcm9jLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKaW5kZXggNWU1 ZTMzZjY0ZmMuLjE1NDIwNDg0YzFlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3Bn X3Byb2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTU1MzAs NiArNTUzMCwyNiBAQAogICBwcm9uYW1lID0+ICdwZ19tY3ZfbGlzdF9zZW5kJywgcHJvdm9sYXRp bGUgPT4gJ3MnLCBwcm9yZXR0eXBlID0+ICdieXRlYScsCiAgIHByb2FyZ3R5cGVzID0+ICdwZ19t Y3ZfbGlzdCcsIHByb3NyYyA9PiAncGdfbWN2X2xpc3Rfc2VuZCcgfSwKIAoreyBvaWQgPT4gJzgz MjknLCBkZXNjciA9PiAnSS9PJywKKyAgcHJvbmFtZSA9PiAncGdfam9pbl9tY3ZfbGlzdF9pbics IHByb3JldHR5cGUgPT4gJ3BnX2pvaW5fbWN2X2xpc3QnLAorICBwcm9hcmd0eXBlcyA9PiAnY3N0 cmluZycsIHByb3NyYyA9PiAncGdfam9pbl9tY3ZfbGlzdF9pbicgfSwKK3sgb2lkID0+ICc4MzMw JywgZGVzY3IgPT4gJ0kvTycsCisgIHByb25hbWUgPT4gJ3BnX2pvaW5fbWN2X2xpc3Rfb3V0Jywg cHJvcmV0dHlwZSA9PiAnY3N0cmluZycsCisgIHByb2FyZ3R5cGVzID0+ICdwZ19qb2luX21jdl9s aXN0JywgcHJvc3JjID0+ICdwZ19qb2luX21jdl9saXN0X291dCcgfSwKK3sgb2lkID0+ICc4MzMx JywgZGVzY3IgPT4gJ0kvTycsCisgIHByb25hbWUgPT4gJ3BnX2pvaW5fbWN2X2xpc3RfcmVjdics IHByb3ZvbGF0aWxlID0+ICdzJywKKyAgcHJvcmV0dHlwZSA9PiAncGdfam9pbl9tY3ZfbGlzdCcs IHByb2FyZ3R5cGVzID0+ICdpbnRlcm5hbCcsCisgIHByb3NyYyA9PiAncGdfam9pbl9tY3ZfbGlz dF9yZWN2JyB9LAoreyBvaWQgPT4gJzgzMzInLCBkZXNjciA9PiAnSS9PJywKKyAgcHJvbmFtZSA9 PiAncGdfam9pbl9tY3ZfbGlzdF9zZW5kJywgcHJvdm9sYXRpbGUgPT4gJ3MnLCBwcm9yZXR0eXBl ID0+ICdieXRlYScsCisgIHByb2FyZ3R5cGVzID0+ICdwZ19qb2luX21jdl9saXN0JywgcHJvc3Jj ID0+ICdwZ19qb2luX21jdl9saXN0X3NlbmQnIH0sCit7IG9pZCA9PiAnODMzMycsIGRlc2NyID0+ ICdpbnNwZWN0IGNyb3NzLXRhYmxlIE1DViBsaXN0JywKKyAgcHJvbmFtZSA9PiAncGdfam9pbl9t Y3ZfbGlzdF9pdGVtcycsIHByb3Jvd3MgPT4gJzEwMCcsIHByb3JldHNldCA9PiAndCcsCisgIHBy b3ZvbGF0aWxlID0+ICdzJywgcHJvcmV0dHlwZSA9PiAncmVjb3JkJywgcHJvYXJndHlwZXMgPT4g J3BnX2pvaW5fbWN2X2xpc3QnLAorICBwcm9hbGxhcmd0eXBlcyA9PiAne3BnX2pvaW5fbWN2X2xp c3QsaW50NCxfdGV4dCxfYm9vbCxmbG9hdDh9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tpLG8sbyxv LG99JywKKyAgcHJvYXJnbmFtZXMgPT4gJ3ttY3ZsaXN0LGluZGV4LHZhbHVlcyxudWxscyxmcmVx dWVuY3l9JywKKyAgcHJvc3JjID0+ICdwZ19qb2luX21jdl9saXN0X2l0ZW1zJyB9LAogeyBvaWQg PT4gJzM0MjcnLCBkZXNjciA9PiAnZGV0YWlscyBhYm91dCBNQ1YgbGlzdCBpdGVtcycsCiAgIHBy b25hbWUgPT4gJ3BnX21jdl9saXN0X2l0ZW1zJywgcHJvcm93cyA9PiAnMTAwMCcsIHByb3JldHNl dCA9PiAndCcsCiAgIHByb3ZvbGF0aWxlID0+ICdzJywgcHJvcmV0dHlwZSA9PiAncmVjb3JkJywg cHJvYXJndHlwZXMgPT4gJ3BnX21jdl9saXN0JywKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2Nh dGFsb2cvcGdfc3RhdGlzdGljX2V4dC5oIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19zdGF0aXN0 aWNfZXh0LmgKaW5kZXggNjg0Mjk1NGQ0Y2IuLjBhMDVkOTJiOGU4IDEwMDY0NAotLS0gYS9zcmMv aW5jbHVkZS9jYXRhbG9nL3BnX3N0YXRpc3RpY19leHQuaAorKysgYi9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3N0YXRpc3RpY19leHQuaApAQCAtNTcsNiArNTcsMTIgQEAgQ0FUQUxPRyhwZ19zdGF0 aXN0aWNfZXh0LDMzODEsU3RhdGlzdGljRXh0UmVsYXRpb25JZCkKIAlwZ19ub2RlX3RyZWUgc3R4 ZXhwcnM7CQkvKiBBIGxpc3Qgb2YgZXhwcmVzc2lvbiB0cmVlcyBmb3Igc3RhdHMKIAkJCQkJCQkJ ICogYXR0cmlidXRlcyB0aGF0IGFyZSBub3Qgc2ltcGxlIGNvbHVtbgogCQkJCQkJCQkgKiByZWZl cmVuY2VzLiAqLworCisJLyogRmllbGRzIGZvciBqb2luIHN0YXRpc3RpY3MgKE5VTEwgZm9yIHNp bmdsZS10YWJsZSBzdGF0cykgKi8KKwlPaWQJCQlzdHhvdGhlcnJlbCBCS0lfTE9PS1VQX09QVChw Z19jbGFzcyk7CS8qIG90aGVyIHRhYmxlIGluIGpvaW4KKwkJCQkJCQkJCQkJCQkJICogKGZvciBq b2luIHN0YXRzKSAqLworCWludDJ2ZWN0b3IJc3R4am9pbmtleXM7CS8qIGpvaW4gY29sdW1uIHBh aXJzOiBbdGFyZ2V0X2pvaW5rZXksCisJCQkJCQkJCSAqIG90aGVyX2pvaW5rZXldIChmb3Igam9p biBzdGF0cykgKi8KICNlbmRpZgogCiB9IEZvcm1EYXRhX3BnX3N0YXRpc3RpY19leHQ7CkBAIC03 Myw2ICs3OSw3IEBAIERFQ0xBUkVfVE9BU1QocGdfc3RhdGlzdGljX2V4dCwgMzQzOSwgMzQ0MCk7 CiBERUNMQVJFX1VOSVFVRV9JTkRFWF9QS0VZKHBnX3N0YXRpc3RpY19leHRfb2lkX2luZGV4LCAz MzgwLCBTdGF0aXN0aWNFeHRPaWRJbmRleElkLCBwZ19zdGF0aXN0aWNfZXh0LCBidHJlZShvaWQg b2lkX29wcykpOwogREVDTEFSRV9VTklRVUVfSU5ERVgocGdfc3RhdGlzdGljX2V4dF9uYW1lX2lu ZGV4LCAzOTk3LCBTdGF0aXN0aWNFeHROYW1lSW5kZXhJZCwgcGdfc3RhdGlzdGljX2V4dCwgYnRy ZWUoc3R4bmFtZSBuYW1lX29wcywgc3R4bmFtZXNwYWNlIG9pZF9vcHMpKTsKIERFQ0xBUkVfSU5E RVgocGdfc3RhdGlzdGljX2V4dF9yZWxpZF9pbmRleCwgMzM3OSwgU3RhdGlzdGljRXh0UmVsaWRJ bmRleElkLCBwZ19zdGF0aXN0aWNfZXh0LCBidHJlZShzdHhyZWxpZCBvaWRfb3BzKSk7CitERUNM QVJFX0lOREVYKHBnX3N0YXRpc3RpY19leHRfb3RoZXJyZWxfaW5kZXgsIDk4NzYsIFN0YXRpc3Rp Y0V4dE90aGVycmVsSW5kZXhJZCwgcGdfc3RhdGlzdGljX2V4dCwgYnRyZWUoc3R4cmVsaWQgb2lk X29wcywgc3R4b3RoZXJyZWwgb2lkX29wcykpOwogCiBNQUtFX1NZU0NBQ0hFKFNUQVRFWFRPSUQs IHBnX3N0YXRpc3RpY19leHRfb2lkX2luZGV4LCA0KTsKIE1BS0VfU1lTQ0FDSEUoU1RBVEVYVE5B TUVOU1AsIHBnX3N0YXRpc3RpY19leHRfbmFtZV9pbmRleCwgNCk7CkBAIC04NSw2ICs5Miw3IEBA IERFQ0xBUkVfQVJSQVlfRk9SRUlHTl9LRVkoKHN0eHJlbGlkLCBzdHhrZXlzKSwgcGdfYXR0cmli dXRlLCAoYXR0cmVsaWQsIGF0dG51bSkpCiAjZGVmaW5lIFNUQVRTX0VYVF9ERVBFTkRFTkNJRVMJ CSdmJwogI2RlZmluZSBTVEFUU19FWFRfTUNWCQkJCSdtJwogI2RlZmluZSBTVEFUU19FWFRfRVhQ UkVTU0lPTlMJCSdlJworI2RlZmluZSBTVEFUU19FWFRfSk9JTl9NQ1YJCQknYycKIAogI2VuZGlm CQkJCQkJCS8qIEVYUE9TRV9UT19DTElFTlRfQ09ERSAqLwogCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jYXRhbG9nL3BnX3N0YXRpc3RpY19leHRfZGF0YS5oIGIvc3JjL2luY2x1ZGUvY2F0YWxv Zy9wZ19zdGF0aXN0aWNfZXh0X2RhdGEuaAppbmRleCA3YjdmMjU5MzQ5MS4uOGZlZjY4NTE1MzEg MTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfc3RhdGlzdGljX2V4dF9kYXRhLmgK KysrIGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19zdGF0aXN0aWNfZXh0X2RhdGEuaApAQCAtNDAs NiArNDAsNyBAQCBDQVRBTE9HKHBnX3N0YXRpc3RpY19leHRfZGF0YSwzNDI5LFN0YXRpc3RpY0V4 dERhdGFSZWxhdGlvbklkKQogCXBnX2RlcGVuZGVuY2llcyBzdHhkZGVwZW5kZW5jaWVzOwkvKiBk ZXBlbmRlbmNpZXMgKHNlcmlhbGl6ZWQpICovCiAJcGdfbWN2X2xpc3Qgc3R4ZG1jdjsJCS8qIE1D ViAoc2VyaWFsaXplZCkgKi8KIAlwZ19zdGF0aXN0aWMgc3R4ZGV4cHJbMV07CS8qIHN0YXRzIGZv ciBleHByZXNzaW9ucyAqLworCXBnX2pvaW5fbWN2X2xpc3Qgc3R4ZGpvaW5tY3Y7CS8qIGpvaW4g TUNWIChzZXJpYWxpemVkKSAqLwogCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUv Y2F0YWxvZy9wZ190eXBlLmRhdCBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfdHlwZS5kYXQKaW5k ZXggYTFhNzUzZDE3OTcuLjM1OGNkMGUzMTZlIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRh bG9nL3BnX3R5cGUuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfdHlwZS5kYXQKQEAg LTE2Niw2ICsxNjYsMTMgQEAKICAgdHlwaW5wdXQgPT4gJ3BnX21jdl9saXN0X2luJywgdHlwb3V0 cHV0ID0+ICdwZ19tY3ZfbGlzdF9vdXQnLAogICB0eXByZWNlaXZlID0+ICdwZ19tY3ZfbGlzdF9y ZWN2JywgdHlwc2VuZCA9PiAncGdfbWN2X2xpc3Rfc2VuZCcsCiAgIHR5cGFsaWduID0+ICdpJywg dHlwc3RvcmFnZSA9PiAneCcsIHR5cGNvbGxhdGlvbiA9PiAnZGVmYXVsdCcgfSwKK3sgb2lkID0+ ICc4MzI4JywgZGVzY3IgPT4gJ2pvaW4gTUNWIGxpc3QnLAorICB0eXBuYW1lID0+ICdwZ19qb2lu X21jdl9saXN0JywgdHlwbGVuID0+ICctMScsIHR5cGJ5dmFsID0+ICdmJywKKyAgdHlwY2F0ZWdv cnkgPT4gJ1onLCB0eXBpbnB1dCA9PiAncGdfam9pbl9tY3ZfbGlzdF9pbicsCisgIHR5cG91dHB1 dCA9PiAncGdfam9pbl9tY3ZfbGlzdF9vdXQnLAorICB0eXByZWNlaXZlID0+ICdwZ19qb2luX21j dl9saXN0X3JlY3YnLAorICB0eXBzZW5kID0+ICdwZ19qb2luX21jdl9saXN0X3NlbmQnLCB0eXBh bGlnbiA9PiAnaScsIHR5cHN0b3JhZ2UgPT4gJ3gnLAorICB0eXBjb2xsYXRpb24gPT4gJ2RlZmF1 bHQnIH0sCiB7IG9pZCA9PiAnMzInLCBkZXNjciA9PiAnaW50ZXJuYWwgdHlwZSBmb3IgcGFzc2lu ZyBDb2xsZWN0ZWRDb21tYW5kJywKICAgdHlwbmFtZSA9PiAncGdfZGRsX2NvbW1hbmQnLCB0eXBs ZW4gPT4gJ1NJWkVPRl9QT0lOVEVSJywgdHlwYnl2YWwgPT4gJ3QnLAogICB0eXB0eXBlID0+ICdw JywgdHlwY2F0ZWdvcnkgPT4gJ1AnLCB0eXBpbnB1dCA9PiAncGdfZGRsX2NvbW1hbmRfaW4nLApk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5h bC5oIGIvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oCmlu ZGV4IDU0YjRhMjYyNzNkLi45ODJkMWJhYmFhOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3Rh dGlzdGljcy9leHRlbmRlZF9zdGF0c19pbnRlcm5hbC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0YXRp c3RpY3MvZXh0ZW5kZWRfc3RhdHNfaW50ZXJuYWwuaApAQCAtNjgsNyArNjgsNiBAQCB0eXBlZGVm IHN0cnVjdCBTdGF0c0J1aWxkRGF0YQogCWJvb2wJICAqKm51bGxzOwogfSBTdGF0c0J1aWxkRGF0 YTsKIAotCiBleHRlcm4gTVZORGlzdGluY3QgKnN0YXRleHRfbmRpc3RpbmN0X2J1aWxkKGRvdWJs ZSB0b3RhbHJvd3MsIFN0YXRzQnVpbGREYXRhICpkYXRhKTsKIGV4dGVybiBieXRlYSAqc3RhdGV4 dF9uZGlzdGluY3Rfc2VyaWFsaXplKE1WTkRpc3RpbmN0ICpuZGlzdGluY3QpOwogZXh0ZXJuIE1W TkRpc3RpbmN0ICpzdGF0ZXh0X25kaXN0aW5jdF9kZXNlcmlhbGl6ZShieXRlYSAqZGF0YSk7CkBA IC05MSw2ICs5MCwxOCBAQCBleHRlcm4gYnl0ZWEgKnN0YXRleHRfbWN2X3NlcmlhbGl6ZShNQ1ZM aXN0ICptY3ZsaXN0LCBWYWNBdHRyU3RhdHMgKipzdGF0cyk7CiBleHRlcm4gTUNWTGlzdCAqc3Rh dGV4dF9tY3ZfZGVzZXJpYWxpemUoYnl0ZWEgKmRhdGEpOwogZXh0ZXJuIHZvaWQgc3RhdGV4dF9t Y3ZfZnJlZShNQ1ZMaXN0ICptY3ZsaXN0KTsKIAorZXh0ZXJuIEpvaW5NQ1ZMaXN0ICogc3RhdGV4 dF9qb2luX21jdl9idWlsZChPaWQgc3R4b2lkLAorCQkJCQkJCQkJCQlPaWQgcHJpbWFyeV9yZWxp ZCwKKwkJCQkJCQkJCQkJT2lkIG9ydGhlcl9yZWxpZCwKKwkJCQkJCQkJCQkJaW50MnZlY3RvciAq am9pbmtleXMsCisJCQkJCQkJCQkJCWludDJ2ZWN0b3IgKmZpbHRlcl9hdHRudW1zLAorCQkJCQkJ CQkJCQlpbnQgbnVtcm93cywKKwkJCQkJCQkJCQkJSGVhcFR1cGxlICpyb3dzLAorCQkJCQkJCQkJ CQlpbnQgbmF0dHMsCisJCQkJCQkJCQkJCVZhY0F0dHJTdGF0cyAqKnZhY2F0dHJzdGF0cyk7Citl eHRlcm4gYnl0ZWEgKnN0YXRleHRfam9pbl9tY3Zfc2VyaWFsaXplKEpvaW5NQ1ZMaXN0ICogbWN2 bGlzdCk7CitleHRlcm4gSm9pbk1DVkxpc3QgKiBzdGF0ZXh0X2pvaW5fbWN2X2Rlc2VyaWFsaXpl KGJ5dGVhICpkYXRhKTsKKwogZXh0ZXJuIE11bHRpU29ydFN1cHBvcnQgbXVsdGlfc29ydF9pbml0 KGludCBuZGltcyk7CiBleHRlcm4gdm9pZCBtdWx0aV9zb3J0X2FkZF9kaW1lbnNpb24oTXVsdGlT b3J0U3VwcG9ydCBtc3MsIGludCBzb3J0ZGltLAogCQkJCQkJCQkJIE9pZCBvcGVyLCBPaWQgY29s bGF0aW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5o IGIvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0aXN0aWNzLmgKaW5kZXggMzhhNTZmNmNjYjMu LmEwMTlmZjQxNTc4IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3Rp Y3MuaAorKysgYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaApAQCAtOTQsNiAr OTQsNjkgQEAgdHlwZWRlZiBzdHJ1Y3QgTUNWTGlzdAogCU1DVkl0ZW0JCWl0ZW1zW0ZMRVhJQkxF X0FSUkFZX01FTUJFUl07CS8qIGFycmF5IG9mIE1DViBpdGVtcyAqLwogfSBNQ1ZMaXN0OwogCisv KiBKb2luIE1DViBzdGF0aXN0aWNzICovCisjZGVmaW5lIFNUQVRTX0pPSU5fTUNWX01BR0lDCQkw eEM4MDVFN0FCCS8qIG1hcmtzIHNlcmlhbGl6ZWQgYnl0ZWEgKi8KKyNkZWZpbmUgU1RBVFNfSk9J Tl9NQ1ZfVFlQRV9CQVNJQwkxCS8qIGpvaW4gTUNWIGxpc3QgdHlwZSAqLworCisvKgorICogSm9p biBNQ1YgKG1vc3QtY29tbW9uIHZhbHVlKSBsaXN0cworICoKKyAqIFNpbWlsYXIgdG8gTUNWSXRl bSBidXQgZm9yIGpvaW4gc3RhdGlzdGljcy4KKyAqIFJlcHJlc2VudHM6IG9uZSBNQ1YgZW50cnkg ZnJvbSBmaWx0ZXIgY29sdW1ucyBvYnNlcnZlZCB0aHJvdWdoIGEgam9pbgorICogRXhhbXBsZTog Zm9yIGpvaW4gQS5mayA9IEIuaWQgY29sbGVjdGluZyBzdGF0cyBvbiBCLmNhdGVnb3J5LCBhbiBp dGVtIHN0b3JlcworICogb25lIGNhdGVnb3J5IHZhbHVlIGFuZCBpdHMgZnJlcXVlbmN5IGluIHRh YmxlIEEuCisgKiBFeGFtcGxlOiB2YWx1ZXM9WydlbGVjdHJvbmljcyddLCBmcmVxdWVuY3k9MC4y MCBtZWFucyAyMCUgb2YgQSdzIHJvd3MKKyAqIGpvaW4gdG8gQiByb3dzIHdoZXJlIGNhdGVnb3J5 PSdlbGVjdHJvbmljcycKKyAqCisgKiBOb3RlOiBKb2luIGNvbHVtbiB2YWx1ZXMgYXJlIE5PVCBz dG9yZWQgKHRoZXkncmUgaW1wbGljaXQgaW4gdGhlIGpvaW4gcGF0dGVybikuCisgKiBPbmx5IGZp bHRlciBjb2x1bW4gdmFsdWVzIGZyb20gdGhlIG9uZSBvZiB0aGUgdGFibGVzIGFyZSBzdG9yZWQu CisgKi8KK3R5cGVkZWYgc3RydWN0IEpvaW5NQ1ZJdGVtCit7CisJZG91YmxlCQlmcmVxdWVuY3k7 CQkvKiBmcmVxdWVuY3kgaW4gam9pbiByZXN1bHQgKDAuMCB0byAxLjApICovCisJYm9vbAkgICAq aXNudWxsOwkJCS8qIE5VTEwgZmxhZ3MgZm9yIGZpbHRlciB2YWx1ZXMgKi8KKwlEYXR1bQkgICAq dmFsdWVzOwkJCS8qIGZpbHRlciBjb2x1bW4gdmFsdWVzICovCit9CQkJSm9pbk1DVkl0ZW07CisK Ky8qIGpvaW4gTUNWIGxpc3QgLSBlc3NlbnRpYWxseSBhbiBhcnJheSBvZiBqb2luIE1DViBpdGVt cyAqLwordHlwZWRlZiBzdHJ1Y3QgSm9pbk1DVkxpc3QKK3sKKwl1aW50MzIJCW1hZ2ljOwkJCS8q IG1hZ2ljIGNvbnN0YW50IG1hcmtlciAqLworCXVpbnQzMgkJdHlwZTsJCQkvKiB0eXBlIG9mIGpv aW4gTUNWIChCQVNJQykgKi8KKwl1aW50MzIJCW5pdGVtczsJCQkvKiBudW1iZXIgb2YgTUNWIGl0 ZW1zICovCisJQXR0ck51bWJlcgluZGltZW5zaW9uczsJLyogbnVtYmVyIG9mIGZpbHRlciBjb2x1 bW5zIChsZW5ndGggb2YKKwkJCQkJCQkJICogc3R4a2V5cykgKi8KKworCS8qIENvbHVtbiBtZXRh ZGF0YSBmb3IgZmlsdGVyIGNvbHVtbnMgKGNhY2hlZCBmb3IgbG9va3VwIHBlcmZvcm1hbmNlKSAq LworCUF0dHJOdW1iZXIJZmlsdGVyX2F0dG51bXNbU1RBVFNfTUFYX0RJTUVOU0lPTlNdOwkvKiBh dHRyaWJ1dGUgbnVtYmVycyBvZgorCQkJCQkJCQkJCQkJCQkgKiBmaWx0ZXIgY29sdW1ucyAqLwor CU9pZAkJCWZpbHRlcl90eXBlc1tTVEFUU19NQVhfRElNRU5TSU9OU107IC8qIHR5cGVzIG9mIGZp bHRlciBjb2x1bW5zICovCisKKwkvKiBWYXJpYWJsZS1sZW5ndGggYXJyYXkgb2YgTUNWIGl0ZW1z IGZvbGxvd3MgKi8KKwlKb2luTUNWSXRlbSBpdGVtc1tGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOwor fQkJCUpvaW5NQ1ZMaXN0OworCisvKgorICogSm9pbk1DVk9wcG9ydHVuaXR5IC0gSW5mb3JtYXRp b24gYWJvdXQgYSBkZXRlY3RlZCBqb2luIE1DViBvcHBvcnR1bml0eQorICogVXNlZCBpbnRlcm5h bGx5IHRvIHRyYWNrIGEgam9pbitmaWx0ZXIgcGF0dGVybiB3aGVyZSBNQ1Ygc3RhdHMgY2FuIGhl bHAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgSm9pbk1DVk9wcG9ydHVuaXR5Cit7CisJT2lkCQkJdGFy Z2V0X3JlbDsJCS8qIHRhYmxlIE9JRCBvZiB0aGUgZXN0aW1hdGlvbiB0YXJnZXQgKi8KKwlBdHRy TnVtYmVyCXRhcmdldF9qb2lua2V5OyAvKiB0YXJnZXRfcmVsJ3Mgam9pbiBjb2x1bW4gKi8KKwlP aWQJCQlvdGhlcl9yZWw7CQkvKiB0YWJsZSBPSUQgb2YgdGhlIGZpbHRlciBzb3VyY2UgKi8KKwlB dHRyTnVtYmVyCW90aGVyX2pvaW5rZXk7CS8qIG90aGVyX3JlbCdzIGpvaW4gY29sdW1uICovCisJ TGlzdAkgICAqZmlsdGVyX2F0dG51bXM7IC8qIGxpc3Qgb2YgQXR0ck51bWJlcnMgZm9yIGZpbHRl ciBjb2x1bW5zIGluCisJCQkJCQkJCSAqIG90aGVyX3JlbCAqLworCUxpc3QJICAgKmZpbHRlcl92 YWx1ZXM7CS8qIGxpc3Qgb2YgRGF0dW0gY29uc3RhbnQgdmFsdWVzIGJlaW5nCisJCQkJCQkJCSAq IGZpbHRlcmVkICovCisJT2lkCQkJY29sbGF0aW9uOwkJLyogY29sbGF0aW9uIGZvciBjb21wYXJp c29ucyAqLworCisJLyogQWRkaXRpb25hbCBpbmZvIHRvIGF2b2lkIGR1cGxpY2F0ZSB3b3JrICov CisJTGlzdAkgICAqam9pbl9yaW5mb3M7CS8qIGxpc3Qgb2Ygam9pbiBjbGF1c2UgUmVzdHJpY3RJ bmZvcyAqLworCUxpc3QJICAgKmZpbHRlcl9yaW5mb3M7CS8qIGxpc3Qgb2YgZmlsdGVyIGNsYXVz ZSBSZXN0cmljdEluZm9zICovCit9CQkJSm9pbk1DVk9wcG9ydHVuaXR5OworCiBleHRlcm4gTVZO RGlzdGluY3QgKnN0YXRleHRfbmRpc3RpbmN0X2xvYWQoT2lkIG12b2lkLCBib29sIGluaCk7CiBl eHRlcm4gTVZEZXBlbmRlbmNpZXMgKnN0YXRleHRfZGVwZW5kZW5jaWVzX2xvYWQoT2lkIG12b2lk LCBib29sIGluaCk7CiBleHRlcm4gTUNWTGlzdCAqc3RhdGV4dF9tY3ZfbG9hZChPaWQgbXZvaWQs IGJvb2wgaW5oKTsKQEAgLTEyNyw0ICsxOTAsMjUgQEAgZXh0ZXJuIFN0YXRpc3RpY0V4dEluZm8g KmNob29zZV9iZXN0X3N0YXRpc3RpY3MoTGlzdCAqc3RhdHMsIGNoYXIgcmVxdWlyZWRraW5kLAog CQkJCQkJCQkJCQkJaW50IG5jbGF1c2VzKTsKIGV4dGVybiBIZWFwVHVwbGUgc3RhdGV4dF9leHBy ZXNzaW9uc19sb2FkKE9pZCBzdHhvaWQsIGJvb2wgaW5oLCBpbnQgaWR4KTsKIAorLyogSm9pbiBN Q1Ygc3RhdGlzdGljcyBmdW5jdGlvbnMgKi8KK2V4dGVybiBKb2luTUNWTGlzdCAqIHN0YXRleHRf am9pbl9tY3ZfbG9hZChPaWQgcmVsaWQsCisJCQkJCQkJCQkJICAgQXR0ck51bWJlciByZWxfam9p bmtleV9hdHRudW0sCisJCQkJCQkJCQkJICAgT2lkIG90aGVyX3JlbGlkLAorCQkJCQkJCQkJCSAg IEF0dHJOdW1iZXIgb3RoZXJyZWxfam9pbmtleV9hdHRudW0sCisJCQkJCQkJCQkJICAgTGlzdCAq ZmlsdGVyX2F0dG51bXMpOworZXh0ZXJuIEpvaW5NQ1ZPcHBvcnR1bml0eSAqIGZpbmRfam9pbl9t Y3Zfb3Bwb3J0dW5pdHkoUGxhbm5lckluZm8gKnJvb3QsCisJCQkJCQkJCQkJCQkJICBSZWxPcHRJ bmZvICpvdXRlcl9yZWwsCisJCQkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICppbm5lcl9yZWwsCisJ CQkJCQkJCQkJCQkJICBMaXN0ICpyZXN0cmljdGxpc3QpOworZXh0ZXJuIEpvaW5NQ1ZPcHBvcnR1 bml0eSAqIGZpbmRfam9pbl9tY3Zfb3Bwb3J0dW5pdHlfaW5fY2xhdXNlcyhQbGFubmVySW5mbyAq cm9vdCwKKwkJCQkJCQkJCQkJCQkJCQkgTGlzdCAqY2xhdXNlcyk7CitleHRlcm4gU2VsZWN0aXZp dHkgam9pbl9tY3ZfY2xhdXNlbGlzdF9zZWxlY3Rpdml0eShKb2luTUNWTGlzdCAqIG1jdmxpc3Qs CisJCQkJCQkJCQkJCQkgICBMaXN0ICpmaWx0ZXJfdmFsdWVzLAorCQkJCQkJCQkJCQkJICAgTGlz dCAqZmlsdGVyX2F0dG51bXMsCisJCQkJCQkJCQkJCQkgICBPaWQgY29sbGF0aW9uKTsKK2V4dGVy biBTZWxlY3Rpdml0eSBzdGF0ZXh0X2pvaW5fbWN2X2NsYXVzZWxpc3Rfc2VsZWN0aXZpdHkoUGxh bm5lckluZm8gKnJvb3QsCisJCQkJCQkJCQkJCQkJCSAgIExpc3QgKmNsYXVzZXMsCisJCQkJCQkJ CQkJCQkJCSAgIGludCB2YXJSZWxpZCwKKwkJCQkJCQkJCQkJCQkJICAgQml0bWFwc2V0ICoqZXN0 aW1hdGVkY2xhdXNlcyk7CisKICNlbmRpZgkJCQkJCQkvKiBTVEFUSVNUSUNTX0ggKi8KZGlmZiAt LWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvb2lkam9pbnMub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9vaWRqb2lucy5vdXQKaW5kZXggMjVhYWFlOGQwNWEuLjBmMmMwMDll OWI5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL29pZGpvaW5zLm91dApAQCAtMjQsNiArMjQs MTEgQEAgYmVnaW4KICAgICAgIGVuZCBsb29wOwogICAgICAgY21kIDo9IGNtZCB8fCAnLCB1bm5l c3QoJyB8fCBxdW90ZV9pZGVudChmay5ma2NvbHNbbmtleXNdKTsKICAgICAgIGNtZCA6PSBjbWQg fHwgJykgYXMgJyB8fCBxdW90ZV9pZGVudChmay5ma2NvbHNbbmtleXNdKTsKKyAgICAgIC0tIEZv ciBwZ19zdGF0aXN0aWNfZXh0LCBpbmNsdWRlIHN0eGtpbmQgZm9yIGpvaW4gc3RhdHMgZmlsdGVy aW5nCisgICAgICBpZiBmay5ma3RhYmxlID0gJ3BnX3N0YXRpc3RpY19leHQnOjpyZWdjbGFzcyBh bmQKKyAgICAgICAgIGZrLmZrY29scyA9IEFSUkFZWydzdHhyZWxpZCcsICdzdHhrZXlzJ10gdGhl bgorICAgICAgICBjbWQgOj0gY21kIHx8ICcsIHN0eGtpbmQnOworICAgICAgZW5kIGlmOwogICAg ICAgY21kIDo9IGNtZCB8fCAnIEZST00gJyB8fCBmay5ma3RhYmxlOjp0ZXh0IHx8ICcpIGZrIFdI RVJFICc7CiAgICAgZWxzZQogICAgICAgY21kIDo9IGNtZCB8fCAnIEZST00gJyB8fCBmay5ma3Rh YmxlOjp0ZXh0IHx8ICcgZmsgV0hFUkUgJzsKQEAgLTMzLDYgKzM4LDEzIEBAIGJlZ2luCiAgICAg ICAgIGNtZCA6PSBjbWQgfHwgcXVvdGVfaWRlbnQoZmsuZmtjb2xzW2ldKSB8fCAnICE9IDAgQU5E ICc7CiAgICAgICBlbmQgbG9vcDsKICAgICBlbmQgaWY7CisgICAgLS0gU3BlY2lhbCBjYXNlOiBG b3Igam9pbiBzdGF0aXN0aWNzLCBzdHhrZXlzIHJlZmVyZW5jZXMgYXR0cmlidXRlcyBmcm9tCisg ICAgLS0gc3R4b3RoZXJyZWwgKHRoZSByZWZlcmVuY2VkIHRhYmxlKSwgbm90IGZyb20gc3R4cmVs aWQgKHRoZSByZWZlcmVuY2luZworICAgIC0tIHRhYmxlKS4gU2tpcCB0aGUgRksgY2hlY2sgZm9y IGpvaW4gc3RhdHMgd2hlcmUgc3R4a2luZCBjb250YWlucyAnYycuCisgICAgaWYgZmsuZmt0YWJs ZSA9ICdwZ19zdGF0aXN0aWNfZXh0Jzo6cmVnY2xhc3MgYW5kCisgICAgICAgZmsuZmtjb2xzID0g QVJSQVlbJ3N0eHJlbGlkJywgJ3N0eGtleXMnXSB0aGVuCisgICAgICBjbWQgOj0gY21kIHx8ICdO T1QgKCcnYycnID0gQU5ZKHN0eGtpbmQpKSBBTkQgJzsKKyAgICBlbmQgaWY7CiAgICAgY21kIDo9 IGNtZCB8fCAnTk9UIEVYSVNUUyhTRUxFQ1QgMSBGUk9NICcgfHwgZmsucGt0YWJsZTo6dGV4dCB8 fCAnIHBrIFdIRVJFICc7CiAgICAgZm9yIGkgaW4gMSAuLiBua2V5cyBsb29wCiAgICAgICBpZiBp ID4gMSB0aGVuIGNtZCA6PSBjbWQgfHwgJyBBTkQgJzsgZW5kIGlmOwpAQCAtMTY2LDYgKzE3OCw3 IEBAIE5PVElDRTogIGNoZWNraW5nIHBnX3N0YXRpc3RpYyB7c3RhcmVsaWQsc3RhYXR0bnVtfSA9 PiBwZ19hdHRyaWJ1dGUge2F0dHJlbGlkLGF0CiBOT1RJQ0U6ICBjaGVja2luZyBwZ19zdGF0aXN0 aWNfZXh0IHtzdHhyZWxpZH0gPT4gcGdfY2xhc3Mge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBn X3N0YXRpc3RpY19leHQge3N0eG5hbWVzcGFjZX0gPT4gcGdfbmFtZXNwYWNlIHtvaWR9CiBOT1RJ Q0U6ICBjaGVja2luZyBwZ19zdGF0aXN0aWNfZXh0IHtzdHhvd25lcn0gPT4gcGdfYXV0aGlkIHtv aWR9CitOT1RJQ0U6ICBjaGVja2luZyBwZ19zdGF0aXN0aWNfZXh0IHtzdHhvdGhlcnJlbH0gPT4g cGdfY2xhc3Mge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBnX3N0YXRpc3RpY19leHQge3N0eHJl bGlkLHN0eGtleXN9ID0+IHBnX2F0dHJpYnV0ZSB7YXR0cmVsaWQsYXR0bnVtfQogTk9USUNFOiAg Y2hlY2tpbmcgcGdfc3RhdGlzdGljX2V4dF9kYXRhIHtzdHhvaWR9ID0+IHBnX3N0YXRpc3RpY19l eHQge29pZH0KIE5PVElDRTogIGNoZWNraW5nIHBnX3Jld3JpdGUge2V2X2NsYXNzfSA9PiBwZ19j bGFzcyB7b2lkfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19l eHQub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0c19leHQub3V0CmluZGV4IGIy YTA2NTc5MTM1Li5iNDJhOGEwM2Q2ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9zdGF0c19leHQub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3RhdHNf ZXh0Lm91dApAQCAtNTYsMjIgKzU2LDIyIEBAIENSRUFURSBTVEFUSVNUSUNTIHRzdCAodW5yZWNv Z25pemVkKSBPTiB4LCB5IEZST00gZXh0X3N0YXRzX3Rlc3Q7CiBFUlJPUjogIHVucmVjb2duaXpl ZCBzdGF0aXN0aWNzIGtpbmQgInVucmVjb2duaXplZCIKIC0tIHVuc3VwcG9ydGVkIHRhcmdldHMK IENSRUFURSBTVEFUSVNUSUNTIHRzdCBPTiBhIEZST00gKFZBTFVFUyAoeCkpIEFTIGZvbzsKLUVS Uk9SOiAgQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0cyByZWxhdGlvbiBuYW1lcyBpbiB0 aGUgRlJPTSBjbGF1c2UKK0VSUk9SOiAgQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0cyBy ZWxhdGlvbiBuYW1lcyBvciBKT0lOIGNsYXVzZXMgaW4gdGhlIEZST00gY2xhdXNlCiBDUkVBVEUg U1RBVElTVElDUyB0c3QgT04gYSBGUk9NIGZvbyBOQVRVUkFMIEpPSU4gYmFyOwotRVJST1I6ICBD UkVBVEUgU1RBVElTVElDUyBvbmx5IHN1cHBvcnRzIHJlbGF0aW9uIG5hbWVzIGluIHRoZSBGUk9N IGNsYXVzZQorRVJST1I6ICByZWxhdGlvbiAiZm9vIiBkb2VzIG5vdCBleGlzdAogQ1JFQVRFIFNU QVRJU1RJQ1MgdHN0IE9OIGEgRlJPTSAoU0VMRUNUICogRlJPTSBleHRfc3RhdHNfdGVzdCkgQVMg Zm9vOwotRVJST1I6ICBDUkVBVEUgU1RBVElTVElDUyBvbmx5IHN1cHBvcnRzIHJlbGF0aW9uIG5h bWVzIGluIHRoZSBGUk9NIGNsYXVzZQorRVJST1I6ICBDUkVBVEUgU1RBVElTVElDUyBvbmx5IHN1 cHBvcnRzIHJlbGF0aW9uIG5hbWVzIG9yIEpPSU4gY2xhdXNlcyBpbiB0aGUgRlJPTSBjbGF1c2UK IENSRUFURSBTVEFUSVNUSUNTIHRzdCBPTiBhIEZST00gZXh0X3N0YXRzX3Rlc3QgcyBUQUJMRVNB TVBMRSBzeXN0ZW0gKHgpOwotRVJST1I6ICBDUkVBVEUgU1RBVElTVElDUyBvbmx5IHN1cHBvcnRz IHJlbGF0aW9uIG5hbWVzIGluIHRoZSBGUk9NIGNsYXVzZQorRVJST1I6ICBDUkVBVEUgU1RBVElT VElDUyBvbmx5IHN1cHBvcnRzIHJlbGF0aW9uIG5hbWVzIG9yIEpPSU4gY2xhdXNlcyBpbiB0aGUg RlJPTSBjbGF1c2UKIENSRUFURSBTVEFUSVNUSUNTIHRzdCBPTiBhIEZST00gWE1MVEFCTEUoJ2Zv bycgUEFTU0lORyAnYmFyJyBDT0xVTU5TIGEgdGV4dCk7Ci1FUlJPUjogIENSRUFURSBTVEFUSVNU SUNTIG9ubHkgc3VwcG9ydHMgcmVsYXRpb24gbmFtZXMgaW4gdGhlIEZST00gY2xhdXNlCitFUlJP UjogIENSRUFURSBTVEFUSVNUSUNTIG9ubHkgc3VwcG9ydHMgcmVsYXRpb24gbmFtZXMgb3IgSk9J TiBjbGF1c2VzIGluIHRoZSBGUk9NIGNsYXVzZQogQ1JFQVRFIFNUQVRJU1RJQ1MgdHN0IE9OIGEg RlJPTSBKU09OX1RBQkxFKGpzb25iICcxMjMnLCAnJCcgQ09MVU1OUyAoaXRlbSBpbnQpKTsKLUVS Uk9SOiAgQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0cyByZWxhdGlvbiBuYW1lcyBpbiB0 aGUgRlJPTSBjbGF1c2UKK0VSUk9SOiAgQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0cyBy ZWxhdGlvbiBuYW1lcyBvciBKT0lOIGNsYXVzZXMgaW4gdGhlIEZST00gY2xhdXNlCiBDUkVBVEUg RlVOQ1RJT04gdGZ0ZXN0KGludCkgcmV0dXJucyB0YWJsZShhIGludCwgYiBpbnQpIGFzICQkCiBT RUxFQ1QgJDEsICQxK2kgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSw1KSBnKGkpOwogJCQgTEFOR1VB R0Ugc3FsIElNTVVUQUJMRSBTVFJJQ1Q7CiBDUkVBVEUgU1RBVElTVElDUyBhbHRfc3RhdDIgT04g YSBGUk9NIHRmdGVzdCgxKTsKLUVSUk9SOiAgQ1JFQVRFIFNUQVRJU1RJQ1Mgb25seSBzdXBwb3J0 cyByZWxhdGlvbiBuYW1lcyBpbiB0aGUgRlJPTSBjbGF1c2UKK0VSUk9SOiAgQ1JFQVRFIFNUQVRJ U1RJQ1Mgb25seSBzdXBwb3J0cyByZWxhdGlvbiBuYW1lcyBvciBKT0lOIGNsYXVzZXMgaW4gdGhl IEZST00gY2xhdXNlCiBEUk9QIEZVTkNUSU9OIHRmdGVzdDsKIC0tIGluY29ycmVjdCBleHByZXNz aW9ucwogQ1JFQVRFIFNUQVRJU1RJQ1MgdHN0IE9OICh5KSBGUk9NIGV4dF9zdGF0c190ZXN0OyAt LSBzaW5nbGUgY29sdW1uIHJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9zdGF0c19leHRfY3Jvc3NyZWwub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zdGF0c19leHRfY3Jvc3NyZWwub3V0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwLi5kNDFkZDM3ZGIzZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvc3RhdHNfZXh0X2Nyb3NzcmVsLm91dApAQCAtMCwwICsxLDI4OCBAQAorLS0gSm9p biBNQ1Ygc3RhdGlzdGljcyB0ZXN0cworLS0KKy0tIE5vdGU6IHRhYmxlcyBmb3Igd2hpY2ggd2Ug Y2hlY2sgZXN0aW1hdGVkIHJvdyBjb3VudHMgc2hvdWxkIGJlIGNyZWF0ZWQKKy0tIHdpdGggYXV0 b3ZhY3V1bV9lbmFibGVkID0gb2ZmLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdW5zdGFibGUgcmVz dWx0cworLS0gZnJvbSBhdXRvLWFuYWx5emUgaGFwcGVuaW5nIHdoZW4gd2UgZGlkbid0IGV4cGVj dCBpdC4KKy0tCistLQorLS0gVGVzdCBDUkVBVEUgU1RBVElTVElDUyBzeW50YXggZm9yIGpvaW4g TUNWIHN0YXRpc3RpY3MuCistLQorQ1JFQVRFIFRBQkxFIGtleXdvcmRzMiAoCisgICAgaWQgSU5U RUdFUiBQUklNQVJZIEtFWSwKKyAgICBrZXl3b3JkIFRFWFQgTk9UIE5VTEwsCisgICAgcGhvbmV0 aWNfY29kZSBjaGFyYWN0ZXIgdmFyeWluZyg1KQorKTsKK0NSRUFURSBUQUJMRSBtb3ZpZV9rZXl3 b3JkczIgKAorICAgIG1vdmllX2lkIElOVEVHRVIgUFJJTUFSWSBLRVksCisgICAga2V5d29yZF9p ZCBJTlRFR0VSIE5PVCBOVUxMICAtLSBObyBGT1JFSUdOIEtFWSByZWZlcmVuY2UKKyk7CistLSBJ bnNlcnQgdGlnaHRseSBjb3JyZWxhdGVkIGRhdGEgaW50byB0aGUgInJlZmVyZW5jZWQiIHRhYmxl CitJTlNFUlQgSU5UTyBrZXl3b3JkczIgKGlkLCBrZXl3b3JkLCBwaG9uZXRpY19jb2RlKQorU0VM RUNUCisgICAgaSwKKyAgICAna2V5d29yZF8nIHx8IGksCisgICAgJ3BoXycgfHwgaQorRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgNTApIGk7CistLSBJbnNlcnQgZGF0YSBpbnRvIHRoZSAicmVmZXJl bmNpbmciIHRhYmxlIHdpdGggc2tld2VkIGRpc3RyaWJ1dGlvbgorSU5TRVJUIElOVE8gbW92aWVf a2V5d29yZHMyIChtb3ZpZV9pZCwga2V5d29yZF9pZCkKK1NFTEVDVAorICAgIGksCisgICAgQ0FT RQorICAgICAgICBXSEVOIGkgJSAxMDAgPCA2MCBUSEVOIChpICUgMTApICsgMSAgICAgIC0tIDYw JSBrZXl3b3JkX2lkcyAxLTEwICg2JSBmcmVxdWVuY3kgcGVyIGtleXdvcmQpCisgICAgICAgIFdI RU4gaSAlIDEwMCA8IDkwIFRIRU4gKGkgJSAxMCkgKyAxMSAgICAgLS0gMzAlIGtleXdvcmRfaWRz IDExLTIwICgzJSBmcmVxdWVuY3kgcGVyIGtleXdvcmQpCisgICAgICAgIEVMU0UgKGkgJSAxMCkg KyAyMSAgICAgICAgICAgICAgICAgICAgICAgLS0gMTAlIGtleXdvcmRfaWRzIDIxLTMwICgxJSBm cmVxdWVuY3kgcGVyIGtleXdvcmQpCisgICAgRU5ECitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAx MDAwMCkgaTsKK0FOQUxZWkUga2V5d29yZHMyOworQU5BTFlaRSBtb3ZpZV9rZXl3b3JkczI7Cist LSBDcmVhdGUgam9pbiBNQ1Ygc3RhdGlzdGljcyBvbiBhIHNpbmdsZSBmaWx0ZXIgY29sdW1uIChr ZXl3b3JkKQorQ1JFQVRFIFNUQVRJU1RJQ1MgbW92aWVfa2V5d29yZHMyX2tleXdvcmRfc3RhdHMg KG1jdikKK09OIGsua2V5d29yZAorRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWsgSk9JTiBrZXl3b3Jk czIgayBPTiAobWsua2V5d29yZF9pZCA9IGsuaWQpOworQU5BTFlaRSBtb3ZpZV9rZXl3b3JkczI7 CistLSBTaG93IHRoZSBzdGF0cyBpbiBjYXRhbG9nCitTRUxFQ1Qgcy5zdHhuYW1lLAorICAgICAg IHMuc3R4cmVsaWQ6OnJlZ2NsYXNzLAorICAgICAgIHMuc3R4b3RoZXJyZWw6OnJlZ2NsYXNzLAor ICAgICAgIHMuc3R4am9pbmtleXMsCisgICAgICAgcy5zdHhrZXlzLAorICAgICAgIHMuc3R4a2lu ZCwKKyAgICAgICBzLnN0eHN0YXR0YXJnZXQsCisgICAgICAgcy5zdHhleHBycworRlJPTSBwZ19z dGF0aXN0aWNfZXh0IHMKK1dIRVJFIHMuc3R4bmFtZSA9ICdtb3ZpZV9rZXl3b3JkczJfa2V5d29y ZF9zdGF0cyc7CisgICAgICAgICAgICBzdHhuYW1lICAgICAgICAgICAgfCAgICBzdHhyZWxpZCAg ICAgfCBzdHhvdGhlcnJlbCB8IHN0eGpvaW5rZXlzIHwgc3R4a2V5cyB8IHN0eGtpbmQgfCBzdHhz dGF0dGFyZ2V0IHwgc3R4ZXhwcnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rLS0t LS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tCisgbW92aWVfa2V5d29yZHMyX2tleXdv cmRfc3RhdHMgfCBtb3ZpZV9rZXl3b3JkczIgfCBrZXl3b3JkczIgICB8IDIgMSAgICAgICAgIHwg MiAgICAgICB8IHtjfSAgICAgfCAgICAgICAgICAgICAgIHwgCisoMSByb3cpCisKKy0tIEZJWE1F OiB0aGlzIGlzIGluY29ycmVjdC4KKy0tIE5lZWQgdG8gaW1wbGVtZW50IHBnX2dldF9zdGF0aXN0 aWNzb2JqZGVmIGZvciBqb2luIE1DViBzdGF0aXN0aWNzCitTRUxFQ1QgcGdfZ2V0X3N0YXRpc3Rp Y3NvYmpkZWYob2lkKSBGUk9NIHBnX3N0YXRpc3RpY19leHQgV0hFUkUgc3R4bmFtZSA9ICdtb3Zp ZV9rZXl3b3JkczJfa2V5d29yZF9zdGF0cyc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgcGdfZ2V0X3N0YXRpc3RpY3NvYmpkZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQ1JFQVRFIFNUQVRJ U1RJQ1MgcHVibGljLm1vdmllX2tleXdvcmRzMl9rZXl3b3JkX3N0YXRzIE9OIGtleXdvcmRfaWQg RlJPTSBtb3ZpZV9rZXl3b3JkczIKKygxIHJvdykKKworU0VMRUNUIG0uaW5kZXgsCisgICAgICAg bS52YWx1ZXMsCisgICAgICAgbS5udWxscywKKyAgICAgICBST1VORChtLmZyZXF1ZW5jeTo6bnVt ZXJpYywgMikgQVMgZnJlcXVlbmN5CitGUk9NIHBnX3N0YXRpc3RpY19leHQgcworSk9JTiBwZ19z dGF0aXN0aWNfZXh0X2RhdGEgZCBPTiAocy5vaWQgPSBkLnN0eG9pZCkKK0NST1NTIEpPSU4gTEFU RVJBTCBwZ19qb2luX21jdl9saXN0X2l0ZW1zKGQuc3R4ZGpvaW5tY3YpIEFTIG0KK1dIRVJFIHMu c3R4bmFtZSA9ICdtb3ZpZV9rZXl3b3JkczJfa2V5d29yZF9zdGF0cycKK09SREVSIEJZIG0uaW5k ZXg7CisgaW5kZXggfCAgICB2YWx1ZXMgICAgfCBudWxscyB8IGZyZXF1ZW5jeSAKKy0tLS0tLS0r LS0tLS0tLS0tLS0tLS0rLS0tLS0tLSstLS0tLS0tLS0tLQorICAgICAwIHwge2tleXdvcmRfMX0g IHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAgMSB8IHtrZXl3b3JkXzJ9ICB8IHtmfSAgIHwgICAg ICAwLjA2CisgICAgIDIgfCB7a2V5d29yZF8zfSAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICAz IHwge2tleXdvcmRfNH0gIHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAgNCB8IHtrZXl3b3JkXzV9 ICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDUgfCB7a2V5d29yZF82fSAgfCB7Zn0gICB8ICAg ICAgMC4wNgorICAgICA2IHwge2tleXdvcmRfN30gIHwge2Z9ICAgfCAgICAgIDAuMDYKKyAgICAg NyB8IHtrZXl3b3JkXzh9ICB8IHtmfSAgIHwgICAgICAwLjA2CisgICAgIDggfCB7a2V5d29yZF85 fSAgfCB7Zn0gICB8ICAgICAgMC4wNgorICAgICA5IHwge2tleXdvcmRfMTB9IHwge2Z9ICAgfCAg ICAgIDAuMDYKKyAgICAxMCB8IHtrZXl3b3JkXzExfSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAg MTEgfCB7a2V5d29yZF8xMn0gfCB7Zn0gICB8ICAgICAgMC4wMworICAgIDEyIHwge2tleXdvcmRf MTN9IHwge2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxMyB8IHtrZXl3b3JkXzE0fSB8IHtmfSAgIHwg ICAgICAwLjAzCisgICAgMTQgfCB7a2V5d29yZF8xNX0gfCB7Zn0gICB8ICAgICAgMC4wMworICAg IDE1IHwge2tleXdvcmRfMTZ9IHwge2Z9ICAgfCAgICAgIDAuMDMKKyAgICAxNiB8IHtrZXl3b3Jk XzE3fSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMTcgfCB7a2V5d29yZF8xOH0gfCB7Zn0gICB8 ICAgICAgMC4wMworICAgIDE4IHwge2tleXdvcmRfMTl9IHwge2Z9ICAgfCAgICAgIDAuMDMKKyAg ICAxOSB8IHtrZXl3b3JkXzIwfSB8IHtmfSAgIHwgICAgICAwLjAzCisgICAgMjAgfCB7a2V5d29y ZF8yMX0gfCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDIxIHwge2tleXdvcmRfMjJ9IHwge2Z9ICAg fCAgICAgIDAuMDEKKyAgICAyMiB8IHtrZXl3b3JkXzIzfSB8IHtmfSAgIHwgICAgICAwLjAxCisg ICAgMjMgfCB7a2V5d29yZF8yNH0gfCB7Zn0gICB8ICAgICAgMC4wMQorICAgIDI0IHwge2tleXdv cmRfMjV9IHwge2Z9ICAgfCAgICAgIDAuMDEKKyAgICAyNSB8IHtrZXl3b3JkXzI2fSB8IHtmfSAg IHwgICAgICAwLjAxCisgICAgMjYgfCB7a2V5d29yZF8yN30gfCB7Zn0gICB8ICAgICAgMC4wMQor ICAgIDI3IHwge2tleXdvcmRfMjh9IHwge2Z9ICAgfCAgICAgIDAuMDEKKyAgICAyOCB8IHtrZXl3 b3JkXzI5fSB8IHtmfSAgIHwgICAgICAwLjAxCisgICAgMjkgfCB7a2V5d29yZF8zMH0gfCB7Zn0g ICB8ICAgICAgMC4wMQorKDMwIHJvd3MpCisKKy0tIENyZWF0ZSBqb2luIE1DViBzdGF0aXN0aWNz IG9uIG11bHRpcGxlIGZpbHRlciBjb2x1bW5zIChrZXl3b3JkICsgcGhvbmV0aWNfY29kZSkKK0NS RUFURSBTVEFUSVNUSUNTIG1vdmllX2tleXdvcmRzMl9tdWx0aV9zdGF0cyAobWN2KQorT04gay5r ZXl3b3JkLCBrLnBob25ldGljX2NvZGUKK0ZST00gbW92aWVfa2V5d29yZHMyIG1rIEpPSU4ga2V5 d29yZHMyIGsgT04gKG1rLmtleXdvcmRfaWQgPSBrLmlkKTsKK0FOQUxZWkUgbW92aWVfa2V5d29y ZHMyOworLS0gU2hvdyB0aGUgc3RhdHMgaW4gY2F0YWxvZworU0VMRUNUIHMuc3R4bmFtZSwKKyAg ICAgICBzLnN0eHJlbGlkOjpyZWdjbGFzcywKKyAgICAgICBzLnN0eG90aGVycmVsOjpyZWdjbGFz cywKKyAgICAgICBzLnN0eGpvaW5rZXlzLAorICAgICAgIHMuc3R4a2V5cywKKyAgICAgICBzLnN0 eGtpbmQsCisgICAgICAgcy5zdHhzdGF0dGFyZ2V0LAorICAgICAgIHMuc3R4ZXhwcnMKK0ZST00g cGdfc3RhdGlzdGljX2V4dCBzCitXSEVSRSBzLnN0eG5hbWUgPSAnbW92aWVfa2V5d29yZHMyX211 bHRpX3N0YXRzJzsKKyAgICAgICAgICAgc3R4bmFtZSAgICAgICAgICAgfCAgICBzdHhyZWxpZCAg ICAgfCBzdHhvdGhlcnJlbCB8IHN0eGpvaW5rZXlzIHwgc3R4a2V5cyB8IHN0eGtpbmQgfCBzdHhz dGF0dGFyZ2V0IHwgc3R4ZXhwcnMgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0t LS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLQorIG1vdmllX2tleXdvcmRzMl9tdWx0aV9z dGF0cyB8IG1vdmllX2tleXdvcmRzMiB8IGtleXdvcmRzMiAgIHwgMiAxICAgICAgICAgfCAyIDMg ICAgIHwge2N9ICAgICB8ICAgICAgICAgICAgICAgfCAKKygxIHJvdykKKworU0VMRUNUIG0uaW5k ZXgsCisgICAgICAgbS52YWx1ZXMsCisgICAgICAgbS5udWxscywKKyAgICAgICBST1VORChtLmZy ZXF1ZW5jeTo6bnVtZXJpYywgMikgQVMgZnJlcXVlbmN5CitGUk9NIHBnX3N0YXRpc3RpY19leHQg cworSk9JTiBwZ19zdGF0aXN0aWNfZXh0X2RhdGEgZCBPTiAocy5vaWQgPSBkLnN0eG9pZCkKK0NS T1NTIEpPSU4gTEFURVJBTCBwZ19qb2luX21jdl9saXN0X2l0ZW1zKGQuc3R4ZGpvaW5tY3YpIEFT IG0KK1dIRVJFIHMuc3R4bmFtZSA9ICdtb3ZpZV9rZXl3b3JkczJfbXVsdGlfc3RhdHMnCitPUkRF UiBCWSBtLmluZGV4OworIGluZGV4IHwgICAgICAgdmFsdWVzICAgICAgIHwgbnVsbHMgfCBmcmVx dWVuY3kgCistLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0rLS0tLS0tLS0tLS0K KyAgICAgMCB8IHtrZXl3b3JkXzEscGhfMX0gICB8IHtmLGZ9IHwgICAgICAwLjA2CisgICAgIDEg fCB7a2V5d29yZF8yLHBoXzJ9ICAgfCB7ZixmfSB8ICAgICAgMC4wNgorICAgICAyIHwge2tleXdv cmRfMyxwaF8zfSAgIHwge2YsZn0gfCAgICAgIDAuMDYKKyAgICAgMyB8IHtrZXl3b3JkXzQscGhf NH0gICB8IHtmLGZ9IHwgICAgICAwLjA2CisgICAgIDQgfCB7a2V5d29yZF81LHBoXzV9ICAgfCB7 ZixmfSB8ICAgICAgMC4wNgorICAgICA1IHwge2tleXdvcmRfNixwaF82fSAgIHwge2YsZn0gfCAg ICAgIDAuMDYKKyAgICAgNiB8IHtrZXl3b3JkXzcscGhfN30gICB8IHtmLGZ9IHwgICAgICAwLjA2 CisgICAgIDcgfCB7a2V5d29yZF84LHBoXzh9ICAgfCB7ZixmfSB8ICAgICAgMC4wNgorICAgICA4 IHwge2tleXdvcmRfOSxwaF85fSAgIHwge2YsZn0gfCAgICAgIDAuMDYKKyAgICAgOSB8IHtrZXl3 b3JkXzEwLHBoXzEwfSB8IHtmLGZ9IHwgICAgICAwLjA2CisgICAgMTAgfCB7a2V5d29yZF8xMSxw aF8xMX0gfCB7ZixmfSB8ICAgICAgMC4wMworICAgIDExIHwge2tleXdvcmRfMTIscGhfMTJ9IHwg e2YsZn0gfCAgICAgIDAuMDMKKyAgICAxMiB8IHtrZXl3b3JkXzEzLHBoXzEzfSB8IHtmLGZ9IHwg ICAgICAwLjAzCisgICAgMTMgfCB7a2V5d29yZF8xNCxwaF8xNH0gfCB7ZixmfSB8ICAgICAgMC4w MworICAgIDE0IHwge2tleXdvcmRfMTUscGhfMTV9IHwge2YsZn0gfCAgICAgIDAuMDMKKyAgICAx NSB8IHtrZXl3b3JkXzE2LHBoXzE2fSB8IHtmLGZ9IHwgICAgICAwLjAzCisgICAgMTYgfCB7a2V5 d29yZF8xNyxwaF8xN30gfCB7ZixmfSB8ICAgICAgMC4wMworICAgIDE3IHwge2tleXdvcmRfMTgs cGhfMTh9IHwge2YsZn0gfCAgICAgIDAuMDMKKyAgICAxOCB8IHtrZXl3b3JkXzE5LHBoXzE5fSB8 IHtmLGZ9IHwgICAgICAwLjAzCisgICAgMTkgfCB7a2V5d29yZF8yMCxwaF8yMH0gfCB7ZixmfSB8 ICAgICAgMC4wMworICAgIDIwIHwge2tleXdvcmRfMjEscGhfMjF9IHwge2YsZn0gfCAgICAgIDAu MDEKKyAgICAyMSB8IHtrZXl3b3JkXzIyLHBoXzIyfSB8IHtmLGZ9IHwgICAgICAwLjAxCisgICAg MjIgfCB7a2V5d29yZF8yMyxwaF8yM30gfCB7ZixmfSB8ICAgICAgMC4wMQorICAgIDIzIHwge2tl eXdvcmRfMjQscGhfMjR9IHwge2YsZn0gfCAgICAgIDAuMDEKKyAgICAyNCB8IHtrZXl3b3JkXzI1 LHBoXzI1fSB8IHtmLGZ9IHwgICAgICAwLjAxCisgICAgMjUgfCB7a2V5d29yZF8yNixwaF8yNn0g fCB7ZixmfSB8ICAgICAgMC4wMQorICAgIDI2IHwge2tleXdvcmRfMjcscGhfMjd9IHwge2YsZn0g fCAgICAgIDAuMDEKKyAgICAyNyB8IHtrZXl3b3JkXzI4LHBoXzI4fSB8IHtmLGZ9IHwgICAgICAw LjAxCisgICAgMjggfCB7a2V5d29yZF8yOSxwaF8yOX0gfCB7ZixmfSB8ICAgICAgMC4wMQorICAg IDI5IHwge2tleXdvcmRfMzAscGhfMzB9IHwge2YsZn0gfCAgICAgIDAuMDEKKygzMCByb3dzKQor CistLSBWZXJpZnkgdGhlIGpvaW4gTUNWIHN0YXRpc3RpY3MgYXJlIHVzZWQgZm9yIHNpbmdsZSBl cXVhbGl0eSBwcmVkaWNhdGVzCistLSBvbiB0aGUgZmlsdGVyIGNvbHVtbiBvZiB0aGUgcmVmZXJl bmNlZCB0YWJsZQorU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VM RUNUICogRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWssIGtleXdvcmRzMiBrCisgICAgV0hFUkUgay5r ZXl3b3JkID0gJydrZXl3b3JkXzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVz dGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAgICAgNjAwIHwgICAg NjAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAg IFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBrZXl3b3JkczIgaworICAgIFdIRVJF IGsua2V5d29yZCA9ICcna2V5d29yZF8xNScnIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7 CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAgICAzMDAg fCAgICAzMDAKKygxIHJvdykKKworU0VMRUNUICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygn CisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWssIGtleXdvcmRzMiBrCisgICAg V0hFUkUgay5rZXl3b3JkID0gJydrZXl3b3JkXzI1JycgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lk CisnKTsKKyBlc3RpbWF0ZWQgfCBhY3R1YWwgCistLS0tLS0tLS0tLSstLS0tLS0tLQorICAgICAg IDEwMCB8ICAgIDEwMAorKDEgcm93KQorCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9y b3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzMiBtaywga2V5d29yZHMyIGsK KyAgICBXSEVSRSBrLnBob25ldGljX2NvZGUgPSAnJ3BoXzEnJyBBTkQgay5pZCA9IG1rLmtleXdv cmRfaWQKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisg ICAgICAgNjAwIHwgICAgNjAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1h dGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBrZXl3b3Jk czIgaworICAgIFdIRVJFIGsucGhvbmV0aWNfY29kZSA9ICcncGhfMTUnJyBBTkQgay5pZCA9IG1r LmtleXdvcmRfaWQKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0t LS0tCisgICAgICAgMzAwIHwgICAgMzAwCisoMSByb3cpCisKK1NFTEVDVCAqIEZST00gY2hlY2tf ZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBr ZXl3b3JkczIgaworICAgIFdIRVJFIGsucGhvbmV0aWNfY29kZSA9ICcncGhfMjUnJyBBTkQgay5p ZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0t Ky0tLS0tLS0tCisgICAgICAgMTAwIHwgICAgMTAwCisoMSByb3cpCisKKy0tIEVuc3VyZSB0aGUg am9pbiBNQ1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBmb3IgSU4gcHJlZGljYXRlcworLS0gb24gdGhl IGZpbHRlciBjb2x1bW4gb2YgdGhlIHJlZmVyZW5jZWQgdGFibGUKK1NFTEVDVCAqIEZST00gY2hl Y2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1r LCBrZXl3b3JkczIgaworICAgIFdIRVJFIGsua2V5d29yZCBJTiAoJydrZXl3b3JkXzEnJywgJydr ZXl3b3JkXzInJywgJydrZXl3b3JkXzMnJykKKyAgICAgIEFORCBrLmlkID0gbWsua2V5d29yZF9p ZAorJyk7CisgZXN0aW1hdGVkIHwgYWN0dWFsIAorLS0tLS0tLS0tLS0rLS0tLS0tLS0KKyAgICAg IDE4MDAgfCAgIDE4MDAKKygxIHJvdykKKworLS0gRW5zdXJlIHRoZSBqb2luIE1DViBzdGF0aXN0 aWNzIGFyZSB1c2VkIGZvciBlcXVhbGl0eSBwcmVkaWNhdGVzCistLSBvbiBtdWx0aXBsZSBmaWx0 ZXIgY29sdW1ucyBvZiB0aGUgcmVmZXJlbmNlZCB0YWJsZQorU0VMRUNUICogRlJPTSBjaGVja19l c3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWssIGtl eXdvcmRzMiBrCisgICAgV0hFUkUgay5rZXl3b3JkID0gJydrZXl3b3JkXzEnJworICAgICAgQU5E IGsucGhvbmV0aWNfY29kZSA9ICcncGhfMScnCisgICAgICBBTkQgay5pZCA9IG1rLmtleXdvcmRf aWQKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0tLS0tKy0tLS0tLS0tCisgICAg ICAgNjAwIHwgICAgNjAwCisoMSByb3cpCisKKy0tIFplcm8gam9pbiBNQ1YgbWF0Y2gsIGZhbGxz IGJhY2sgdG8gc3RhbmRhcmQgZXN0aW1hdGlvbjogMTAwMDAgKiAxIC8gNTAgPSAyMDAuCitTRUxF Q1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmll X2tleXdvcmRzMiBtaywga2V5d29yZHMyIGsKKyAgICBXSEVSRSBrLmtleXdvcmQgPSAnJ2tleXdv cmRfMScnCisgICAgICBBTkQgay5waG9uZXRpY19jb2RlID0gJydwaF8xNScnCisgICAgICBBTkQg ay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworIGVzdGltYXRlZCB8IGFjdHVhbCAKKy0tLS0tLS0t LS0tKy0tLS0tLS0tCisgICAgICAgMjAwIHwgICAgICAwCisoMSByb3cpCisKKy0tIFZlcmlmeSBz eW50YXggZXJyb3IgY2FzZXMKK0NSRUFURSBTVEFUSVNUSUNTIGJhZF9zdGF0czEgKG1jdikgT04g ay5rZXl3b3JkOworRVJST1I6ICBzeW50YXggZXJyb3IgYXQgb3IgbmVhciAiOyIKK0xJTkUgMTog Q1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0YXRzMSAobWN2KSBPTiBrLmtleXdvcmQ7CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXgorQ1JFQVRF IFNUQVRJU1RJQ1MgYmFkX3N0YXRzMiAobWN2KSBPTiBrLmtleXdvcmQgRlJPTSBtb3ZpZV9rZXl3 b3JkczIgbWssIGtleXdvcmRzMiBrOworRVJST1I6ICBtaXNzaW5nIEZST00tY2xhdXNlIGVudHJ5 IGZvciB0YWJsZSAiayIKK0xJTkUgMTogQ1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0YXRzMiAobWN2 KSBPTiBrLmtleXdvcmQgRlJPTSBtb3ZpZV9rLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXgorQ1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0YXRzMyAobWN2 KSBGUk9NIG1vdmllX2tleXdvcmRzMiBtayBKT0lOIGtleXdvcmRzMiBrIE9OIChtay5rZXl3b3Jk X2lkID0gay5pZCk7CitFUlJPUjogIHN5bnRheCBlcnJvciBhdCBvciBuZWFyICJGUk9NIgorTElO RSAxOiBDUkVBVEUgU1RBVElTVElDUyBiYWRfc3RhdHMzIChtY3YpIEZST00gbW92aWVfa2V5d29y ZHMyIG1rIEouLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBe CitDUkVBVEUgU1RBVElTVElDUyBiYWRfc3RhdHM0IChtY3YpIE9OIGtleXdvcmQgRlJPTSBtb3Zp ZV9rZXl3b3JkczIgbWsgSk9JTiBrZXl3b3JkczIgayBPTiAobWsua2V5d29yZF9pZCA9IGsuaWQp OworRVJST1I6ICBqb2luIHN0YXRpc3RpY3MgcmVxdWlyZSB0YWJsZS1xdWFsaWZpZWQgY29sdW1u IG5hbWVzCitDUkVBVEUgU1RBVElTVElDUyBiYWRfc3RhdHM1IChtY3YpIE9OIGxvd2VyKGsua2V5 d29yZCkgRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWsgSk9JTiBrZXl3b3JkczIgayBPTiAobWsua2V5 d29yZF9pZCA9IGsuaWQpOworRVJST1I6ICBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZCBp biBqb2luIHN0YXRpc3RpY3MKK0NSRUFURSBTVEFUSVNUSUNTIGJhZF9zdGF0czYgKG1jdikgT04g ay5rZXl3b3JkIEZST00gKG1vdmllX2tleXdvcmRzMiBtayBKT0lOIGtleXdvcmRzMiBrIE9OICht ay5rZXl3b3JkX2lkID0gay5pZCkpIEpPSU4ga2V5d29yZHMyIGsyIE9OIChrLmlkID0gazIuaWQp OworRVJST1I6ICBleHRlbmRlZCBqb2luIHN0YXRpc3RpY3MgY3VycmVudGx5IHN1cHBvcnQgb25s eSBzaW1wbGUgdHdvLXRhYmxlIGpvaW5zCistLSBDbGVhbnVwCitEUk9QIFRBQkxFIG1vdmllX2tl eXdvcmRzMiBDQVNDQURFOworRFJPUCBUQUJMRSBrZXl3b3JkczIgQ0FTQ0FERTsKZGlmZiAtLWdp dCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvdHlwZV9zYW5pdHkub3V0IGIvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC90eXBlX3Nhbml0eS5vdXQKaW5kZXggMWQyMWQzZWI0NDYuLmNiOTVj ZmFiYjFmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3R5cGVfc2FuaXR5 Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3R5cGVfc2FuaXR5Lm91dApAQCAt NzksNyArNzksOCBAQCBPUkRFUiBCWSB0MS5vaWQ7CiAgNDYwMCB8IHBnX2JyaW5fYmxvb21fc3Vt bWFyeQogIDQ2MDEgfCBwZ19icmluX21pbm1heF9tdWx0aV9zdW1tYXJ5CiAgNTAxNyB8IHBnX21j dl9saXN0Ci0oNiByb3dzKQorIDgzMjggfCBwZ19qb2luX21jdl9saXN0CisoNyByb3dzKQogCiAt LSBNYWtlIHN1cmUgdHlwYXJyYXkgcG9pbnRzIHRvIGEgInRydWUiIGFycmF5IHR5cGUgb2Ygb3Vy IG93biBiYXNlCiBTRUxFQ1QgdDEub2lkLCB0MS50eXBuYW1lIGFzIGJhc2V0eXBlLCB0Mi50eXBu YW1lIGFzIGFycmF5dHlwZSwKQEAgLTgxNSw3ICs4MTYsOCBAQCBTRUxFQ1Qgb2lkLCB0eXBuYW1l LCB0eXB0eXBlLCB0eXBlbGVtLCB0eXBhcnJheQogICAgICAgICAgICAgICAgICAgICBXSEVSRSBh LmF0dHR5cGlkPXQub2lkIEFORAogICAgICAgICAgICAgICAgICAgICAgICAgICBhLmF0dG51bSA+ IDAgQU5ECiAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuYXR0cmVsaWQ9J3RhYl9jb3JlX3R5 cGVzJzo6cmVnY2xhc3MpOwotIG9pZCB8IHR5cG5hbWUgfCB0eXB0eXBlIHwgdHlwZWxlbSB8IHR5 cGFycmF5IAotLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLQot KDAgcm93cykKKyBvaWQgIHwgICAgIHR5cG5hbWUgICAgICB8IHR5cHR5cGUgfCB0eXBlbGVtIHwg dHlwYXJyYXkgCistLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLSstLS0tLS0tLS0r LS0tLS0tLS0tLQorIDgzMjggfCBwZ19qb2luX21jdl9saXN0IHwgYiAgICAgICB8ICAgICAgIDAg fCAgICAgICAgMAorKDEgcm93KQogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3BhcmFs bGVsX3NjaGVkdWxlIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQppbmRleCAw MjFkNTdmNjZiYi4uZjk1ODAyYmEzY2EgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvcGFy YWxsZWxfc2NoZWR1bGUKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9wYXJhbGxlbF9zY2hlZHVsZQpA QCAtODMsNiArODMsOSBAQCB0ZXN0OiBjcmVhdGVfdGFibGVfbGlrZSBhbHRlcl9nZW5lcmljIGFs dGVyX29wZXJhdG9yIG1pc2MgYXN5bmMgZGJzaXplIG1lcmdlIG1pcwogIyBhbXV0aWxzIGRlcGVu ZHMgb24gZ2VvbWV0cnksIGNyZWF0ZV9pbmRleF9zcGdpc3QsIGhhc2hfaW5kZXgsIGJyaW4KIHRl c3Q6IHJ1bGVzIHBzcWwgcHNxbF9jcm9zc3RhYiBwc3FsX3BpcGVsaW5lIGFtdXRpbHMgc3RhdHNf ZXh0IGNvbGxhdGUubGludXgudXRmOCBjb2xsYXRlLndpbmRvd3Mud2luMTI1MgogCisjIGpvaW4g TUNWIHN0YXRpc3RpY3MgdGVzdHMKK3Rlc3Q6IHN0YXRzX2V4dF9jcm9zc3JlbAorCiAjIC0tLS0t LS0tLS0KICMgUnVuIHRoZXNlIGFsb25lIHNvIHRoZXkgZG9uJ3QgcnVuIG91dCBvZiBwYXJhbGxl bCB3b3JrZXJzCiAjIHNlbGVjdF9wYXJhbGxlbCBkZXBlbmRzIG9uIGNyZWF0ZV9taXNjCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9vaWRqb2lucy5zcWwgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9vaWRqb2lucy5zcWwKaW5kZXggOGIyMmU2ZDEwYzUuLmM1OTU1MWYxYjhjIDEwMDY0 NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9vaWRqb2lucy5zcWwKKysrIGIvc3JjL3Rlc3Qv cmVncmVzcy9zcWwvb2lkam9pbnMuc3FsCkBAIC0yNCw2ICsyNCwxMSBAQCBiZWdpbgogICAgICAg ZW5kIGxvb3A7CiAgICAgICBjbWQgOj0gY21kIHx8ICcsIHVubmVzdCgnIHx8IHF1b3RlX2lkZW50 KGZrLmZrY29sc1tua2V5c10pOwogICAgICAgY21kIDo9IGNtZCB8fCAnKSBhcyAnIHx8IHF1b3Rl X2lkZW50KGZrLmZrY29sc1tua2V5c10pOworICAgICAgLS0gRm9yIHBnX3N0YXRpc3RpY19leHQs IGluY2x1ZGUgc3R4a2luZCBmb3Igam9pbiBzdGF0cyBmaWx0ZXJpbmcKKyAgICAgIGlmIGZrLmZr dGFibGUgPSAncGdfc3RhdGlzdGljX2V4dCc6OnJlZ2NsYXNzIGFuZAorICAgICAgICAgZmsuZmtj b2xzID0gQVJSQVlbJ3N0eHJlbGlkJywgJ3N0eGtleXMnXSB0aGVuCisgICAgICAgIGNtZCA6PSBj bWQgfHwgJywgc3R4a2luZCc7CisgICAgICBlbmQgaWY7CiAgICAgICBjbWQgOj0gY21kIHx8ICcg RlJPTSAnIHx8IGZrLmZrdGFibGU6OnRleHQgfHwgJykgZmsgV0hFUkUgJzsKICAgICBlbHNlCiAg ICAgICBjbWQgOj0gY21kIHx8ICcgRlJPTSAnIHx8IGZrLmZrdGFibGU6OnRleHQgfHwgJyBmayBX SEVSRSAnOwpAQCAtMzMsNiArMzgsMTMgQEAgYmVnaW4KICAgICAgICAgY21kIDo9IGNtZCB8fCBx dW90ZV9pZGVudChmay5ma2NvbHNbaV0pIHx8ICcgIT0gMCBBTkQgJzsKICAgICAgIGVuZCBsb29w OwogICAgIGVuZCBpZjsKKyAgICAtLSBTcGVjaWFsIGNhc2U6IEZvciBqb2luIHN0YXRpc3RpY3Ms IHN0eGtleXMgcmVmZXJlbmNlcyBhdHRyaWJ1dGVzIGZyb20KKyAgICAtLSBzdHhvdGhlcnJlbCAo dGhlIHJlZmVyZW5jZWQgdGFibGUpLCBub3QgZnJvbSBzdHhyZWxpZCAodGhlIHJlZmVyZW5jaW5n CisgICAgLS0gdGFibGUpLiBTa2lwIHRoZSBGSyBjaGVjayBmb3Igam9pbiBzdGF0cyB3aGVyZSBz dHhraW5kIGNvbnRhaW5zICdjJy4KKyAgICBpZiBmay5ma3RhYmxlID0gJ3BnX3N0YXRpc3RpY19l eHQnOjpyZWdjbGFzcyBhbmQKKyAgICAgICBmay5ma2NvbHMgPSBBUlJBWVsnc3R4cmVsaWQnLCAn c3R4a2V5cyddIHRoZW4KKyAgICAgIGNtZCA6PSBjbWQgfHwgJ05PVCAoJydjJycgPSBBTlkoc3R4 a2luZCkpIEFORCAnOworICAgIGVuZCBpZjsKICAgICBjbWQgOj0gY21kIHx8ICdOT1QgRVhJU1RT KFNFTEVDVCAxIEZST00gJyB8fCBmay5wa3RhYmxlOjp0ZXh0IHx8ICcgcGsgV0hFUkUgJzsKICAg ICBmb3IgaSBpbiAxIC4uIG5rZXlzIGxvb3AKICAgICAgIGlmIGkgPiAxIHRoZW4gY21kIDo9IGNt ZCB8fCAnIEFORCAnOyBlbmQgaWY7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9z dGF0c19leHRfY3Jvc3NyZWwuc3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHNfZXh0X2Ny b3NzcmVsLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYjc3MWEz MGYzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zdGF0c19leHRf Y3Jvc3NyZWwuc3FsCkBAIC0wLDAgKzEsMTcyIEBACistLSBKb2luIE1DViBzdGF0aXN0aWNzIHRl c3RzCistLQorLS0gTm90ZTogdGFibGVzIGZvciB3aGljaCB3ZSBjaGVjayBlc3RpbWF0ZWQgcm93 IGNvdW50cyBzaG91bGQgYmUgY3JlYXRlZAorLS0gd2l0aCBhdXRvdmFjdXVtX2VuYWJsZWQgPSBv ZmYsIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB1bnN0YWJsZSByZXN1bHRzCistLSBmcm9tIGF1dG8t YW5hbHl6ZSBoYXBwZW5pbmcgd2hlbiB3ZSBkaWRuJ3QgZXhwZWN0IGl0LgorLS0KKworLS0KKy0t IFRlc3QgQ1JFQVRFIFNUQVRJU1RJQ1Mgc3ludGF4IGZvciBqb2luIE1DViBzdGF0aXN0aWNzLgor LS0KKworQ1JFQVRFIFRBQkxFIGtleXdvcmRzMiAoCisgICAgaWQgSU5URUdFUiBQUklNQVJZIEtF WSwKKyAgICBrZXl3b3JkIFRFWFQgTk9UIE5VTEwsCisgICAgcGhvbmV0aWNfY29kZSBjaGFyYWN0 ZXIgdmFyeWluZyg1KQorKTsKKworQ1JFQVRFIFRBQkxFIG1vdmllX2tleXdvcmRzMiAoCisgICAg bW92aWVfaWQgSU5URUdFUiBQUklNQVJZIEtFWSwKKyAgICBrZXl3b3JkX2lkIElOVEVHRVIgTk9U IE5VTEwgIC0tIE5vIEZPUkVJR04gS0VZIHJlZmVyZW5jZQorKTsKKworLS0gSW5zZXJ0IHRpZ2h0 bHkgY29ycmVsYXRlZCBkYXRhIGludG8gdGhlICJyZWZlcmVuY2VkIiB0YWJsZQorSU5TRVJUIElO VE8ga2V5d29yZHMyIChpZCwga2V5d29yZCwgcGhvbmV0aWNfY29kZSkKK1NFTEVDVAorICAgIGks CisgICAgJ2tleXdvcmRfJyB8fCBpLAorICAgICdwaF8nIHx8IGkKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDUwKSBpOworCistLSBJbnNlcnQgZGF0YSBpbnRvIHRoZSAicmVmZXJlbmNpbmciIHRh YmxlIHdpdGggc2tld2VkIGRpc3RyaWJ1dGlvbgorSU5TRVJUIElOVE8gbW92aWVfa2V5d29yZHMy IChtb3ZpZV9pZCwga2V5d29yZF9pZCkKK1NFTEVDVAorICAgIGksCisgICAgQ0FTRQorICAgICAg ICBXSEVOIGkgJSAxMDAgPCA2MCBUSEVOIChpICUgMTApICsgMSAgICAgIC0tIDYwJSBrZXl3b3Jk X2lkcyAxLTEwICg2JSBmcmVxdWVuY3kgcGVyIGtleXdvcmQpCisgICAgICAgIFdIRU4gaSAlIDEw MCA8IDkwIFRIRU4gKGkgJSAxMCkgKyAxMSAgICAgLS0gMzAlIGtleXdvcmRfaWRzIDExLTIwICgz JSBmcmVxdWVuY3kgcGVyIGtleXdvcmQpCisgICAgICAgIEVMU0UgKGkgJSAxMCkgKyAyMSAgICAg ICAgICAgICAgICAgICAgICAgLS0gMTAlIGtleXdvcmRfaWRzIDIxLTMwICgxJSBmcmVxdWVuY3kg cGVyIGtleXdvcmQpCisgICAgRU5ECitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDAwMCkgaTsK KworQU5BTFlaRSBrZXl3b3JkczI7CitBTkFMWVpFIG1vdmllX2tleXdvcmRzMjsKKworLS0gQ3Jl YXRlIGpvaW4gTUNWIHN0YXRpc3RpY3Mgb24gYSBzaW5nbGUgZmlsdGVyIGNvbHVtbiAoa2V5d29y ZCkKK0NSRUFURSBTVEFUSVNUSUNTIG1vdmllX2tleXdvcmRzMl9rZXl3b3JkX3N0YXRzIChtY3Yp CitPTiBrLmtleXdvcmQKK0ZST00gbW92aWVfa2V5d29yZHMyIG1rIEpPSU4ga2V5d29yZHMyIGsg T04gKG1rLmtleXdvcmRfaWQgPSBrLmlkKTsKK0FOQUxZWkUgbW92aWVfa2V5d29yZHMyOworCist LSBTaG93IHRoZSBzdGF0cyBpbiBjYXRhbG9nCitTRUxFQ1Qgcy5zdHhuYW1lLAorICAgICAgIHMu c3R4cmVsaWQ6OnJlZ2NsYXNzLAorICAgICAgIHMuc3R4b3RoZXJyZWw6OnJlZ2NsYXNzLAorICAg ICAgIHMuc3R4am9pbmtleXMsCisgICAgICAgcy5zdHhrZXlzLAorICAgICAgIHMuc3R4a2luZCwK KyAgICAgICBzLnN0eHN0YXR0YXJnZXQsCisgICAgICAgcy5zdHhleHBycworRlJPTSBwZ19zdGF0 aXN0aWNfZXh0IHMKK1dIRVJFIHMuc3R4bmFtZSA9ICdtb3ZpZV9rZXl3b3JkczJfa2V5d29yZF9z dGF0cyc7CisKKy0tIEZJWE1FOiB0aGlzIGlzIGluY29ycmVjdC4KKy0tIE5lZWQgdG8gaW1wbGVt ZW50IHBnX2dldF9zdGF0aXN0aWNzb2JqZGVmIGZvciBqb2luIE1DViBzdGF0aXN0aWNzCitTRUxF Q1QgcGdfZ2V0X3N0YXRpc3RpY3NvYmpkZWYob2lkKSBGUk9NIHBnX3N0YXRpc3RpY19leHQgV0hF UkUgc3R4bmFtZSA9ICdtb3ZpZV9rZXl3b3JkczJfa2V5d29yZF9zdGF0cyc7CisKK1NFTEVDVCBt LmluZGV4LAorICAgICAgIG0udmFsdWVzLAorICAgICAgIG0ubnVsbHMsCisgICAgICAgUk9VTkQo bS5mcmVxdWVuY3k6Om51bWVyaWMsIDIpIEFTIGZyZXF1ZW5jeQorRlJPTSBwZ19zdGF0aXN0aWNf ZXh0IHMKK0pPSU4gcGdfc3RhdGlzdGljX2V4dF9kYXRhIGQgT04gKHMub2lkID0gZC5zdHhvaWQp CitDUk9TUyBKT0lOIExBVEVSQUwgcGdfam9pbl9tY3ZfbGlzdF9pdGVtcyhkLnN0eGRqb2lubWN2 KSBBUyBtCitXSEVSRSBzLnN0eG5hbWUgPSAnbW92aWVfa2V5d29yZHMyX2tleXdvcmRfc3RhdHMn CitPUkRFUiBCWSBtLmluZGV4OworCistLSBDcmVhdGUgam9pbiBNQ1Ygc3RhdGlzdGljcyBvbiBt dWx0aXBsZSBmaWx0ZXIgY29sdW1ucyAoa2V5d29yZCArIHBob25ldGljX2NvZGUpCitDUkVBVEUg U1RBVElTVElDUyBtb3ZpZV9rZXl3b3JkczJfbXVsdGlfc3RhdHMgKG1jdikKK09OIGsua2V5d29y ZCwgay5waG9uZXRpY19jb2RlCitGUk9NIG1vdmllX2tleXdvcmRzMiBtayBKT0lOIGtleXdvcmRz MiBrIE9OIChtay5rZXl3b3JkX2lkID0gay5pZCk7CitBTkFMWVpFIG1vdmllX2tleXdvcmRzMjsK KworLS0gU2hvdyB0aGUgc3RhdHMgaW4gY2F0YWxvZworU0VMRUNUIHMuc3R4bmFtZSwKKyAgICAg ICBzLnN0eHJlbGlkOjpyZWdjbGFzcywKKyAgICAgICBzLnN0eG90aGVycmVsOjpyZWdjbGFzcywK KyAgICAgICBzLnN0eGpvaW5rZXlzLAorICAgICAgIHMuc3R4a2V5cywKKyAgICAgICBzLnN0eGtp bmQsCisgICAgICAgcy5zdHhzdGF0dGFyZ2V0LAorICAgICAgIHMuc3R4ZXhwcnMKK0ZST00gcGdf c3RhdGlzdGljX2V4dCBzCitXSEVSRSBzLnN0eG5hbWUgPSAnbW92aWVfa2V5d29yZHMyX211bHRp X3N0YXRzJzsKKworU0VMRUNUIG0uaW5kZXgsCisgICAgICAgbS52YWx1ZXMsCisgICAgICAgbS5u dWxscywKKyAgICAgICBST1VORChtLmZyZXF1ZW5jeTo6bnVtZXJpYywgMikgQVMgZnJlcXVlbmN5 CitGUk9NIHBnX3N0YXRpc3RpY19leHQgcworSk9JTiBwZ19zdGF0aXN0aWNfZXh0X2RhdGEgZCBP TiAocy5vaWQgPSBkLnN0eG9pZCkKK0NST1NTIEpPSU4gTEFURVJBTCBwZ19qb2luX21jdl9saXN0 X2l0ZW1zKGQuc3R4ZGpvaW5tY3YpIEFTIG0KK1dIRVJFIHMuc3R4bmFtZSA9ICdtb3ZpZV9rZXl3 b3JkczJfbXVsdGlfc3RhdHMnCitPUkRFUiBCWSBtLmluZGV4OworCistLSBWZXJpZnkgdGhlIGpv aW4gTUNWIHN0YXRpc3RpY3MgYXJlIHVzZWQgZm9yIHNpbmdsZSBlcXVhbGl0eSBwcmVkaWNhdGVz CistLSBvbiB0aGUgZmlsdGVyIGNvbHVtbiBvZiB0aGUgcmVmZXJlbmNlZCB0YWJsZQorU0VMRUNU ICogRlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9r ZXl3b3JkczIgbWssIGtleXdvcmRzMiBrCisgICAgV0hFUkUgay5rZXl3b3JkID0gJydrZXl3b3Jk XzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNr X2VzdGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzMiBtaywg a2V5d29yZHMyIGsKKyAgICBXSEVSRSBrLmtleXdvcmQgPSAnJ2tleXdvcmRfMTUnJyBBTkQgay5p ZCA9IG1rLmtleXdvcmRfaWQKKycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9y b3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzMiBtaywga2V5d29yZHMyIGsK KyAgICBXSEVSRSBrLmtleXdvcmQgPSAnJ2tleXdvcmRfMjUnJyBBTkQgay5pZCA9IG1rLmtleXdv cmRfaWQKKycpOworCitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgICBT RUxFQ1QgKiBGUk9NIG1vdmllX2tleXdvcmRzMiBtaywga2V5d29yZHMyIGsKKyAgICBXSEVSRSBr LnBob25ldGljX2NvZGUgPSAnJ3BoXzEnJyBBTkQgay5pZCA9IG1rLmtleXdvcmRfaWQKKycpOwor CitTRUxFQ1QgKiBGUk9NIGNoZWNrX2VzdGltYXRlZF9yb3dzKCcKKyAgICBTRUxFQ1QgKiBGUk9N IG1vdmllX2tleXdvcmRzMiBtaywga2V5d29yZHMyIGsKKyAgICBXSEVSRSBrLnBob25ldGljX2Nv ZGUgPSAnJ3BoXzE1JycgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKworU0VMRUNUICog RlJPTSBjaGVja19lc3RpbWF0ZWRfcm93cygnCisgICAgU0VMRUNUICogRlJPTSBtb3ZpZV9rZXl3 b3JkczIgbWssIGtleXdvcmRzMiBrCisgICAgV0hFUkUgay5waG9uZXRpY19jb2RlID0gJydwaF8y NScnIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisKKy0tIEVuc3VyZSB0aGUgam9pbiBN Q1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBmb3IgSU4gcHJlZGljYXRlcworLS0gb24gdGhlIGZpbHRl ciBjb2x1bW4gb2YgdGhlIHJlZmVyZW5jZWQgdGFibGUKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0 aW1hdGVkX3Jvd3MoJworICAgIFNFTEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBrZXl3 b3JkczIgaworICAgIFdIRVJFIGsua2V5d29yZCBJTiAoJydrZXl3b3JkXzEnJywgJydrZXl3b3Jk XzInJywgJydrZXl3b3JkXzMnJykKKyAgICAgIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7 CisKKy0tIEVuc3VyZSB0aGUgam9pbiBNQ1Ygc3RhdGlzdGljcyBhcmUgdXNlZCBmb3IgZXF1YWxp dHkgcHJlZGljYXRlcworLS0gb24gbXVsdGlwbGUgZmlsdGVyIGNvbHVtbnMgb2YgdGhlIHJlZmVy ZW5jZWQgdGFibGUKK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNF TEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBrZXl3b3JkczIgaworICAgIFdIRVJFIGsu a2V5d29yZCA9ICcna2V5d29yZF8xJycKKyAgICAgIEFORCBrLnBob25ldGljX2NvZGUgPSAnJ3Bo XzEnJworICAgICAgQU5EIGsuaWQgPSBtay5rZXl3b3JkX2lkCisnKTsKKworLS0gWmVybyBqb2lu IE1DViBtYXRjaCwgZmFsbHMgYmFjayB0byBzdGFuZGFyZCBlc3RpbWF0aW9uOiAxMDAwMCAqIDEg LyA1MCA9IDIwMC4KK1NFTEVDVCAqIEZST00gY2hlY2tfZXN0aW1hdGVkX3Jvd3MoJworICAgIFNF TEVDVCAqIEZST00gbW92aWVfa2V5d29yZHMyIG1rLCBrZXl3b3JkczIgaworICAgIFdIRVJFIGsu a2V5d29yZCA9ICcna2V5d29yZF8xJycKKyAgICAgIEFORCBrLnBob25ldGljX2NvZGUgPSAnJ3Bo XzE1JycKKyAgICAgIEFORCBrLmlkID0gbWsua2V5d29yZF9pZAorJyk7CisKKy0tIFZlcmlmeSBz eW50YXggZXJyb3IgY2FzZXMKK0NSRUFURSBTVEFUSVNUSUNTIGJhZF9zdGF0czEgKG1jdikgT04g ay5rZXl3b3JkOworQ1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0YXRzMiAobWN2KSBPTiBrLmtleXdv cmQgRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWssIGtleXdvcmRzMiBrOworQ1JFQVRFIFNUQVRJU1RJ Q1MgYmFkX3N0YXRzMyAobWN2KSBGUk9NIG1vdmllX2tleXdvcmRzMiBtayBKT0lOIGtleXdvcmRz MiBrIE9OIChtay5rZXl3b3JkX2lkID0gay5pZCk7CitDUkVBVEUgU1RBVElTVElDUyBiYWRfc3Rh dHM0IChtY3YpIE9OIGtleXdvcmQgRlJPTSBtb3ZpZV9rZXl3b3JkczIgbWsgSk9JTiBrZXl3b3Jk czIgayBPTiAobWsua2V5d29yZF9pZCA9IGsuaWQpOworQ1JFQVRFIFNUQVRJU1RJQ1MgYmFkX3N0 YXRzNSAobWN2KSBPTiBsb3dlcihrLmtleXdvcmQpIEZST00gbW92aWVfa2V5d29yZHMyIG1rIEpP SU4ga2V5d29yZHMyIGsgT04gKG1rLmtleXdvcmRfaWQgPSBrLmlkKTsKK0NSRUFURSBTVEFUSVNU SUNTIGJhZF9zdGF0czYgKG1jdikgT04gay5rZXl3b3JkIEZST00gKG1vdmllX2tleXdvcmRzMiBt ayBKT0lOIGtleXdvcmRzMiBrIE9OIChtay5rZXl3b3JkX2lkID0gay5pZCkpIEpPSU4ga2V5d29y ZHMyIGsyIE9OIChrLmlkID0gazIuaWQpOworCistLSBDbGVhbnVwCitEUk9QIFRBQkxFIG1vdmll X2tleXdvcmRzMiBDQVNDQURFOworRFJPUCBUQUJMRSBrZXl3b3JkczIgQ0FTQ0FERTsKLS0gCjIu NTAuMSAoQXBwbGUgR2l0LTE1NSkKCg== --0000000000002d73e706497fccf0 Content-Type: application/octet-stream; name="16b.sql" Content-Disposition: attachment; filename="16b.sql" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzey7b2 RVhQTEFJTiBBTkFMWVpFClNFTEVDVCBNSU4oYW4ubmFtZSkgQVMgY29vbF9hY3Rvcl9wc2V1ZG9u eW0sCiAgICAgICBNSU4odC50aXRsZSkgQVMgc2VyaWVzX25hbWVkX2FmdGVyX2NoYXIKRlJPTSBh a2FfbmFtZSBBUyBhbiwKICAgICBjYXN0X2luZm8gQVMgY2ksCiAgICAgY29tcGFueV9uYW1lIEFT IGNuLAogICAgIGtleXdvcmQgQVMgaywKICAgICBtb3ZpZV9jb21wYW5pZXMgQVMgbWMsCiAgICAg bW92aWVfa2V5d29yZCBBUyBtaywKICAgICBuYW1lIEFTIG4sCiAgICAgdGl0bGUgQVMgdApXSEVS RSBjbi5jb3VudHJ5X2NvZGUgPSdbdXNdJwogIEFORCBrLmtleXdvcmQgPSdjaGFyYWN0ZXItbmFt ZS1pbi10aXRsZScKICBBTkQgYW4ucGVyc29uX2lkID0gbi5pZAogIEFORCBuLmlkID0gY2kucGVy c29uX2lkCiAgQU5EIGNpLm1vdmllX2lkID0gdC5pZAogIEFORCB0LmlkID0gbWsubW92aWVfaWQK ICBBTkQgbWsua2V5d29yZF9pZCA9IGsuaWQKICBBTkQgdC5pZCA9IG1jLm1vdmllX2lkCiAgQU5E IG1jLmNvbXBhbnlfaWQgPSBjbi5pZAogIEFORCBhbi5wZXJzb25faWQgPSBjaS5wZXJzb25faWQK ICBBTkQgY2kubW92aWVfaWQgPSBtYy5tb3ZpZV9pZAogIEFORCBjaS5tb3ZpZV9pZCA9IG1rLm1v dmllX2lkCiAgQU5EIG1jLm1vdmllX2lkID0gbWsubW92aWVfaWQ7Cgo= --0000000000002d73e706497fccf0 Content-Type: text/plain; charset="US-ASCII"; name="16b_js.txt" Content-Disposition: attachment; filename="16b_js.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzmkxk4 UGFnZXIgdXNhZ2UgaXMgb2ZmLgpTRVQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAot LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBGaW5hbGl6ZSBBZ2dyZWdhdGUgIChjb3N0 PTI4MDI2NC45MS4uMjgwMjY0LjkyIHJvd3M9MSB3aWR0aD02NCkgKGFjdHVhbCB0aW1lPTI3NDEu MTY0Li4yNzYzLjU1NCByb3dzPTEuMDAgbG9vcHM9MSkKICAgQnVmZmVyczogc2hhcmVkIGhpdD00 MTc4MjY4IHJlYWQ9MTA5MzExMCwgdGVtcCByZWFkPTIyNTcyIHdyaXR0ZW49MjI2NTIKICAgLT4g IEdhdGhlciAgKGNvc3Q9MjgwMjY0LjY5Li4yODAyNjQuOTAgcm93cz0yIHdpZHRoPTY0KSAoYWN0 dWFsIHRpbWU9MjczOC4xNTIuLjI3NjMuNTUwIHJvd3M9My4wMCBsb29wcz0xKQogICAgICAgICBX b3JrZXJzIFBsYW5uZWQ6IDIKICAgICAgICAgV29ya2VycyBMYXVuY2hlZDogMgogICAgICAgICBC dWZmZXJzOiBzaGFyZWQgaGl0PTQxNzgyNjggcmVhZD0xMDkzMTEwLCB0ZW1wIHJlYWQ9MjI1NzIg d3JpdHRlbj0yMjY1MgogICAgICAgICAtPiAgUGFydGlhbCBBZ2dyZWdhdGUgIChjb3N0PTI3OTI2 NC42OS4uMjc5MjY0LjcwIHJvd3M9MSB3aWR0aD02NCkgKGFjdHVhbCB0aW1lPTI3MzYuMjE3Li4y NzM2LjI1MCByb3dzPTEuMDAgbG9vcHM9MykKICAgICAgICAgICAgICAgQnVmZmVyczogc2hhcmVk IGhpdD00MTc4MjY4IHJlYWQ9MTA5MzExMCwgdGVtcCByZWFkPTIyNTcyIHdyaXR0ZW49MjI2NTIK ICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIEhhc2ggSm9pbiAgKGNvc3Q9MTM2MzY4LjkwLi4y NzE4NTcuODEgcm93cz0xNDgxMzc1IHdpZHRoPTMzKSAoYWN0dWFsIHRpbWU9MjI0NC4yNTkuLjIz OTcuNTU1IHJvd3M9MTIzNjg2NC4wMCBsb29wcz0zKQogICAgICAgICAgICAgICAgICAgICBIYXNo IENvbmQ6IChuLmlkID0gYW4ucGVyc29uX2lkKQogICAgICAgICAgICAgICAgICAgICBCdWZmZXJz OiBzaGFyZWQgaGl0PTQxNzgyNjggcmVhZD0xMDkzMTEwLCB0ZW1wIHJlYWQ9MjI1NzIgd3JpdHRl bj0yMjY1MgogICAgICAgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AgIChjb3N0PTExNDMw MS44Mi4uMjM1OTQ0LjEyIHJvd3M9NjM1NDkxIHdpZHRoPTI1KSAoYWN0dWFsIHRpbWU9MTk4Ljg3 My4uMjA0NC45MDUgcm93cz05NDQxODUuMDAgbG9vcHM9MykKICAgICAgICAgICAgICAgICAgICAg ICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD00MTc3OTg2IHJlYWQ9MTA4MTk3NiwgdGVtcCByZWFk PTE2OTggd3JpdHRlbj0xNzA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQg TG9vcCAgKGNvc3Q9MTE0MzAxLjM4Li4xODgxMzcuMjUgcm93cz02MzU0OTEgd2lkdGg9MjEpIChh Y3R1YWwgdGltZT0xOTguNzg0Li4xMjM2LjM4MiByb3dzPTk0NDE4NS4wMCBsb29wcz0zKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKb2luIEZpbHRlcjogKGNpLm1vdmllX2lkID0g dC5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczogc2hhcmVkIGhp dD0yNTQ2NDg2IHJlYWQ9NzMyMzM0LCB0ZW1wIHJlYWQ9MTY5OCB3cml0dGVuPTE3MDQKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wICAoY29zdD0xMTQzMDAu OTQuLjEzMTc5MC4yNSByb3dzPTMwNjkzIHdpZHRoPTI5KSAoYWN0dWFsIHRpbWU9MTk4LjcxNi4u MjczLjIwNCByb3dzPTIyNzcyLjAwIGxvb3BzPTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjY4MjAyIHJlYWQ9NjE3OTEsIHRlbXAg cmVhZD0xNjk4IHdyaXR0ZW49MTcwNAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgTWVyZ2UgSm9pbiAgKGNvc3Q9MTE0MzAwLjUxLi4xMTY4MzMuNDIgcm93cz0zMDY5 MyB3aWR0aD04KSAoYWN0dWFsIHRpbWU9MTk4LjU5OS4uMjIyLjk2NyByb3dzPTIyNzcyLjAwIGxv b3BzPTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdl IENvbmQ6IChtYy5tb3ZpZV9pZCA9IG1rLm1vdmllX2lkKQogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTIzNzkyIHJlYWQ9MzI5 MzUsIHRlbXAgcmVhZD0xNjk4IHdyaXR0ZW49MTcwNAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAtPiAgU29ydCAgKGNvc3Q9ODE4MjEuNzEuLjgyODM3LjkyIHJv d3M9NDA2NDg1IHdpZHRoPTQpIChhY3R1YWwgdGltZT0xMjYuNTE0Li4xMzguMjIxIHJvd3M9Mzg0 NTk5LjAwIGxvb3BzPTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFNvcnQgS2V5OiBtYy5tb3ZpZV9pZAogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0IE1ldGhvZDogZXh0ZXJuYWwgbWVyZ2UgIERp c2s6IDQ1ODRrQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTggcmVhZD0yMTg2NCwgdGVtcCByZWFkPTE2OTggd3Jp dHRlbj0xNzA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFdvcmtlciAwOiAgU29ydCBNZXRob2Q6IGV4dGVybmFsIG1lcmdlICBEaXNrOiA0NTM2a0IK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2Vy IDE6ICBTb3J0IE1ldGhvZDogZXh0ZXJuYWwgbWVyZ2UgIERpc2s6IDQ0NjRrQgogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgUGFyYWxsZWwgSGFz aCBKb2luICAoY29zdD01MzkzLjQyLi4zODM5My44NSByb3dzPTQwNjQ4NSB3aWR0aD00KSAoYWN0 dWFsIHRpbWU9MTAuMTkyLi45NC43NzMgcm93cz0zODQ1OTkuMDAgbG9vcHM9MykKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaCBDb25k OiAobWMuY29tcGFueV9pZCA9IGNuLmlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJzOiBzaGFyZWQgcmVhZD0yMTg2NAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAg UGFyYWxsZWwgU2VxIFNjYW4gb24gbW92aWVfY29tcGFuaWVzIG1jICAoY29zdD0wLjAwLi4zMDA1 Mi44MSByb3dzPTExMjI4ODEgd2lkdGg9OCkgKGFjdHVhbCB0aW1lPTAuMTA4Li4yOC4yMzcgcm93 cz04Njk3MDkuMzMgbG9vcHM9MykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczogc2hhcmVkIHJlYWQ9MTg4MjQKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4g IFBhcmFsbGVsIEhhc2ggIChjb3N0PTQ3NjcuOTEuLjQ3NjcuOTEgcm93cz01MDA0MSB3aWR0aD00 KSAoYWN0dWFsIHRpbWU9MTAuMDA3Li4xMC4wMDcgcm93cz0yODI4MS4wMCBsb29wcz0zKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBCdWNrZXRzOiAxMzEwNzIgIEJhdGNoZXM6IDEgIE1lbW9yeSBVc2FnZTogNDQxNmtCCiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEJ1ZmZlcnM6IHNoYXJlZCByZWFkPTMwNDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIFBhcmFsbGVsIFNlcSBTY2FuIG9u IGNvbXBhbnlfbmFtZSBjbiAgKGNvc3Q9MC4wMC4uNDc2Ny45MSByb3dzPTUwMDQxIHdpZHRoPTQp IChhY3R1YWwgdGltZT0wLjEwNC4uOC4wMjYgcm93cz0yODI4MS4wMCBsb29wcz0zKQogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBGaWx0ZXI6ICgoY291bnRyeV9jb2RlKTo6dGV4dCA9ICdbdXNdJzo6dGV4dCkKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgUm93cyBSZW1vdmVkIGJ5IEZpbHRlcjogNTAwNTEKICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczog c2hhcmVkIHJlYWQ9MzA0MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgU29ydCAgKGNvc3Q9MzI0NzguNjUuLjMyNTc1LjUzIHJvd3M9Mzg3NDkgd2lkdGg9 NCkgKGFjdHVhbCB0aW1lPTcyLjA2Ny4uNzMuMzY0IHJvd3M9NTI3NDQuMDAgbG9vcHM9MykKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydCBLZXk6 IG1rLm1vdmllX2lkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIFNvcnQgTWV0aG9kOiBxdWlja3NvcnQgIE1lbW9yeTogMTUzN2tCCiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBo aXQ9MjM3ODQgcmVhZD0xMTA3MQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBXb3JrZXIgMDogIFNvcnQgTWV0aG9kOiBxdWlja3NvcnQgIE1lbW9yeTog MTUzN2tCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFdvcmtlciAxOiAgU29ydCBNZXRob2Q6IHF1aWNrc29ydCAgTWVtb3J5OiAxNTM3a0IKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBM b29wICAoY29zdD00NDQuNzQuLjI5NTI1LjYyIHJvd3M9Mzg3NDkgd2lkdGg9NCkgKGFjdHVhbCB0 aW1lPTIuNTEzLi42OS40ODcgcm93cz00MTg0MC4wMCBsb29wcz0zKQogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJzOiBzaGFyZWQg aGl0PTIzNzg0IHJlYWQ9MTEwNzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGtleXdvcmQgayAgKGNvc3Q9MC4w MC4uMjY4NS4xMSByb3dzPTEgd2lkdGg9NCkgKGFjdHVhbCB0aW1lPTAuMzAyLi4zLjU4MSByb3dz PTEuMDAgbG9vcHM9MykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgRmlsdGVyOiAoa2V5d29yZCA9ICdjaGFyYWN0ZXItbmFtZS1p bi10aXRsZSc6OnRleHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFJvd3MgUmVtb3ZlZCBieSBGaWx0ZXI6IDEzNDE2OAogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBCdWZmZXJzOiBzaGFyZWQgaGl0PTI5ODcgcmVhZD0zNwogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBv biBtb3ZpZV9rZXl3b3JkIG1rICAoY29zdD00NDQuNzQuLjI2NDUzLjAxIHJvd3M9Mzg3NDkgd2lk dGg9OCkgKGFjdHVhbCB0aW1lPTIuMjA5Li42My44MDQgcm93cz00MTg0MC4wMCBsb29wcz0zKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBSZWNoZWNrIENvbmQ6IChrLmlkID0ga2V5d29yZF9pZCkKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhcCBCbG9ja3M6 IGV4YWN0PTExNTQ3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjA3OTcgcmVhZD0xMTAzNAog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24ga2V5d29yZF9pZF9tb3ZpZV9rZXl3b3JkICAo Y29zdD0wLjAwLi40MzUuMDUgcm93cz0zODc0OSB3aWR0aD0wKSAoYWN0dWFsIHRpbWU9MS4yNjYu LjEuMjY2IHJvd3M9NDE4NDAuMDAgbG9vcHM9MykKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGtl eXdvcmRfaWQgPSBrLmlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBTZWFyY2hlczogMwogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBCdWZmZXJzOiBzaGFyZWQgaGl0PTgwIHJlYWQ9MzYKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGl0bGVfcGtleSBvbiB0aXRsZSB0 ICAoY29zdD0wLjQzLi4wLjQ5IHJvd3M9MSB3aWR0aD0yMSkgKGFjdHVhbCB0aW1lPTAuMDAyLi4w LjAwMiByb3dzPTEuMDAgbG9vcHM9NjgzMTYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IG1rLm1vdmllX2lkKQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleCBTZWFyY2hlczogNjgzMTYK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczogc2hh cmVkIGhpdD0yNDQ0MTAgcmVhZD0yODg1NgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAtPiAgSW5kZXggU2NhbiB1c2luZyBtb3ZpZV9pZF9jYXN0X2luZm8gb24gY2FzdF9pbmZvIGNp ICAoY29zdD0wLjQ0Li4xLjM2IHJvd3M9Mzggd2lkdGg9OCkgKGFjdHVhbCB0aW1lPTAuMDAzLi4w LjA0MCByb3dzPTQxLjQ2IGxvb3BzPTY4MzE2KQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBJbmRleCBDb25kOiAobW92aWVfaWQgPSBtay5tb3ZpZV9pZCkKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggU2VhcmNoZXM6IDY4MzE2CiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjI3 ODI4NCByZWFkPTY3MDU0MwogICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgTWVtb2l6ZSAg KGNvc3Q9MC40NC4uMC40NiByb3dzPTEgd2lkdGg9NCkgKGFjdHVhbCB0aW1lPTAuMDAxLi4wLjAw MSByb3dzPTEuMDAgbG9vcHM9MjgzMjU1NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQ2FjaGUgS2V5OiBjaS5wZXJzb25faWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQ2FjaGUgTW9kZTogbG9naWNhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBF c3RpbWF0ZXM6IGNhcGFjaXR5PTcxMDY0IGRpc3RpbmN0IGtleXM9NzEwNjQgbG9va3Vwcz02MzU0 OTEgaGl0IHBlcmNlbnQ9ODguODIlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhp dHM6IDcyNDM2MyAgTWlzc2VzOiAyMDAyNTggIEV2aWN0aW9uczogMTE5NTk0ICBPdmVyZmxvd3M6 IDAgIE1lbW9yeSBVc2FnZTogODE5M2tCCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MTYzMTUwMCByZWFkPTM0OTY0MgogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBXb3JrZXIgMDogIEhpdHM6IDc0NDg2OCAgTWlzc2VzOiAyMDk0NDEg IEV2aWN0aW9uczogMTI4Nzc4ICBPdmVyZmxvd3M6IDAgIE1lbW9yeSBVc2FnZTogODE5M2tCCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtlciAxOiAgSGl0czogNzQ1ODU3ICBN aXNzZXM6IDIwNzc2OCAgRXZpY3Rpb25zOiAxMjcxMDggIE92ZXJmbG93czogMCAgTWVtb3J5IFVz YWdlOiA4MTkza0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IE9u bHkgU2NhbiB1c2luZyBuYW1lX3BrZXkgb24gbmFtZSBuICAoY29zdD0wLjQzLi4wLjQ1IHJvd3M9 MSB3aWR0aD00KSAoYWN0dWFsIHRpbWU9MC4wMDMuLjAuMDAzIHJvd3M9MS4wMCBsb29wcz02MTc0 NjcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChp ZCA9IGNpLnBlcnNvbl9pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg SGVhcCBGZXRjaGVzOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElu ZGV4IFNlYXJjaGVzOiA2MTc0NjcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgQnVmZmVyczogc2hhcmVkIGhpdD0xNjMxNTAwIHJlYWQ9MzQ5NjQyCiAgICAgICAgICAgICAg ICAgICAgIC0+ICBQYXJhbGxlbCBIYXNoICAoY29zdD0xNTE3MS41OS4uMTUxNzEuNTkgcm93cz0z NzU1NTkgd2lkdGg9MjApIChhY3R1YWwgdGltZT00OC43NDkuLjQ4Ljc1MCByb3dzPTMwMDQ0Ny4z MyBsb29wcz0zKQogICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXRzOiAxMzEwNzIgIEJh dGNoZXM6IDggIE1lbW9yeSBVc2FnZTogNzI5NmtCCiAgICAgICAgICAgICAgICAgICAgICAgICAg IEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjgyIHJlYWQ9MTExMzQsIHRlbXAgd3JpdHRlbj00MTE2CiAg ICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBQYXJhbGxlbCBTZXEgU2NhbiBvbiBha2FfbmFt ZSBhbiAgKGNvc3Q9MC4wMC4uMTUxNzEuNTkgcm93cz0zNzU1NTkgd2lkdGg9MjApIChhY3R1YWwg dGltZT0wLjA5NS4uMTguODUyIHJvd3M9MzAwNDQ3LjMzIGxvb3BzPTMpCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjgyIHJlYWQ9MTExMzQKIFBs YW5uaW5nOgogICBCdWZmZXJzOiBzaGFyZWQgaGl0PTgzNyByZWFkPTE0NAogUGxhbm5pbmcgVGlt ZTogNS4zMjEgbXMKIEV4ZWN1dGlvbiBUaW1lOiAyNzY0LjMyMCBtcwooODkgcm93cykKCg== --0000000000002d73e706497fccf0 Content-Type: text/plain; charset="US-ASCII"; name="16b_baseline.txt" Content-Disposition: attachment; filename="16b_baseline.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkyzmkxs5 UGFnZXIgdXNhZ2UgaXMgb2ZmLgpTRVQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog QWdncmVnYXRlICAoY29zdD01MzUzLjcxLi41MzUzLjcyIHJvd3M9MSB3aWR0aD02NCkgKGFjdHVh bCB0aW1lPTEwNjA3LjY0Mi4uMTA2MDcuNjQ0IHJvd3M9MS4wMCBsb29wcz0xKQogICBCdWZmZXJz OiBzaGFyZWQgaGl0PTIyMjIzMTQxIHJlYWQ9MTM4MTgzNAogICAtPiAgTmVzdGVkIExvb3AgIChj b3N0PTkuMzcuLjUzMzcuODggcm93cz0zMTY1IHdpZHRoPTMzKSAoYWN0dWFsIHRpbWU9Mi41MDMu Ljk1MjUuNjczIHJvd3M9MzcxMDU5Mi4wMCBsb29wcz0xKQogICAgICAgICBKb2luIEZpbHRlcjog KGFuLnBlcnNvbl9pZCA9IG4uaWQpCiAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjIyMjMx NDEgcmVhZD0xMzgxODM0CiAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9OC45NS4uNDY2 Ny40OSByb3dzPTEzNzggd2lkdGg9MjUpIChhY3R1YWwgdGltZT0yLjQ5MC4uNjE3OS40MzYgcm93 cz0yODMyNTU1LjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9 MTE4OTc0MzkgcmVhZD0xMTA3NTAxCiAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNv c3Q9OC41Mi4uNDA0OC41MyByb3dzPTEzNzggd2lkdGg9MjEpIChhY3R1YWwgdGltZT0yLjQ4MS4u MzA2OS41MDggcm93cz0yODMyNTU1LjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgIEpv aW4gRmlsdGVyOiAoY2kubW92aWVfaWQgPSB0LmlkKQogICAgICAgICAgICAgICAgICAgICBCdWZm ZXJzOiBzaGFyZWQgaGl0PTMxNTk4ODUgcmVhZD03NTEzNjIKICAgICAgICAgICAgICAgICAgICAg LT4gIE5lc3RlZCBMb29wICAoY29zdD04LjA4Li4zOTI5LjA5IHJvd3M9NjMgd2lkdGg9MjkpIChh Y3R1YWwgdGltZT0yLjI0NS4uOTM3LjY4MyByb3dzPTY4MzE2LjAwIGxvb3BzPTEpCiAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9ODE1NjYwIHJlYWQ9MTQ2NzYy CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ny42Ni4u Mzg1MC4xNSByb3dzPTE3NyB3aWR0aD0zMykgKGFjdHVhbCB0aW1lPTIuMjI0Li41OTguODIyIHJv d3M9MTQ4NTUyLjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpv aW4gRmlsdGVyOiAobWMubW92aWVfaWQgPSB0LmlkKQogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTI5NTgzOCByZWFkPTcyMzc2CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ny4yMy4uMzgyOS43 MSByb3dzPTM0IHdpZHRoPTI1KSAoYWN0dWFsIHRpbWU9Mi4xODUuLjQ5NC41MTkgcm93cz00MTg0 MC4wMCBsb29wcz0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZm ZXJzOiBzaGFyZWQgaGl0PTEyNTQxNSByZWFkPTU0NTM4CiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCAgKGNvc3Q9Ni44MC4uMzgxMy4xNCByb3dz PTM0IHdpZHRoPTQpIChhY3R1YWwgdGltZT0yLjE3Ny4uMzQ2LjEyMiByb3dzPTQxODQwLjAwIGxv b3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZl cnM6IHNoYXJlZCBoaXQ9MjQgcmVhZD0xMjU2OQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24ga2V5d29yZCBrICAoY29zdD0wLjAwLi4y Njg1LjExIHJvd3M9MSB3aWR0aD00KSAoYWN0dWFsIHRpbWU9MC4zODIuLjcuMDIyIHJvd3M9MS4w MCBsb29wcz0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBGaWx0ZXI6IChrZXl3b3JkID0gJ2NoYXJhY3Rlci1uYW1lLWluLXRpdGxlJzo6dGV4dCkK ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93cyBS ZW1vdmVkIGJ5IEZpbHRlcjogMTM0MTY4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9MjIgcmVhZD05ODYKICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBIZWFwIFNj YW4gb24gbW92aWVfa2V5d29yZCBtayAgKGNvc3Q9Ni44MC4uMTEyNC45OCByb3dzPTMwNSB3aWR0 aD04KSAoYWN0dWFsIHRpbWU9MS43OTQuLjMzNi42MTMgcm93cz00MTg0MC4wMCBsb29wcz0xKQog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNoZWNr IENvbmQ6IChrLmlkID0ga2V5d29yZF9pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgSGVhcCBCbG9ja3M6IGV4YWN0PTExNTQ3CiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcnM6IHNoYXJlZCBo aXQ9MiByZWFkPTExNTgzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBrZXl3b3JkX2lkX21vdmllX2tleXdv cmQgIChjb3N0PTAuMDAuLjYuNzIgcm93cz0zMDUgd2lkdGg9MCkgKGFjdHVhbCB0aW1lPTAuOTY1 Li4wLjk2NSByb3dzPTQxODQwLjAwIGxvb3BzPTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChrZXl3b3JkX2lkID0g ay5pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgSW5kZXggU2VhcmNoZXM6IDEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0yIHJlYWQ9MzYKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg dGl0bGVfcGtleSBvbiB0aXRsZSB0ICAoY29zdD0wLjQzLi4wLjQ5IHJvd3M9MSB3aWR0aD0yMSkg KGFjdHVhbCB0aW1lPTAuMDAzLi4wLjAwMyByb3dzPTEuMDAgbG9vcHM9NDE4NDApCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IG1r Lm1vdmllX2lkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJ bmRleCBTZWFyY2hlczogNDE4NDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0xMjUzOTEgcmVhZD00MTk2OQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBtb3ZpZV9pZF9tb3Zp ZV9jb21wYW5pZXMgb24gbW92aWVfY29tcGFuaWVzIG1jICAoY29zdD0wLjQzLi4wLjU0IHJvd3M9 NSB3aWR0aD04KSAoYWN0dWFsIHRpbWU9MC4wMDIuLjAuMDAyIHJvd3M9My41NSBsb29wcz00MTg0 MCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKG1v dmllX2lkID0gbWsubW92aWVfaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEluZGV4IFNlYXJjaGVzOiA0MTg0MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBCdWZmZXJzOiBzaGFyZWQgaGl0PTE3MDQyMyByZWFkPTE3ODM4CiAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIGNvbXBhbnlfbmFtZV9wa2V5IG9u IGNvbXBhbnlfbmFtZSBjbiAgKGNvc3Q9MC40Mi4uMC40NSByb3dzPTEgd2lkdGg9NCkgKGFjdHVh bCB0aW1lPTAuMDAyLi4wLjAwMiByb3dzPTAuNDYgbG9vcHM9MTQ4NTUyKQogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBtYy5jb21wYW55X2lkKQogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6ICgoY291bnRyeV9jb2RlKTo6dGV4 dCA9ICdbdXNdJzo6dGV4dCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm93cyBS ZW1vdmVkIGJ5IEZpbHRlcjogMQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRl eCBTZWFyY2hlczogMTQ4NTUyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZl cnM6IHNoYXJlZCBoaXQ9NTE5ODIyIHJlYWQ9NzQzODYKICAgICAgICAgICAgICAgICAgICAgLT4g IEluZGV4IFNjYW4gdXNpbmcgbW92aWVfaWRfY2FzdF9pbmZvIG9uIGNhc3RfaW5mbyBjaSAgKGNv c3Q9MC40NC4uMS40MCByb3dzPTQwIHdpZHRoPTgpIChhY3R1YWwgdGltZT0wLjAwMy4uMC4wMjkg cm93cz00MS40NiBsb29wcz02ODMxNikKICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZXgg Q29uZDogKG1vdmllX2lkID0gbWsubW92aWVfaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAg IEluZGV4IFNlYXJjaGVzOiA2ODMxNgogICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJz OiBzaGFyZWQgaGl0PTIzNDQyMjUgcmVhZD02MDQ2MDAKICAgICAgICAgICAgICAgLT4gIEluZGV4 IE9ubHkgU2NhbiB1c2luZyBuYW1lX3BrZXkgb24gbmFtZSBuICAoY29zdD0wLjQzLi4wLjQ1IHJv d3M9MSB3aWR0aD00KSAoYWN0dWFsIHRpbWU9MC4wMDEuLjAuMDAxIHJvd3M9MS4wMCBsb29wcz0y ODMyNTU1KQogICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoaWQgPSBjaS5wZXJzb25f aWQpCiAgICAgICAgICAgICAgICAgICAgIEhlYXAgRmV0Y2hlczogMAogICAgICAgICAgICAgICAg ICAgICBJbmRleCBTZWFyY2hlczogMjgzMjU1NQogICAgICAgICAgICAgICAgICAgICBCdWZmZXJz OiBzaGFyZWQgaGl0PTg3Mzc1NTQgcmVhZD0zNTYxMzkKICAgICAgICAgLT4gIEluZGV4IFNjYW4g dXNpbmcgcGVyc29uX2lkX2FrYV9uYW1lIG9uIGFrYV9uYW1lIGFuICAoY29zdD0wLjQyLi4wLjQ2 IHJvd3M9MiB3aWR0aD0yMCkgKGFjdHVhbCB0aW1lPTAuMDAxLi4wLjAwMSByb3dzPTEuMzEgbG9v cHM9MjgzMjU1NSkKICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHBlcnNvbl9pZCA9IGNpLnBl cnNvbl9pZCkKICAgICAgICAgICAgICAgSW5kZXggU2VhcmNoZXM6IDI4MzI1NTUKICAgICAgICAg ICAgICAgQnVmZmVyczogc2hhcmVkIGhpdD0xMDMyNTcwMiByZWFkPTI3NDMzMwogUGxhbm5pbmc6 CiAgIEJ1ZmZlcnM6IHNoYXJlZCBoaXQ9NTUwIHJlYWQ9MTI1CiBQbGFubmluZyBUaW1lOiA0LjY4 NiBtcwogRXhlY3V0aW9uIFRpbWU6IDEwNjA3LjcwNyBtcwooNjIgcm93cykKCg== --0000000000002d73e706497fccf0--