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 1wOvJ1-000Hmr-2q for pgsql-hackers@arkaria.postgresql.org; Mon, 18 May 2026 10:34:40 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wOvIy-001gVz-1m for pgsql-hackers@arkaria.postgresql.org; Mon, 18 May 2026 10:34:37 +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 1wOvIx-001gVq-2g for pgsql-hackers@lists.postgresql.org; Mon, 18 May 2026 10:34:37 +0000 Received: from mail-oo1-xc30.google.com ([2607:f8b0:4864:20::c30]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wOvIv-000000009os-2ql4 for pgsql-hackers@lists.postgresql.org; Mon, 18 May 2026 10:34:35 +0000 Received: by mail-oo1-xc30.google.com with SMTP id 006d021491bc7-69d42abd04dso9794eaf.1 for ; Mon, 18 May 2026 03:34:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779100474; cv=none; d=google.com; s=arc-20240605; b=cSlxoYzG9zyWfNlg4SVTS1pSQ8E45Y1l3auPKBPbADccyMcVm/q/LOqr7TotHzzTmU wRUiv4QjSWFV+/OAgdz4MTIkq/ltGMib99yqJ2R47Qrs9k2FQENOFZVNxH55ziLknTxs /4hPw1hie9Kz1nolYjTLIHqwWKvpAQGmaIBVUYOnGgBEXif5x7JqKlnrNeBgeyTivo99 EnnTMIO3UNV7/0y7mMlxtpN8dIXKbqweHWflK47B2HpEYvawypCdYqQ25+sN5JCobjmF RLJncLrlOY+gLHLziUHw7iAFMnDmpV6kLyZb1a07SyUPm6pqZfFTNxxzZe+pk7QuhQdc S1dw== 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=KSHAWVxmgIrQeKcxefgIja/KEb5upsuc+6MBw2RrHtI=; fh=tzO4MiyvcpyzW5UFDqBew3auXPg9i88u6y7yWYhlLf4=; b=koQwF4YTDAFs/lcxC3v/MlxIeOwnaD7tXNAIHDdGNL9bBHAMMsxVzL6oRjkgeDpqVS SUUuFpKc4/puKk4MmGgqWZBoapP+p6Q2p+WeAbKZgLFNRjCjHpalICi0ZECj2kv4YN2d ihx941fJQDBNqJ2bqRzxqj839vZJ5uFvSCp4V6KpN3zeTYn9t8WWI8/VRjiBZLIUzSgD Tx4be/q0u+jGUjbkgCVTgmfv5vyAOOR0j41LMOUsk/5f2uuYHvTYFoDbA4AkgYdrm1AO 5D1aK//0Mg9qID/AL+FssV5PTqKWAGRld94/0+pNO2mhbMGPrT3phDPPX7A4s5fZbf10 7kIw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779100474; x=1779705274; 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=KSHAWVxmgIrQeKcxefgIja/KEb5upsuc+6MBw2RrHtI=; b=G+aEprINy7wEtk/D5bz5Yg8dnl0QPERDObremZWDGo8QxzPOmZfcBgxkT7qqTBY/+O LlpgQju149DyS9Q5lejC2NpgjhN3TkDOEpnzCdw9xLWu7VSUqXqJ6HDXUBPiDh5QE+3i vT4sUvjzOPeqir+GQyK+Ztnhqo2+qaA4RNl+mPXyYaczMeYo3vymRHURu+qmYoT6JT5L ZjYSoj1yCdJEflR+YZWM/nmZqmnqxaq/U8AsVsBpqTcQXKCRV2SsUmlOPJtaHHquLlp3 Qr+aOdOnRAzCcsiswAt8G+y9Rxc+FA+a4lobr1kzVJRtLSZB9LLPOa+POtkNaFLRsiSW KmDA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779100474; x=1779705274; 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=KSHAWVxmgIrQeKcxefgIja/KEb5upsuc+6MBw2RrHtI=; b=Ul7o66TMR8nB+ehEqhei5KLO7LptK00+K7raW2zrJPynXbGidGgSZejDKzFnZihwsl 9yAHvBRljcXHrwqvOJ7XdkGbt8d+LwXllvQGUxZecNo+pl42uRZFBpGwPmsVuoWzllh4 qiQvt3P5CldXiq7+YmfughJj0rlfVs+5yWVH9r51GuT8Bcg3jNiIbM5FdJoX+epXo4kG k0AB75bj4N3Ei4SIySE3bFCn2L2qgCyAi6nPXeUjVRwKWA95Kgre/bcxIYcYnRiJvTZz 8ckYNo4V+PL4USHRsGufaJglRpc7hHllXoCO4bPyvLvBlukvEu5HliHedV2KK7S9hDyH qgBg== X-Forwarded-Encrypted: i=1; AFNElJ/XnYYaStdQ1YEiJ3nKpwH/GrOvBQH66KL1mhg9ahxZa/t4gzVIqj6bJj85BMuTz07fhXME4lETYrTTR+Tt@lists.postgresql.org X-Gm-Message-State: AOJu0YxmVRN8YyLFOb5S0zeBsDTFYZOSYBfKl1u007CZB8kd0kO3RjSi hI8YhZjT5Uth5zeA1U/5G3odKIJqk8kbsH89eS+cAFTQy02okoFvFwjytzaKACANB1fq7QHPlcG +/HXxOyVVJATLJElDVODddQaU4WNdcZM= X-Gm-Gg: Acq92OEtFvAVJkGdXZN0Kf77DrDg3u+TBCPXe+rt5felKQ6mk5EihYxpCyV0HogNtCD gRCTeY5HZzxEicWjtG9kGZBb1Qewu8oFK31k4zVFNn/1nr+HwnOULyX4dUbQD+BzoWbgNJtOqPM 2HJpQRk0/ODJtMGJjdCx5XGL7aKfz1SezOuihC1uJzcsJIMpxAvPhkbYtOHizQsGsdIlw/d7Nyx gQjQTCQWp1pBMQEZLWj1l1HSR24gqppmRA6Xw76CBRyAGJrLFIZXW9X/btvqPyJwYI3+68mDYz2 Siot+tHjZnQ0XaOPoM/SiJKdu9V7fsP3JGSoxo1l4bFbkCnz0zWz4PI6XKJ4KfD/9IePZ6/2j+9 TaNBrZHvX4jiW9qgZA/Bl7cep12Zy6ACWvyHpQgrQ X-Received: by 2002:a05:6820:1893:b0:696:8098:b0e5 with SMTP id 006d021491bc7-69c9bfea57dmr8581343eaf.55.1779100473701; Mon, 18 May 2026 03:34:33 -0700 (PDT) MIME-Version: 1.0 References: <202508051955.sao7ucalcce7@alvherre.pgsql> <7e2abeb3ea9bc7ca024f4e457dce33f5@postgrespro.ru> In-Reply-To: <7e2abeb3ea9bc7ca024f4e457dce33f5@postgrespro.ru> From: Alexander Korotkov Date: Mon, 18 May 2026 13:34:21 +0300 X-Gm-Features: AVHnY4KoUQ6p0I1n9vtlHgcMpvXGWTXbidKBjCXdTpED_nSErTrXvkjd9nrBg6Y Message-ID: Subject: Re: Function scan FDW pushdown To: Alexander Pyhalov Cc: solaimurugan vellaipandiyan , =?UTF-8?Q?=C3=81lvaro_Herrera?= , g.kashkin@postgrespro.ru, Ashutosh Bapat , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000c1608b0652151bc0" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000c1608b0652151bc0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Alexander! The revised patch is attached. On Tue, May 12, 2026 at 11:09=E2=80=AFAM Alexander Pyhalov wrote: > 1) deparseColumnRef() doesn't account for whole row vars. > In queries like > > UPDATE remote_tbl r SET b=3D5 FROM UNNEST(array[box '((2,3),(-2,-3))']) A= S > t (bx) WHERE r.a =3D area(t.bx) > > it fails with assert that varattno should be > 0. When we lock > non-relation RTE, we select whole row var, and we have to deparse it for > function RTE. > > You've removed check for function return type. This seems to be > dangerous. Old example > > CREATE OR REPLACE FUNCTION f_ret_record() RETURNS record AS $$ SELECT > (1,2)::record $$ language SQL IMMUTABLE; > ALTER EXTENSION postgres_fdw ADD function f_ret_record(); > EXPLAIN (VERBOSE, COSTS OFF) > SELECT s FROM remote_tbl rt, f_ret_record() AS s(a int, b int) > WHERE s.a =3D rt.a; > > fails with > > ERROR: a column definition list is required for functions returning > "record" function_rte_pushdown_ok() now calls get_expr_result_type() and rejects anything that isn't TYPEFUNC_SCALAR (also RECORDOID/VOIDOID), so f_ret_record() no longer reaches the remote side. deparseColumnRef() now handles varattno =3D=3D 0 for RTE_FUNCTION and emits ROW(f.c1, ..., f.c) from rte->eref->colnames. > 2) postgresBeginForeignScan() can step on function RTE, and doesn't know > what to do with it: > SELECT * FROM unnest(array[2,3,4]) n, remote_tbl r WHERE r.a =3D n; > ERROR: cache lookup failed for foreign table 0 > > So, we need to look for the first RTE_RELATION, as in older patch > version. The scanrelid =3D=3D 0 branch in postgresBeginForeignScan() now scans fs_base_relids until it finds an RTE_RELATION. An explicit elog(ERROR) guards the (theoretically impossible) case where no foreign RTE is found. > 3) A lot of complexity in the old patch version was in making it > possible to find out RTE_FUNCTION attribute types after planing, as it's > necessary to correctly handle joins. In this version > get_tupdesc_for_join_scan_tuples() doesn't handle function RTEs. This > means, when we try to find out type for attribute types for joins, we'll > get errors. This can be seen in queries like > > UPDATE remote_tbl r SET b=3DCASE WHEN random()>=3D0 THEN 5 ELSE 0 END FRO= M > UNNEST(array[box '((2,3),(-2,-3))']) AS t (bx) WHERE r.a =3D area(t.bx) > RETURNING a,b; > > Now it fails on earlier stages (with "column f2.c0 does not exist"), but > if we fix it, we'll get something like > "ERROR: input of anonymous composite types is not implemented" > > Overall, function_rte_pushdown_ok() now allows more strange > constructions. Could it skip Vars from outside of joinrel->relids? Can > we safely ship function with parameters in arguments? I'm not sure. Restored the per-function metadata you had in v2/v3. FdwScanPrivateFunctions (list of (funcid, funcrettype, funccollation) indexed by RTI-offset) and FdwScanPrivateMinRTIndex are now saved in fdw_private by postgresGetForeignPlan(). get_tupdesc_for_join_scan_tuples() now has an RTE_FUNCTION branch that rebuilds the tuple descriptor from this metadata, exactly as in your patch. > 4) Why do we restrict list_length(rte->functions) to 1? The main reason > for supporting several rte->functions was to allow pushdown of UNNEST() > with several arrays, which is used by HammerDB tproc-c test. function_rte_pushdown_ok() now loops over rte->functions and applies the same checks to every member. deparseFunctionRangeTblRef() emits ROWS FROM (f1(), f2(), ...) AS f(c1, c2, ...) with the column-name list covering the concatenation of every function's columns, in the order they appear. > 5) We can support pushing down joins of foreign tables and another RTE > types, for example, VALUES. But with new specific way of handling > RTE_FUNCTIONS in core, this requires both changes to > set_foreign_rel_properties() and postgres_fdw. Not sure, if this is a > big problem, but at least is worth mentioning . I've kept the planner-side change minimal: set_foreign_rel_properties() propagates fdwroutine onto a joinrel pairing a foreign rel with an RTE_FUNCTION rel, so the standard GetForeignJoinPaths callback gets invoked. No new FDW callback was needed. This is also the reason the planner-side fpinfo of the function side lives on the joinrel (outer_func_fpinfo/inner_func_fpinfo fields added to PgFdwRelationInfo) rather than on the function RelOptInfo->fdw_private: the same RTE_FUNCTION rel can be paired independently with foreign rels from several servers. Extending the same scheme to RTE_VALUES / RTE_CTE is, I agree, worth doing late. It would be a one branch addition to set_foreign_rel_properties() plus an FDW-side shippability check analogous to function_rte_pushdown_ok(). A few extra changes to the patch: - LATERAL function RTEs are explicitly rejected in function_rte_pushdown_ok() (returns false when rel->lateral_relids is non-empty). - Outer joins (LEFT/RIGHT/FULL) and SEMI joins fall through to the existing !fpinfo_o || !fpinfo_i rejection, since inner_is_function/outer_is_function are only set for JOIN_INNER. - Regression coverage in contrib/postgres_fdw/sql/postgres_fdw.sql now reuses your examples. ------ Regards, Alexander Korotkov Supabase --000000000000c1608b0652151bc0 Content-Type: application/octet-stream; name="v5-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Disposition: attachment; filename="v5-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpb23bhm0 RnJvbSBjNjQ2YmVmYTMxNjU1NWFjN2EyYjEwY2Y5ZjUyMGYzNjQ5Njk0MWNiIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogU3VuLCAxMCBNYXkgMjAyNiAxNzoxNToyMSArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjVdIHBvc3RncmVzX2ZkdzogcHVzaCBkb3duIEZVTkNUSU9OIFJURSBpbnRvIGZvcmVp Z24gam9pbnMKCkEgZm9yZWlnbiBqb2luIHBsYW5uaW5nIGhvb2sgbm93IGNvbnNpZGVycyBhIChm b3JlaWduLXRhYmxlIHggZnVuY3Rpb24tUlRFKQpJTk5FUiBqb2luIGFzIGEgcHVzaC1kb3duIGNh bmRpZGF0ZSB3aGVuIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGlzCklNTVVUQUJMRSBhbmQgb3Ro ZXJ3aXNlIHNoaXBwYWJsZS4gIFRoZSByZW1vdGUgcXVlcnkgYWJzb3JicyB0aGUgZnVuY3Rpb24K Y2FsbCBhcyBhIEZST00tbGlzdCBpdGVtIChlLmcuIHVubmVzdCguLi4pIEFTIGY8cnRpPihjMSwg YzIsIC4uLikpLCBzbyB0aGUKZm9yZWlnbiBzaWRlIHJldHVybnMgb25seSByb3dzIHRoYXQgbWF0 Y2ggdGhlIGZ1bmN0aW9uLXByb2R1Y2VkIHNldCBhbmQgdGhlCmpvaW4gZXhlY3V0ZXMgZW50aXJl bHkgb24gdGhlIHJlbW90ZS4KCkFuIElNTVVUQUJMRSBmdW5jdGlvbiBnaXZlcyB0aGUgc2FtZSBy ZXN1bHQgb24gYW55IHNlcnZlciwgc28gdGhlIHNhbWUKZnVuY3Rpb24gUlRFIGNhbiBiZSBhIHB1 c2gtZG93biBjYW5kaWRhdGUgZm9yIHNldmVyYWwgZGlzdGluY3QgZm9yZWlnbgpzZXJ2ZXJzIHdp dGhvdXQgc2VtYW50aWMgcmlzay4gIFRvIGtlZXAgdGhlIHBsYW5uZXIgc3RhdGUgY29uc2lzdGVu dAphY3Jvc3MgdGhvc2UgaW5kZXBlbmRlbnQgYXR0ZW1wdHMsIHRoZSBwZXItY2FsbCBzdHViIGZw aW5mbyBmb3IgdGhlCmZ1bmN0aW9uIHNpZGUgbGl2ZXMgb24gdGhlIGpvaW5yZWwncyBQZ0Zkd1Jl bGF0aW9uSW5mbyAobmV3Cm91dGVyX2Z1bmNfZnBpbmZvIC8gaW5uZXJfZnVuY19mcGluZm8pLCBu ZXZlciBvbiB0aGUgZnVuY3Rpb24gcmVsIGl0c2VsZiwKYW5kIHRoZSBmdW5jdGlvbiBzaWRlIGlz IGRldGVjdGVkIHZpYSBydGVraW5kIHJhdGhlciB0aGFuIGZkd19wcml2YXRlLgoKc2V0X2ZvcmVp Z25fcmVsX3Byb3BlcnRpZXMoKSBwcm9wYWdhdGVzIGZkd3JvdXRpbmUgb250byBhIGpvaW5yZWwg dGhhdApwYWlycyBhIGZvcmVpZ24gcmVsIHdpdGggYW4gUlRFX0ZVTkNUSU9OIHJlbCBzbyBHZXRG b3JlaWduSm9pblBhdGhzIGdldHMKY2FsbGVkOyB0aGUgRkRXIHJldGFpbnMgZnVsbCBjb250cm9s IG92ZXIgd2hldGhlciB0byBhY3R1YWxseSBnZW5lcmF0ZSBhCnBhdGguICBkZXBhcnNlUmFuZ2VU YmxSZWYgYW5kIGRlcGFyc2VDb2x1bW5SZWYgZ2FpbiBhIEZVTkNUSU9OLVJURSBicmFuY2gKdGhh dCBlbWl0cyB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBhbmQgcmVzb2x2ZXMgVmFycyB0byB0aGUg Z2VuZXJhdGVkCmNvbHVtbiBhbGlhc2VzLgotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFy c2UuYyAgICAgICAgICAgICAgICB8IDEyMiArKysrLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3Rl ZC9wb3N0Z3Jlc19mZHcub3V0ICAgIHwgNDAyICsrKysrKysrKysrKysrKysKIGNvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jICAgICAgICAgICB8IDQzMSArKysrKysrKysrKysrKysr Ky0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oICAgICAgICAgICB8ICAxMCAr CiBjb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCAgICAgfCAxNjIgKysr KysrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jICAgICAgICAgIHwgIDI0 ICsKIDYgZmlsZXMgY2hhbmdlZCwgMTEyNyBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMgYi9jb250cmliL3Bv c3RncmVzX2Zkdy9kZXBhcnNlLmMKaW5kZXggMmRjYzZjOGFmMWIuLmY0MGZlNTJlYTViIDEwMDY0 NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKKysrIGIvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZGVwYXJzZS5jCkBAIC0xMTIsNiArMTEyLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgZGVw YXJzZV9leHByX2N4dAogCQlhcHBlbmRTdHJpbmdJbmZvKChidWYpLCAiJXMlZC4iLCBSRUxfQUxJ QVNfUFJFRklYLCAodmFybm8pKQogI2RlZmluZSBTVUJRVUVSWV9SRUxfQUxJQVNfUFJFRklYCSJz IgogI2RlZmluZSBTVUJRVUVSWV9DT0xfQUxJQVNfUFJFRklYCSJjIgorI2RlZmluZSBGVU5DVElP Tl9SRUxfQUxJQVNfUFJFRklYCSJmIgogCiAvKgogICogRnVuY3Rpb25zIHRvIGRldGVybWluZSB3 aGV0aGVyIGFuIGV4cHJlc3Npb24gY2FuIGJlIGV2YWx1YXRlZCBzYWZlbHkgb24KQEAgLTIwMzAs NiArMjAzMSw3MiBAQCBkZXBhcnNlRnJvbUV4cHJGb3JSZWwoU3RyaW5nSW5mbyBidWYsIFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpmb3JlaWducmVsLAogCX0KIH0KIAorLyoKKyAqIERl cGFyc2UgYSBGVU5DVElPTiBSVEUgYWJzb3JiZWQgaW50byBhIGZvcmVpZ24gam9pbi4gIFRoZSBm dW5jdGlvbiBjYWxsKHMpCisgKiBhcmUgZW1pdHRlZCBhcyBhIEZST00tbGlzdCBpdGVtOgorICoK KyAqICAgPGZ1bmNleHByPiBBUyBmPHJ0aT4oYzEsIGMyLCAuLi4sIGNOKQorICoKKyAqIEZvciBt dWx0aS1mdW5jdGlvbiBSVEVzIChTUUwgUk9XUyBGUk9NIChmMSgpLCBmMigpLCAuLi4pKSwgZWFj aAorICogZnVuY3Rpb24gY2FsbCBhcHBlYXJzIGNvbW1hLXNlcGFyYXRlZCBpbnNpZGUgUk9XUyBG Uk9NKC4uLikuICBDb2x1bW4KKyAqIGFsaWFzZXMgYzEuLmNOIGNvdmVyIHRoZSB1bmlvbiBvZiBl dmVyeSBmdW5jdGlvbidzIGNvbHVtbnMsIGluIHRoZQorICogb3JkZXIgdGhleSBhcHBlYXI7IHRo YXQgbWF0Y2hlcyB0aGUgY29sdW1uIG9yZGVyaW5nIG9mIHRoZSBSVEUuCisgKi8KK3N0YXRpYyB2 b2lkCitkZXBhcnNlRnVuY3Rpb25SYW5nZVRibFJlZihTdHJpbmdJbmZvIGJ1ZiwgUGxhbm5lcklu Zm8gKnJvb3QsCisJCQkJCQkgICBSZWxPcHRJbmZvICpmb3JlaWducmVsLCBSZWxPcHRJbmZvICpz Y2FucmVsLAorCQkJCQkJICAgTGlzdCAqKnBhcmFtc19saXN0KQoreworCVJhbmdlVGJsRW50cnkg KnJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goZm9yZWlnbnJlbC0+cmVsaWQsIHJvb3QpOworCWRlcGFy c2VfZXhwcl9jeHQgY29udGV4dDsKKwlMaXN0Q2VsbCAgICpsYzsKKwlib29sCQltdWx0aV9mdW5j OworCWludAkJCXRvdGFsX2NvbHMgPSAwOworCWludAkJCWk7CisKKwlBc3NlcnQocnRlLT5ydGVr aW5kID09IFJURV9GVU5DVElPTik7CisJQXNzZXJ0KCFydGUtPmZ1bmNvcmRpbmFsaXR5KTsKKwlB c3NlcnQobGlzdF9sZW5ndGgocnRlLT5mdW5jdGlvbnMpID49IDEpOworCisJbXVsdGlfZnVuYyA9 IGxpc3RfbGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+IDE7CisKKwljb250ZXh0LmJ1ZiA9IGJ1ZjsK Kwljb250ZXh0LnJvb3QgPSByb290OworCWNvbnRleHQuZm9yZWlnbnJlbCA9IHNjYW5yZWw7CisJ Y29udGV4dC5zY2FucmVsID0gc2NhbnJlbDsKKwljb250ZXh0LnBhcmFtc19saXN0ID0gcGFyYW1z X2xpc3Q7CisKKwlpZiAobXVsdGlfZnVuYykKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYs ICJST1dTIEZST00gKCIpOworCisJZm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJeworCQlS YW5nZVRibEZ1bmN0aW9uICpydGZ1bmMgPSAoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMp OworCisJCWlmIChmb3JlYWNoX2N1cnJlbnRfaW5kZXgobGMpID4gMCkKKwkJCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJZGVwYXJzZUV4cHIoKEV4cHIgKikgcnRmdW5jLT5m dW5jZXhwciwgJmNvbnRleHQpOworCQl0b3RhbF9jb2xzICs9IHJ0ZnVuYy0+ZnVuY2NvbGNvdW50 OworCX0KKworCWlmIChtdWx0aV9mdW5jKQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcp Jyk7CisKKwkvKiBBbGlhcyArIGdlbmVyYXRlZCBjb2x1bW4tbmFtZSBsaXN0LiAqLworCWFwcGVu ZFN0cmluZ0luZm8oYnVmLCAiICVzJWQiLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCBmb3Jl aWducmVsLT5yZWxpZCk7CisJaWYgKHRvdGFsX2NvbHMgPiAwKQorCXsKKwkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKCcpOworCQlmb3IgKGkgPSAxOyBpIDw9IHRvdGFsX2NvbHM7IGkrKykK KwkJeworCQkJaWYgKGkgPiAxKQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAi KTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9BTElBU19Q UkVGSVgsIGkpOworCQl9CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKwl9Cit9 CisKIC8qCiAgKiBBcHBlbmQgRlJPTSBjbGF1c2UgZW50cnkgZm9yIHRoZSBnaXZlbiByZWxhdGlv biBpbnRvIGJ1Zi4KICAqIENvbmRpdGlvbnMgZnJvbSBsb3dlci1sZXZlbCBTRU1JLUpPSU5zIGFy ZSBhcHBlbmRlZCB0byBhZGRpdGlvbmFsX2NvbmRzCkBAIC0yMDQwLDcgKzIxMDcsMjIgQEAgZGVw YXJzZVJhbmdlVGJsUmVmKFN0cmluZ0luZm8gYnVmLCBQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqZm9yZWlnbnJlbCwKIAkJCQkgICBib29sIG1ha2Vfc3VicXVlcnksIEluZGV4IGlnbm9y ZV9yZWwsIExpc3QgKippZ25vcmVfY29uZHMsCiAJCQkJICAgTGlzdCAqKmFkZGl0aW9uYWxfY29u ZHMsIExpc3QgKipwYXJhbXNfbGlzdCkKIHsKLQlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvID0g KFBnRmR3UmVsYXRpb25JbmZvICopIGZvcmVpZ25yZWwtPmZkd19wcml2YXRlOworCVBnRmR3UmVs YXRpb25JbmZvICpmcGluZm87CisKKwkvKgorCSAqIEZvciBhIGZ1bmN0aW9uIFJURSBhYnNvcmJl ZCBpbnRvIGEgZm9yZWlnbiBqb2luLCBkZXBhcnNlIHRoZSBmdW5jdGlvbgorCSAqIGV4cHJlc3Np b24gYXMgYSBGUk9NLWxpc3QgaXRlbSBhbmQgcmV0dXJuLiAgVGhlIHN0dWIgZnBpbmZvIHNldCB1 cCBieQorCSAqIGZvcmVpZ25fam9pbl9vaygpIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgaGVy ZS4KKwkgKi8KKwlpZiAoZm9yZWlnbnJlbC0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pCisJewor CQlBc3NlcnQoIW1ha2Vfc3VicXVlcnkpOworCQlkZXBhcnNlRnVuY3Rpb25SYW5nZVRibFJlZihi dWYsIHJvb3QsIGZvcmVpZ25yZWwsIGZvcmVpZ25yZWwsCisJCQkJCQkJCSAgIHBhcmFtc19saXN0 KTsKKwkJcmV0dXJuOworCX0KKworCWZwaW5mbyA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmb3Jl aWducmVsLT5mZHdfcHJpdmF0ZTsKIAogCS8qIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGVz ZSBjYXNlcy4gKi8KIAlBc3NlcnQoSVNfU0lNUExFX1JFTChmb3JlaWducmVsKSB8fCBJU19KT0lO X1JFTChmb3JlaWducmVsKSk7CkBAIC0yNzEyLDYgKzI3OTQsNDQgQEAgc3RhdGljIHZvaWQKIGRl cGFyc2VDb2x1bW5SZWYoU3RyaW5nSW5mbyBidWYsIGludCB2YXJubywgaW50IHZhcmF0dG5vLCBS YW5nZVRibEVudHJ5ICpydGUsCiAJCQkJIGJvb2wgcXVhbGlmeV9jb2wpCiB7CisJLyoKKwkgKiBG dW5jdGlvbiBSVEUgY29sdW1uczogZW1pdCBhcyBmPHZhcm5vPi5jPHZhcmF0dG5vPiwgbWF0Y2hp bmcgdGhlCisJICogYWxpYXNlcyBnZW5lcmF0ZWQgYnkgZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxS ZWYoKS4gIEEgd2hvbGUtcm93IFZhcgorCSAqICh2YXJhdHRubyA9PSAwKSBpcyByZW5kZXJlZCBh cyBST1coZjx2YXJubz4uYzEsIC4uLiwgZjx2YXJubz4uYzxOPikKKwkgKiB3aGVyZSBOIGlzIHRo ZSB0b3RhbCBjb2x1bW4gY291bnQgb2YgdGhlIGZ1bmN0aW9uIFJURSAoaW5jbHVkaW5nIGFsbAor CSAqIFJPV1MgRlJPTSAoLi4uKSBtZW1iZXJzKS4gIFN5c3RlbSBhdHRyaWJ1dGVzIHN1Y2ggYXMg Y3RpZCBoYXZlIG5vCisJICogbWVhbmluZyBmb3IgZnVuY3Rpb24gUlRFcyBhbmQgYXJlIHJlamVj dGVkLgorCSAqLworCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJaWYg KHZhcmF0dG5vID09IDApCisJCXsKKwkJCWludAkJCW5jb2xzID0gbGlzdF9sZW5ndGgocnRlLT5l cmVmLT5jb2xuYW1lcyk7CisJCQlpbnQJCQlpOworCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIlJPVygiKTsKKwkJCWZvciAoaSA9IDE7IGkgPD0gbmNvbHM7IGkrKykKKwkJCXsKKwkJ CQlpZiAoaSA+IDEpCisJCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJ CQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQuJXMlZCIsCisJCQkJCQkJCSBGVU5DVElPTl9S RUxfQUxJQVNfUFJFRklYLCB2YXJubywKKwkJCQkJCQkJIFNVQlFVRVJZX0NPTF9BTElBU19QUkVG SVgsIGkpOworCQkJfQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCQkJcmV0 dXJuOworCQl9CisKKwkJaWYgKHZhcmF0dG5vIDwgMCkKKwkJCWVsb2coRVJST1IsCisJCQkJICJz eXN0ZW0gYXR0cmlidXRlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIFJURSBpcyBub3Qgc3VwcG9y dGVkIGluIGZvcmVpZ24gam9pbiBwdXNoZG93biIpOworCisJCWlmIChxdWFsaWZ5X2NvbCkKKwkJ CWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZC4iLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklY LCB2YXJubyk7CisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9B TElBU19QUkVGSVgsIHZhcmF0dG5vKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIFdlIHN1cHBvcnQg ZmV0Y2hpbmcgdGhlIHJlbW90ZSBzaWRlJ3MgQ1RJRCBhbmQgT0lELiAqLwogCWlmICh2YXJhdHRu byA9PSBTZWxmSXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXIpCiAJewpkaWZmIC0tZ2l0IGEvY29u dHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggYWFmZmNmMzEyNzEuLmNh MTU4ZDViODRmIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0 Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVz X2Zkdy5vdXQKQEAgLTI4ODUsNiArMjg4NSw0MDggQEAgU0VMRUNUIHQxLmMxLCB0Mi5jMiBGUk9N IHY0IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQxLmMK ICgxMCByb3dzKQogCiBBTFRFUiBWSUVXIHY0IE9XTkVSIFRPIHJlZ3Jlc3Nfdmlld19vd25lcjsK Ky0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93 biAoSU1NVVRBQkxFIGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxF IGZ1bmN0aW9uOiB1bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitF WFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQx IHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUg dDEuYzEgPSB1LmlkIE9SREVSIEJZIHQxLmMxOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6IHQx LmMxLCB0MS5jMworICAgU29ydCBLZXk6IHQxLmMxCisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAg ICAgICBPdXRwdXQ6IHQxLmMxLCB0MS5jMworICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0 MSB0MSkgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVD VCByMS4iQyAxIiwgcjEuYzMgRlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3Qo J3sxLDUsMTAsMTAwfSc6OmludGVnZXJbXSkgZjIoYzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEp KSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQxLCB1bm5lc3Qo QVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1Lmlk IE9SREVSIEJZIHQxLmMxOworIGMxICB8ICBjMyAgIAorLS0tLS0rLS0tLS0tLQorICAgMSB8IDAw MDAxCisgICA1IHwgMDAwMDUKKyAgMTAgfCAwMDAxMAorIDEwMCB8IDAwMTAwCisoNCByb3dzKQor CistLSBJTU1VVEFCTEUgZnVuY3Rpb246IGdlbmVyYXRlX3NlcmllcyB3aXRoIGNvbnN0YW50IGFy Z3MKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSBGUk9NIGZ0MSB0 MSwgZ2VuZXJhdGVfc2VyaWVzKDEsIDQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQgT1JE RVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6 IHQxLmMxCisgICBTb3J0IEtleTogdDEuYzEKKyAgIC0+ICBGb3JlaWduIFNjYW4KKyAgICAgICAg IE91dHB1dDogdDEuYzEKKyAgICAgICAgIFJlbGF0aW9uczogKHB1YmxpYy5mdDEgdDEpIElOTkVS IEpPSU4gKEZ1bmN0aW9uIGcpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgcjEuIkMgMSIg RlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgZjIo YzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEpKSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEg RlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEg PSBnLmlkIE9SREVSIEJZIHQxLmMxOworIGMxIAorLS0tLQorICAxCisgIDIKKyAgMworICA0Ciso NCByb3dzKQorCistLSBWT0xBVElMRSBmdW5jdGlvbiAocmFuZG9tKSBtdXN0IE5PVCBiZSBwdXNo ZWQgZG93bgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxIEZST00g ZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpIEFTIGco aWQpCitXSEVSRSB0MS5jMSA9IGcuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2gg Sm9pbgorICAgT3V0cHV0OiB0MS5jMQorICAgSGFzaCBDb25kOiAoZy5pZCA9IHQxLmMxKQorICAg LT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZworICAgICAg ICAgT3V0cHV0OiBnLmlkCisgICAgICAgICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMo MSwgKDQgKyAoKHJhbmRvbSgpICogJzAnOjpkb3VibGUgcHJlY2lzaW9uKSk6OmludGVnZXIpKQor ICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDogdDEuYzEKKyAgICAgICAgIC0+ICBGb3JlaWdu IFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgICAgICAgT3V0cHV0OiB0MS5jMQorICAg ICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIKKygx MSByb3dzKQorCistLSBXSVRIIE9SRElOQUxJVFkgbXVzdCBOT1QgYmUgcHVzaGVkIGRvd24gKGxp bWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RT IE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00gZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwg NSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFTIHUoaWQsIG9yZCkKK1dIRVJFIHQxLmMx ID0gdS5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2luCisgICBPdXRwdXQ6IHQxLmMxLCB1Lm9yZAor ICAgSGFzaCBDb25kOiAodDEuYzEgPSB1LmlkKQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJs aWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBT RUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAxIgorICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1 dDogdS5vcmQsIHUuaWQKKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cu dW5uZXN0IHUKKyAgICAgICAgICAgICAgIE91dHB1dDogdS5vcmQsIHUuaWQKKyAgICAgICAgICAg ICAgIEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezEsNSwxMH0nOjppbnRlZ2VyW10pCisoMTEgcm93 cykKKworLS0gU2FtZSBmdW5jdGlvbiBSVEUgam9pbmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3Jl aWduIHNlcnZlcnM6IHBsYW5uZXIgcGlja3MKKy0tIG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBq b2luIHdpdGggdGhlIHNlY29uZCBmb3JlaWduIHNlcnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRo ZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFrZXMgdGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRl cyBjaG9zZSB0bworLS0gYWJzb3JiIGl0IGluZGVwZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NF LCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1 bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEg PSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JERVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEpv aW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBNZXJnZSBDb25kOiAodDEuYzEgPSB1Lmlk KQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6 IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAx IiBPUkRFUiBCWSAiQyAxIiBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91 dHB1dDogdDIuYzEsIHUuaWQKKyAgICAgICAgIFNvcnQgS2V5OiB0Mi5jMQorICAgICAgICAgLT4g IEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMSwgdS5pZAorICAgICAg ICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0NiB0MikgSU5ORVIgSk9JTiAoRnVuY3Rpb24g dSkKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMi5jMSwgZjMuYzEgRlJPTSAo IlMgMSIuIlQgNCIgcjIgSU5ORVIgSk9JTiB1bm5lc3QoJ3sxLDUsMTAsMTAwfSc6OmludGVnZXJb XSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpCisoMTMgcm93cykKKworLS0gQ29zdC1i YXNlZCBzZWxlY3Rpb24gYmV0d2VlbiB0d28gZm9yZWlnbiBzZXJ2ZXJzOiBmdDEgKCJTIDEiLiJU IDEiKSBoYXMKKy0tIDEwMDAgcm93cywgZnQ2ICgiUyAxIi4iVCA0IikgaGFzIH4zMyByb3dzLiAg VGhlIHNhbWUgcXVlcnkgc2hhcGUgZ2V0cyBhCistLSBkaWZmZXJlbnQgcHVzaC1kb3duIHRhcmdl dCBkZXBlbmRpbmcgb24gYSBwcmVkaWNhdGUgdGhhdCBjaGFuZ2VzIHRoZQorLS0gZWZmZWN0aXZl IGNhcmRpbmFsaXR5IG9mIG9uZSBzaWRlIC0tIHRoZSBmdW5jdGlvbiAianVtcHMiIHRvIHdoaWNo ZXZlcgorLS0gZm9yZWlnbiBzY2FuIGJlbmVmaXRzIG1vcmUgZnJvbSBiZWluZyBwcmUtZmlsdGVy ZWQuCitBTkFMWVpFIGZ0MTsKK0FOQUxZWkUgZnQ2OworLS0gTm8gZXh0cmEgcHJlZGljYXRlOiBm dDEgaXMgdGhlIGJpZ2dlciBzaWRlLCBmdW5jdGlvbiBhYnNvcmJlZCB0aGVyZS4KK0VYUExBSU4g KFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBm dDYgdDIsIHVubmVzdChBUlJBWVszLCA2LCA5LCAxMiwgMTUsIDE4XTo6aW50W10pIEFTIHUoaWQp CitXSEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQyLmMxID0gdS5pZDsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBI YXNoIEpvaW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBIYXNoIENvbmQ6ICh0MS5jMSA9 IHQyLmMxKQorICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiB0MS5jMSwgdS5p ZAorICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0MSB0MSkgSU5ORVIgSk9JTiAoRnVuY3Rp b24gdSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMS4iQyAxIiwgZjMuYzEgRlJPTSAo IlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3QoJ3szLDYsOSwxMiwxNSwxOH0nOjppbnRl Z2VyW10pIGYzKGMxKSBPTiAoKChyMS4iQyAxIiA9IGYzLmMxKSkpKQorICAgLT4gIEhhc2gKKyAg ICAgICAgIE91dHB1dDogdDIuYzEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGlj LmZ0NiB0MgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMQorICAgICAgICAgICAgICAgUmVt b3RlIFNRTDogU0VMRUNUIGMxIEZST00gIlMgMSIuIlQgNCIKKygxMiByb3dzKQorCistLSBTZWxl Y3RpdmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRoZSBlcWNsYXNzKSBzaHJpbmtzIGZ0 MSB0byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBub3cgZnQ2IGlzIGVmZmVjdGl2ZWx5 IHRoZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlvbiBpcyBhYnNvcmJlZCBpbnRvIGZ0 NiBpbnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0 Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYsIDksIDEyLCAxNSwg MThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIuYzEgPSB1Lmlk IEFORCB0MS5jMyA8ICcwMDAxMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91 dHB1dDogdDEuYzEsIHQyLmMxCisgICBKb2luIEZpbHRlcjogKHQxLmMxID0gdS5pZCkKKyAgIC0+ ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgT3V0cHV0OiB0MS5jMQor ICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIgV0hFUkUg KChjMyA8ICcwMDAxMCcpKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICBPdXRwdXQ6IHQy LmMxLCB1LmlkCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICAgICAgICBPdXRw dXQ6IHQyLmMxLCB1LmlkCisgICAgICAgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMuZnQ2IHQy KSBJTk5FUiBKT0lOIChGdW5jdGlvbiB1KQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VM RUNUIHIyLmMxLCBmMy5jMSBGUk9NICgiUyAxIi4iVCA0IiByMiBJTk5FUiBKT0lOIHVubmVzdCgn ezMsNiw5LDEyLDE1LDE4fSc6OmludGVnZXJbXSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEp KSkpCisoMTIgcm93cykKKworLS0gVGhlIHJlbWFpbmluZyBzY2VuYXJpb3MgbWlycm9yIHRoZSBy ZXByb2R1Y2VycyBmcm9tIFB5aGFsb3YncworLS0gdjQtcGF0Y2ggcmV2aWV3IChwb3N0Z3IuZXMv bS83ZTJhYmViM2VhOWJjN2NhMDI0ZjRlNDU3ZGNlMzNmNSU0MHBvc3RncmVzcHJvLnJ1KSwKKy0t IHNvIHRoZSBzYW1lIGRlZGljYXRlZCBmb3JlaWduIHRhYmxlIGlzIHJldXNlZCBmb3IgZWFjaC4K K0NSRUFURSBUQUJMRSBiYXNlX3RibF9weWggKGEgaW50LCBiIGludCk7CitJTlNFUlQgSU5UTyBi YXNlX3RibF9weWgKKyAgU0VMRUNUIGcsIGcgKyAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwg MzApIGc7CitDUkVBVEUgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsIChhIGludCwgYiBpbnQpCisg IFNFUlZFUiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1lICdiYXNlX3RibF9weWgnKTsKKy0t IFB5aGFsb3YgIzM6IGZ1bmN0aW9uIFJURSBhcHBlYXJzIGZpcnN0IGluIEZST007IHRoZSBmb3Jl aWduIHJlbGF0aW9uCistLSBpcyBmb3VuZCBieSBzY2FubmluZyBmc19iYXNlX3JlbGlkcyBmb3Ig YW4gUlRFX1JFTEFUSU9OIHJhdGhlciB0aGFuCistLSB1c2luZyBzY2FuLT5mc19yZWxpZCBibGlu ZGx5LgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSB1bm5lc3Qo YXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90YmwgciBXSEVSRSByLmEgPSBuOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2Nh bgorICAgT3V0cHV0OiBuLm4sIHIuYSwgci5iCisgICBSZWxhdGlvbnM6IChGdW5jdGlvbiBuKSBJ Tk5FUiBKT0lOIChwdWJsaWMucmVtb3RlX3RibCByKQorICAgUmVtb3RlIFNRTDogU0VMRUNUIGYx LmMxLCByMi5hLCByMi5iIEZST00gKHVubmVzdCgnezIsMyw0fSc6OmludGVnZXJbXSkgZjEoYzEp IElOTkVSIEpPSU4gcHVibGljLmJhc2VfdGJsX3B5aCByMiBPTiAoKChmMS5jMSA9IHIyLmEpKSkp CisoNCByb3dzKQorCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwgcmVt b3RlX3RibCByCitXSEVSRSByLmEgPSBuIE9SREVSIEJZIHIuYTsKKyBuIHwgYSB8ICBiICAKKy0t LSstLS0rLS0tLS0KKyAyIHwgMiB8IDEwMgorIDMgfCAzIHwgMTAzCisgNCB8IDQgfCAxMDQKKygz IHJvd3MpCisKKy0tIFB5aGFsb3YgIzI6IGZ1bmN0aW9uIHJldHVybmluZyByZWNvcmQgKGNvbXBv c2l0ZSkgaXMgZm9yYmlkZGVuOworLS0gcHVzaGluZyBpdCB3b3VsZCB5aWVsZCBhIHJlbW90ZSAi Y29sdW1uIGRlZmluaXRpb24gbGlzdCBpcyByZXF1aXJlZCIKKy0tIGVycm9yLiAgZnVuY3Rpb25f cnRlX3B1c2hkb3duX29rKCkgcmVqZWN0cyBpdCB2aWEgVFlQRUZVTkNfU0NBTEFSLgorQ1JFQVRF IE9SIFJFUExBQ0UgRlVOQ1RJT04gZl9yZXRfcmVjb3JkKCkgUkVUVVJOUyByZWNvcmQgQVMgJCQK KyAgU0VMRUNUICgxLCAyKTo6cmVjb3JkCiskJCBMQU5HVUFHRSBTUUwgSU1NVVRBQkxFOworRVhQ TEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHMgRlJPTSByZW1vdGVfdGJsIHJ0LCBm X3JldF9yZWNvcmQoKSBBUyBzKGEgaW50LCBiIGludCkKK1dIRVJFIHMuYSA9IHJ0LmE7CisgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgSGFz aCBKb2luCisgICBPdXRwdXQ6IHMuKgorICAgSGFzaCBDb25kOiAocnQuYSA9IHMuYSkKKyAgIC0+ ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcnQKKyAgICAgICAgIE91dHB1dDog cnQuYSwgcnQuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFz ZV90YmxfcHloCisgICAtPiAgSGFzaAorICAgICAgICAgT3V0cHV0OiBzLiosIHMuYQorICAgICAg ICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcHVibGljLmZfcmV0X3JlY29yZCBzCisgICAgICAgICAg ICAgICBPdXRwdXQ6IHMuKiwgcy5hCisgICAgICAgICAgICAgICBGdW5jdGlvbiBDYWxsOiBmX3Jl dF9yZWNvcmQoKQorKDExIHJvd3MpCisKK0RST1AgRlVOQ1RJT04gZl9yZXRfcmVjb3JkKCk7Cist LSBQeWhhbG92ICMxOiBVUERBVEUgLi4uIEZST00gdW5uZXN0KCkgd2l0aCBhIGNvbXBsZXggZWxl bWVudCB0eXBlOworLS0gYXJlYShib3gpIHlpZWxkcyB0aGUgdmFsdWUgdG8gbWF0Y2guICBUaGUg bG9ja2luZyBtYWNoaW5lcnkgZm9yIHRoZQorLS0gbm9uLXJlbGF0aW9uIFJURSBnZW5lcmF0ZXMg YSB3aG9sZS1yb3cgVmFyIHRoYXQgZGVwYXJzZUNvbHVtblJlZgorLS0gbm93IGVtaXRzIGFzIFJP VyhmPHJ0aT4uYzEsIC4uLikuCitVUERBVEUgcmVtb3RlX3RibCByIFNFVCBiID0gOTk5CitGUk9N IHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQorV0hFUkUgci5h ID0gYXJlYSh0LmJ4KTsKK1NFTEVDVCAqIEZST00gcmVtb3RlX3RibCBXSEVSRSBhIElOICgyMywg MjQsIDI1KSBPUkRFUiBCWSBhOworIGEgIHwgIGIgIAorLS0tLSstLS0tLQorIDIzIHwgMTIzCisg MjQgfCA5OTkKKyAyNSB8IDEyNQorKDMgcm93cykKKworLS0gUHloYWxvdiAjNDogc2FtZSBzaGFw ZSB3aXRoIENBU0UgYW5kIFJFVFVSTklORy4gIEV4ZXJjaXNlcyB0aGUKKy0tIERpcmVjdE1vZGlm eSBwYXRoIGFuZCB0aGUgZXhlY3V0b3IncyB0dXBsZS1kZXNjIHJlY29uc3RydWN0aW9uLgorVVBE QVRFIHJlbW90ZV90YmwgcgorICAgU0VUIGIgPSBDQVNFIFdIRU4gcmFuZG9tKCkgPj0gMCBUSEVO IDUgRUxTRSAwIEVORAorICBGUk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSdd KSBBUyB0KGJ4KQorIFdIRVJFIHIuYSA9IGFyZWEodC5ieCkgUkVUVVJOSU5HIGEsIGI7CisgYSAg fCBiIAorLS0tLSstLS0KKyAyNCB8IDUKKygxIHJvdykKKworLS0gUHloYWxvdiAjNTogUk9XUyBG Uk9NICguLi4pIHdpdGggc2V2ZXJhbCBmdW5jdGlvbnMuICBXZSBmb3JjZQorLS0gcHVzaGRvd24g YmVjYXVzZSB0aGUgY29zdCBtb2RlbCBvdGhlcndpc2UgcGlja3MgYSBsb2NhbCBwbGFuLgorU0VU IGVuYWJsZV9oYXNoam9pbiA9IG9mZjsKK1NFVCBlbmFibGVfbWVyZ2Vqb2luID0gb2ZmOworU0VU IGVuYWJsZV9uZXN0bG9vcCA9IG9mZjsKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NF TEVDVCByLmEsIHQubiwgdC5zCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVz dChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVy YXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZ IHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRw dXQ6IHIuYSwgdC5uLCB0LnMKKyAgIFNvcnQgS2V5OiByLmEKKyAgIC0+ICBGb3JlaWduIFNjYW4K KyAgICAgICAgIE91dHB1dDogci5hLCB0Lm4sIHQucworICAgICAgICAgUmVsYXRpb25zOiAocHVi bGljLnJlbW90ZV90YmwgcikgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdCkKKyAgICAgICAgIFJlbW90 ZSBTUUw6IFNFTEVDVCByMS5hLCBmMi5jMSwgZjIuYzIgRlJPTSAocHVibGljLmJhc2VfdGJsX3B5 aCByMSBJTk5FUiBKT0lOIFJPV1MgRlJPTSAodW5uZXN0KCd7Myw2LDl9Jzo6aW50ZWdlcltdKSwg Z2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIGYyKGMxLCBjMikgT04gKCgocjEuYSA9IGYyLmMxKSkp KQorKDcgcm93cykKKworU0VMRUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSByZW1vdGVfdGJsIHIs IFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSBy LmEgPSB0Lm4gT1JERVIgQlkgci5hOworIGEgfCBuIHwgcyAgCistLS0rLS0tKy0tLS0KKyAzIHwg MyB8IDExCisgNiB8IDYgfCAxMgorIDkgfCA5IHwgMTMKKygzIHJvd3MpCisKKy0tIFdob2xlLXJv dyBWYXIgb24gdGhlIGFic29yYmVkIGZ1bmN0aW9uIHNpZGUgKGUuZy4gdmlhIGEgY2FzdCB0bwor LS0gdGV4dCkuICBFeGVyY2lzZXMgYm90aCBkZXBhcnNlQ29sdW1uUmVmIHdob2xlLXJvdyBicmFu Y2ggYW5kIHRoZQorLS0gZ2V0X3R1cGRlc2NfZm9yX2pvaW5fc2Nhbl90dXBsZXMoKSBSVEVfRlVO Q1RJT04gbWV0YWRhdGEgcGF0aC4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVD VCB0Ojp0ZXh0LCByLmEKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFy cmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVf c2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5h OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0Cisg ICBPdXRwdXQ6ICgodC4qKTo6dGV4dCksIHIuYQorICAgU29ydCBLZXk6IHIuYQorICAgLT4gIEZv cmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiAodC4qKTo6dGV4dCwgci5hCisgICAgICAgICBS ZWxhdGlvbnM6IChwdWJsaWMucmVtb3RlX3RibCByKSBJTk5FUiBKT0lOIChGdW5jdGlvbiB0KQor ICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIFJPVyhmMi5jMSwgZjIuYzIpLCByMS5hIEZST00g KHB1YmxpYy5iYXNlX3RibF9weWggcjEgSU5ORVIgSk9JTiBST1dTIEZST00gKHVubmVzdCgnezMs Niw5fSc6OmludGVnZXJbXSksIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBmMihjMSwgYzIpIE9O ICgoKHIxLmEgPSBmMi5jMSkpKSkKKyg3IHJvd3MpCisKK1NFTEVDVCB0Ojp0ZXh0LCByLmEKKyAg RlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFT IHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworICAgdCAgICB8IGEgCist LS0tLS0tLSstLS0KKyAoMywxMSkgfCAzCisgKDYsMTIpIHwgNgorICg5LDEzKSB8IDkKKygzIHJv d3MpCisKK1JFU0VUIGVuYWJsZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitS RVNFVCBlbmFibGVfbmVzdGxvb3A7CistLSBWb2xhdGlsZSBmdW5jdGlvbiBpbiBST1dTIEZST00g ZGlzcXVhbGlmaWVzIHRoZSB3aG9sZSBSVEUuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYp CitTRUxFQ1Qgci5hIEZST00gcmVtb3RlX3RibCByLAorICAgICAgICAgICAgICAgIFJPV1MgRlJP TSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdl bmVyYXRlX3NlcmllcygxLCA0ICsgKHJhbmRvbSgpICogMCk6OmludCkpIEFTIHQobiwgcykKKyBX SEVSRSByLmEgPSB0Lm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE1lcmdlIEpvaW4KKyAgIE91dHB1dDogci5hCisgICBNZXJnZSBDb25kOiAodC5uID0gci5hKQor ICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5u CisgICAgICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiB0CisgICAgICAgICAgICAgICBPdXRwdXQ6 IHQubgorICAgICAgICAgICAgICAgRnVuY3Rpb24gQ2FsbDogdW5uZXN0KCd7Myw2LDl9Jzo6aW50 ZWdlcltdKSwgZ2VuZXJhdGVfc2VyaWVzKDEsICg0ICsgKChyYW5kb20oKSAqICcwJzo6ZG91Ymxl IHByZWNpc2lvbikpOjppbnRlZ2VyKSkKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHIu YQorICAgICAgICAgU29ydCBLZXk6IHIuYQorICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBw dWJsaWMucmVtb3RlX3RibCByCisgICAgICAgICAgICAgICBPdXRwdXQ6IHIuYQorICAgICAgICAg ICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfcHloCisoMTUg cm93cykKKworLS0gTEFURVJBTCBmdW5jdGlvbiByZWZlcmVuY2luZyBhIGZvcmVpZ24gVmFyOiBw b3N0Z3Jlc19mZHcncworLS0gZm9yZWlnbi1qb2luIHB1c2hkb3duIHJlamVjdHMgdGhpcyB2aWEg dGhlIGpvaW5yZWwtPmxhdGVyYWxfcmVsaWRzCistLSBjaGVjazsgdGhlIHBsYW4gaXMgdGhlcmVm b3JlIGEgbG9jYWwgTmVzdExvb3AgKyBGdW5jdGlvblNjYW4uCitFWFBMQUlOIChWRVJCT1NFLCBD T1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0LnggRlJPTSByZW1vdGVfdGJsIHIsIExBVEVSQUwgdW5u ZXN0KGFycmF5W3IuYV0pIEFTIHQoeCkKK1dIRVJFIHIuYSA8PSAzIE9SREVSIEJZIHIuYTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IHIuYSwg dC54CisgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAg IE91dHB1dDogci5hLCByLmIKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVi bGljLmJhc2VfdGJsX3B5aCBXSEVSRSAoKGEgPD0gMykpIE9SREVSIEJZIGEgQVNDIE5VTExTIExB U1QKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cudW5uZXN0IHQKKyAgICAgICAg IE91dHB1dDogdC54CisgICAgICAgICBGdW5jdGlvbiBDYWxsOiB1bm5lc3QoQVJSQVlbci5hXSkK Kyg4IHJvd3MpCisKKy0tIE91dGVyIGpvaW5zIHdpdGggdGhlIGZ1bmN0aW9uIFJURSBhcmUgbm90 IHB1c2hlZCBkb3duIChvbmx5IElOTkVSCistLSBqb2lucyBhcmUgc3VwcG9ydGVkIGJ5IGZ1bmN0 aW9uX3J0ZV9wdXNoZG93bl9vaygpKS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NF TEVDVCByLmEsIHQubiBGUk9NIHJlbW90ZV90YmwgcgorICAgICBMRUZUIEpPSU4gdW5uZXN0KGFy cmF5WzEsIDIsIDNdKSBBUyB0KG4pIE9OIHIuYSA9IHQubgorIFdIRVJFIHIuYSA8PSA1IE9SREVS IEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIExlZnQgSm9pbgor ICAgT3V0cHV0OiByLmEsIHQubgorICAgTWVyZ2UgQ29uZDogKHIuYSA9IHQubikKKyAgIC0+ICBG b3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcgorICAgICAgICAgT3V0cHV0OiByLmEs IHIuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90Ymxf cHloIFdIRVJFICgoYSA8PSA1KSkgT1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNv cnQKKyAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAg ICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRhbG9nLnVubmVzdCB0CisgICAgICAgICAgICAg ICBPdXRwdXQ6IHQubgorICAgICAgICAgICAgICAgRnVuY3Rpb24gQ2FsbDogdW5uZXN0KCd7MSwy LDN9Jzo6aW50ZWdlcltdKQorKDEyIHJvd3MpCisKKy0tIFNFTUkgam9pbiAoRVhJU1RTKSB3aXRo IGEgZnVuY3Rpb24gUlRFIGlzIGFsc28gbm90IHB1c2hlZCBkb3duLgorRVhQTEFJTiAoVkVSQk9T RSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgcgorIFdIRVJFIEVYSVNU UyAoU0VMRUNUIDEgRlJPTSB1bm5lc3QoYXJyYXlbMywgNiwgOV0pIEFTIHQobikgV0hFUkUgdC5u ID0gci5hKQorIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTWVyZ2UgU2VtaSBKb2luCisgICBPdXRwdXQ6IHIuYQorICAg TWVyZ2UgQ29uZDogKHIuYSA9IHQubikKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJl bW90ZV90YmwgcgorICAgICAgICAgT3V0cHV0OiByLmEsIHIuYgorICAgICAgICAgUmVtb3RlIFNR TDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfcHloIE9SREVSIEJZIGEgQVNDIE5VTExT IExBU1QKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgU29ydCBL ZXk6IHQubgorICAgICAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy51bm5lc3Qg dAorICAgICAgICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENh bGw6IHVubmVzdCgnezMsNiw5fSc6OmludGVnZXJbXSkKKygxMiByb3dzKQorCitEUk9QIEZPUkVJ R04gVEFCTEUgcmVtb3RlX3RibDsKK0RST1AgVEFCTEUgYmFzZV90YmxfcHloOwogLS0gPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KIC0tIENoZWNrIHRoYXQgdXNlcmlkIHRvIHVzZSB3aGVuIHF1ZXJ5aW5nIHRoZSByZW1v dGUgdGFibGUgaXMgY29ycmVjdGx5CiAtLSBwcm9wYWdhdGVkIGludG8gZm9yZWlnbiByZWxzIHBy ZXNlbnQgaW4gc3VicXVlcmllcyB1bmRlciBhbiBVTklPTiBBTEwKZGlmZiAtLWdpdCBhL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9z dGdyZXNfZmR3LmMKaW5kZXggMGZmNGVjMjMxNjQuLjE2NDFkZGQ5ZWY5IDEwMDY0NAotLS0gYS9j b250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYworKysgYi9jb250cmliL3Bvc3RncmVz X2Zkdy9wb3N0Z3Jlc19mZHcuYwpAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIm5vZGVzL21h a2VmdW5jcy5oIgogI2luY2x1ZGUgIm5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGlt aXplci9hcHBlbmRpbmZvLmgiCisjaW5jbHVkZSAib3B0aW1pemVyL2NsYXVzZXMuaCIKICNpbmNs dWRlICJvcHRpbWl6ZXIvY29zdC5oIgogI2luY2x1ZGUgIm9wdGltaXplci9pbmhlcml0LmgiCiAj aW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgpAQCAtODgsNiArODksMjIgQEAgZW51bSBG ZHdTY2FuUHJpdmF0ZUluZGV4CiAJICogb2Ygam9pbiwgYWRkZWQgd2hlbiB0aGUgc2NhbiBpcyBq b2luCiAJICovCiAJRmR3U2NhblByaXZhdGVSZWxhdGlvbnMsCisKKwkvKgorCSAqIExpc3Qgb2Yg cGVyLVJURSBmdW5jdGlvbiBtZXRhZGF0YSwgaW5kZXhlZCBieSBiYXNlIFJUSSBvZmZzZXQuICBF YWNoCisJICogZWxlbWVudCBpcyBlaXRoZXIgTlVMTCAoZm9yIG5vbi1SVEVfRlVOQ1RJT04gcmVs cyBpbiB0aGlzIHNjYW4pIG9yIGEKKwkgKiBsaXN0IG9mIHRocmVlLWVsZW1lbnQgbGlzdHMgKGZ1 bmNpZCwgZnVuY3JldHR5cGUsIGZ1bmNjb2xsYXRpb24pIC0tIG9uZQorCSAqIGlubmVyIGxpc3Qg cGVyIGZ1bmN0aW9uIGluIHRoZSBSVEUuICBBbGxvd3MgdGhlIGV4ZWN1dG9yIHRvIHJlYnVpbGQK KwkgKiBUdXBsZURlc2MgZW50cmllcyBmb3Igd2hvbGUtcm93IHJlZmVyZW5jZXMgdG8gZnVuY3Rp b24gUlRFcy4KKwkgKi8KKwlGZHdTY2FuUHJpdmF0ZUZ1bmN0aW9ucywKKworCS8qCisJICogSW50 ZWdlciBub2RlOiBtaW5pbXVtIGJhc2UgUlQgaW5kZXggY292ZXJlZCBieSB0aGUgc2NhbiwgdXNl ZCB0bworCSAqIHRyYW5zbGF0ZSBzY2FuLWxvY2FsIGluZGV4ZXMgdG8gZXN0YXRlLXJ0YWJsZSBp bmRleGVzIGFmdGVyIHNldHJlZnMuYworCSAqIGZsYXR0ZW5zIHJ0YWJsZXMuCisJICovCisJRmR3 U2NhblByaXZhdGVNaW5SVEluZGV4LAogfTsKIAogLyoKQEAgLTc0MCw2ICs3NTcsOSBAQCBzdGF0 aWMgYm9vbCBmb3JlaWduX2dyb3VwaW5nX29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpncm91cGVkX3JlbCwKIHN0YXRpYyBMaXN0ICpnZXRfdXNlZnVsX3BhdGhrZXlzX2Zvcl9yZWxh dGlvbihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICpyZWwpOwog c3RhdGljIExpc3QgKmdldF91c2VmdWxfZWNzX2Zvcl9yZWxhdGlvbihQbGFubmVySW5mbyAqcm9v dCwgUmVsT3B0SW5mbyAqcmVsKTsKK3N0YXRpYyBSZWxpZHMgZ2V0X2Jhc2VfcmVsaWRzKFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIGludAlnZXRfbWluX2Jhc2Vf cnRpKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIExpc3QgKmdl dF9mdW5jdGlvbnNfZGF0YShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKTsKIHN0 YXRpYyB2b2lkIGFkZF9wYXRoc193aXRoX3BhdGhrZXlzX2Zvcl9yZWwoUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCQkJUGF0aCAqZXBxX3BhdGgsIExpc3QgKnJl c3RyaWN0bGlzdCk7CiBzdGF0aWMgdm9pZCBhZGRfZm9yZWlnbl9ncm91cGluZ19wYXRocyhQbGFu bmVySW5mbyAqcm9vdCwKQEAgLTE2MzQsOSArMTY1NCwyNiBAQCBwb3N0Z3Jlc0dldEZvcmVpZ25Q bGFuKFBsYW5uZXJJbmZvICpyb290LAogCWZkd19wcml2YXRlID0gbGlzdF9tYWtlMyhtYWtlU3Ry aW5nKHNxbC5kYXRhKSwKIAkJCQkJCQkgcmV0cmlldmVkX2F0dHJzLAogCQkJCQkJCSBtYWtlSW50 ZWdlcihmcGluZm8tPmZldGNoX3NpemUpKTsKKworCS8qCisJICogUG9zaXRpb24gRmR3U2NhblBy aXZhdGVSZWxhdGlvbnM6IGVpdGhlciB0aGUgRVhQTEFJTiByZWxhdGlvbiBzdHJpbmcKKwkgKiAo am9pbnMvdXBwZXIgcmVscykgb3IgYSBOVUxMIHBsYWNlaG9sZGVyLCBzbyB0aGF0IHN1YnNlcXVl bnQgaW5kZXhlcworCSAqIHN0YXkgdmFsaWQgZm9yIHRoZSBiYXNlLXJlbCBzY2FuIGNhc2UuCisJ ICovCiAJaWYgKElTX0pPSU5fUkVMKGZvcmVpZ25yZWwpIHx8IElTX1VQUEVSX1JFTChmb3JlaWdu cmVsKSkKIAkJZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLAogCQkJCQkJCSAgbWFr ZVN0cmluZyhmcGluZm8tPnJlbGF0aW9uX25hbWUpKTsKKwllbHNlCisJCWZkd19wcml2YXRlID0g bGFwcGVuZChmZHdfcHJpdmF0ZSwgTlVMTCk7CisKKwkvKgorCSAqIEZkd1NjYW5Qcml2YXRlRnVu Y3Rpb25zIC8gRmR3U2NhblByaXZhdGVNaW5SVEluZGV4IGNhcnJ5IHRoZSBtZXRhZGF0YQorCSAq IHRoZSBleGVjdXRvciBuZWVkcyB0byByZWJ1aWxkIFR1cGxlRGVzYyBlbnRyaWVzIGZvciB3aG9s ZS1yb3cgVmFycworCSAqIHBvaW50aW5nIGF0IFJURV9GVU5DVElPTiByZWxzIGFic29yYmVkIGlu dG8gdGhlIGZvcmVpZ24gc2Nhbi4KKwkgKi8KKwlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3By aXZhdGUsIGdldF9mdW5jdGlvbnNfZGF0YShyb290LCBmb3JlaWducmVsKSk7CisJZmR3X3ByaXZh dGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLAorCQkJCQkJICBtYWtlSW50ZWdlcihnZXRfbWluX2Jh c2VfcnRpKHJvb3QsIGZvcmVpZ25yZWwpKSk7CiAKIAkvKgogCSAqIENyZWF0ZSB0aGUgRm9yZWln blNjYW4gbm9kZSBmb3IgdGhlIGdpdmVuIHJlbGF0aW9uLgpAQCAtMTY1Nyw5ICsxNjk0LDE1IEBA IHBvc3RncmVzR2V0Rm9yZWlnblBsYW4oUGxhbm5lckluZm8gKnJvb3QsCiAKIC8qCiAgKiBDb25z dHJ1Y3QgYSB0dXBsZSBkZXNjcmlwdG9yIGZvciB0aGUgc2NhbiB0dXBsZXMgaGFuZGxlZCBieSBh IGZvcmVpZ24gam9pbi4KKyAqCisgKiAncnRmdW5jZGF0YScgaXMgdGhlIEZkd1NjYW5Qcml2YXRl RnVuY3Rpb25zIGxpc3Qgc2F2ZWQgYXQgcGxhbiB0aW1lLCBhbmQKKyAqICdydG9mZnNldCcgaXMg dGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXhlY3V0b3IncyBSVCBpbmRleGVzIGFuZCB0aGUK KyAqIHNjYW4tbG9jYWwgUlQgaW5kZXhlcyBjYXB0dXJlZCBpbiB0aGF0IGxpc3QuICBCb3RoIG1h eSBiZSAwL05JTCB3aGVuIHRoZQorICogc2NhbiBoYXMgbm8gUlRFX0ZVTkNUSU9OIGRlcGVuZGVu dHMuCiAgKi8KIHN0YXRpYyBUdXBsZURlc2MKLWdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVw bGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpCitnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2FuX3R1 cGxlcyhGb3JlaWduU2NhblN0YXRlICpub2RlLAorCQkJCQkJCQkgTGlzdCAqcnRmdW5jZGF0YSwg aW50IHJ0b2Zmc2V0KQogewogCUZvcmVpZ25TY2FuICpmc3BsYW4gPSAoRm9yZWlnblNjYW4gKikg bm9kZS0+c3MucHMucGxhbjsKIAlFU3RhdGUJICAgKmVzdGF0ZSA9IG5vZGUtPnNzLnBzLnN0YXRl OwpAQCAtMTY5NSwxMyArMTczOCw2MiBAQCBnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2FuX3R1cGxl cyhGb3JlaWduU2NhblN0YXRlICpub2RlKQogCQlpZiAoIUlzQSh2YXIsIFZhcikgfHwgdmFyLT52 YXJhdHRubyAhPSAwKQogCQkJY29udGludWU7CiAJCXJ0ZSA9IGxpc3RfbnRoKGVzdGF0ZS0+ZXNf cmFuZ2VfdGFibGUsIHZhci0+dmFybm8gLSAxKTsKLQkJaWYgKHJ0ZS0+cnRla2luZCAhPSBSVEVf UkVMQVRJT04pCi0JCQljb250aW51ZTsKLQkJcmVsdHlwZSA9IGdldF9yZWxfdHlwZV9pZChydGUt PnJlbGlkKTsKLQkJaWYgKCFPaWRJc1ZhbGlkKHJlbHR5cGUpKQotCQkJY29udGludWU7Ci0JCWF0 dC0+YXR0dHlwaWQgPSByZWx0eXBlOwotCQkvKiBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgYW55 dGhpbmcgZWxzZSAqLworCisJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9OKQorCQl7 CisJCQlyZWx0eXBlID0gZ2V0X3JlbF90eXBlX2lkKHJ0ZS0+cmVsaWQpOworCQkJaWYgKCFPaWRJ c1ZhbGlkKHJlbHR5cGUpKQorCQkJCWNvbnRpbnVlOworCQkJYXR0LT5hdHR0eXBpZCA9IHJlbHR5 cGU7CisJCQkvKiBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgZWxzZSAqLworCQl9 CisJCWVsc2UgaWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04gJiYgcnRmdW5jZGF0YSAh PSBOSUwpCisJCXsKKwkJCS8qCisJCQkgKiBBIHdob2xlLXJvdyBWYXIgcG9pbnRzIGF0IGEgRlVO Q1RJT04gUlRFIGFic29yYmVkIGludG8gdGhlCisJCQkgKiBmb3JlaWduIGpvaW4uICBTeW50aGVz aXplIGFuIGFub255bW91cyBjb21wb3NpdGUgVHVwbGVEZXNjIGZyb20KKwkJCSAqIHRoZSBwZXIt ZnVuY3Rpb24gcmV0dXJuLXR5cGUgbWV0YWRhdGEgd2Ugc2F2ZWQgYXQgcGxhbiB0aW1lOworCQkJ ICogdGhlIGRlcGFyc2VyIGVtaXRzIHRoZXNlIGFzIFJPVyhmPHJ0aT4uYzEsIGY8cnRpPi5jMiwg Li4uKS4KKwkJCSAqLworCQkJTGlzdAkgICAqZnVuY2RhdGE7CisJCQlUdXBsZURlc2MJcnRlX3R1 cGRlc2M7CisJCQlpbnQJCQludW1fZnVuY3M7CisJCQlpbnQJCQlhdHRudW07CisJCQlMaXN0Q2Vs bCAgICpsYzEsCisJCQkJCSAgICpsYzI7CisKKwkJCWZ1bmNkYXRhID0gbGlzdF9udGgocnRmdW5j ZGF0YSwgdmFyLT52YXJubyAtIHJ0b2Zmc2V0KTsKKwkJCWlmIChmdW5jZGF0YSA9PSBOSUwpCisJ CQkJY29udGludWU7CisJCQludW1fZnVuY3MgPSBsaXN0X2xlbmd0aChmdW5jZGF0YSk7CisJCQlB c3NlcnQobnVtX2Z1bmNzID09IGxpc3RfbGVuZ3RoKHJ0ZS0+ZXJlZi0+Y29sbmFtZXMpKTsKKwkJ CXJ0ZV90dXBkZXNjID0gQ3JlYXRlVGVtcGxhdGVUdXBsZURlc2MobnVtX2Z1bmNzKTsKKworCQkJ YXR0bnVtID0gMTsKKwkJCWZvcmJvdGgobGMxLCBmdW5jZGF0YSwgbGMyLCBydGUtPmVyZWYtPmNv bG5hbWVzKQorCQkJeworCQkJCUxpc3QJICAgKmZkYXRhID0gbGZpcnN0X25vZGUoTGlzdCwgbGMx KTsKKwkJCQljaGFyCSAgICpjb2xuYW1lID0gc3RyVmFsKGxmaXJzdChsYzIpKTsKKwkJCQlPaWQJ CQlmdW5jcmV0dHlwZTsKKwkJCQlPaWQJCQlmdW5jY29sbGF0aW9uOworCisJCQkJZnVuY3JldHR5 cGUgPSBsc2Vjb25kX25vZGUoSW50ZWdlciwgZmRhdGEpLT5pdmFsOworCQkJCWZ1bmNjb2xsYXRp b24gPSBsdGhpcmRfbm9kZShJbnRlZ2VyLCBmZGF0YSktPml2YWw7CisKKwkJCQlpZiAoIU9pZElz VmFsaWQoZnVuY3JldHR5cGUpIHx8IGZ1bmNyZXR0eXBlID09IFJFQ09SRE9JRCkKKwkJCQkJZWxv ZyhFUlJPUiwKKwkJCQkJCSAiY291bGQgbm90IGRldGVybWluZSByZXR1cm4gdHlwZSBmb3IgZnVu Y3Rpb24gaW4gZm9yZWlnbiBzY2FuIik7CisKKwkJCQlUdXBsZURlc2NJbml0RW50cnkocnRlX3R1 cGRlc2MsIChBdHRyTnVtYmVyKSBhdHRudW0sIGNvbG5hbWUsCisJCQkJCQkJCSAgIGZ1bmNyZXR0 eXBlLCAtMSwgMCk7CisJCQkJVHVwbGVEZXNjSW5pdEVudHJ5Q29sbGF0aW9uKHJ0ZV90dXBkZXNj LCAoQXR0ck51bWJlcikgYXR0bnVtLAorCQkJCQkJCQkJCQlmdW5jY29sbGF0aW9uKTsKKwkJCQlh dHRudW0rKzsKKwkJCX0KKworCQkJYXNzaWduX3JlY29yZF90eXBlX3R5cG1vZChydGVfdHVwZGVz Yyk7CisJCQlhdHQtPmF0dHR5cG1vZCA9IHJ0ZV90dXBkZXNjLT50ZHR5cG1vZDsKKwkJfQogCX0K IAlyZXR1cm4gdHVwZGVzYzsKIH0KQEAgLTE3MzcsMTQgKzE4MjksMzAgQEAgcG9zdGdyZXNCZWdp bkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAKIAkvKgog CSAqIElkZW50aWZ5IHdoaWNoIHVzZXIgdG8gZG8gdGhlIHJlbW90ZSBhY2Nlc3MgYXMuICBUaGlz IHNob3VsZCBtYXRjaCB3aGF0Ci0JICogRXhlY0NoZWNrUGVybWlzc2lvbnMoKSBkb2VzLgorCSAq IEV4ZWNDaGVja1Blcm1pc3Npb25zKCkgZG9lcy4gIEZvciBhIGpvaW4sIHNjYW4gdGhlIGJhc2Ug cmVsaWRzIHVudGlsIHdlCisJICogZmluZCBhbiBSVEVfUkVMQVRJT04gKHRoZSBmb3JlaWduLXRh YmxlIHNpZGUpOyBpZ25vcmUgYW55IFJURV9GVU5DVElPTgorCSAqIGFic29yYmVkIGludG8gdGhl IGpvaW4sIHdoaWNoIGNvbnRyaWJ1dGVzIG5vIHJlbGF0aW9uIE9JRCB0byBsb29rIHVwLgogCSAq LwogCXVzZXJpZCA9IE9pZElzVmFsaWQoZnNwbGFuLT5jaGVja0FzVXNlcikgPyBmc3BsYW4tPmNo ZWNrQXNVc2VyIDogR2V0VXNlcklkKCk7CisJcnRlID0gTlVMTDsKIAlpZiAoZnNwbGFuLT5zY2Fu LnNjYW5yZWxpZCA+IDApCisJewogCQlydGluZGV4ID0gZnNwbGFuLT5zY2FuLnNjYW5yZWxpZDsK KwkJcnRlID0gZXhlY19ydF9mZXRjaChydGluZGV4LCBlc3RhdGUpOworCX0KIAllbHNlCi0JCXJ0 aW5kZXggPSBibXNfbmV4dF9tZW1iZXIoZnNwbGFuLT5mc19iYXNlX3JlbGlkcywgLTEpOwotCXJ0 ZSA9IGV4ZWNfcnRfZmV0Y2gocnRpbmRleCwgZXN0YXRlKTsKKwl7CisJCXJ0aW5kZXggPSAtMTsK KwkJd2hpbGUgKChydGluZGV4ID0gYm1zX25leHRfbWVtYmVyKGZzcGxhbi0+ZnNfYmFzZV9yZWxp ZHMsIHJ0aW5kZXgpKSA+PSAwKQorCQl7CisJCQlydGUgPSBleGVjX3J0X2ZldGNoKHJ0aW5kZXgs IGVzdGF0ZSk7CisJCQlpZiAocnRlICE9IE5VTEwgJiYgcnRlLT5ydGVraW5kID09IFJURV9SRUxB VElPTikKKwkJCQlicmVhazsKKwkJCXJ0ZSA9IE5VTEw7CisJCX0KKwkJaWYgKHJ0ZSA9PSBOVUxM KQorCQkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBsb2NhdGUgYSBmb3JlaWduIHJlbGF0aW9uIFJU RSBpbiBmb3JlaWduIHNjYW4iKTsKKwl9CiAKIAkvKiBHZXQgaW5mbyBhYm91dCBmb3JlaWduIHRh YmxlLiAqLwogCXRhYmxlID0gR2V0Rm9yZWlnblRhYmxlKHJ0ZS0+cmVsaWQpOwpAQCAtMTc4Nyw4 ICsxODk1LDE5IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpu b2RlLCBpbnQgZWZsYWdzKQogCX0KIAllbHNlCiAJeworCQlMaXN0CSAgICpydGZ1bmNkYXRhID0g KExpc3QgKikgbGlzdF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCSAgIEZk d1NjYW5Qcml2YXRlRnVuY3Rpb25zKTsKKwkJaW50CQkJbWluX2Jhc2VfcnRpID0gaW50VmFsKGxp c3RfbnRoKGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkgICBGZHdTY2FuUHJpdmF0 ZU1pblJUSW5kZXgpKTsKKwkJaW50CQkJcnRvZmZzZXQgPSBibXNfbmV4dF9tZW1iZXIoZnNwbGFu LT5mc19iYXNlX3JlbGlkcywgLTEpIC0KKwkJCW1pbl9iYXNlX3J0aTsKKworCQlBc3NlcnQobWlu X2Jhc2VfcnRpID4gMCk7CisJCUFzc2VydChydG9mZnNldCA+PSAwKTsKKwogCQlmc3N0YXRlLT5y ZWwgPSBOVUxMOwotCQlmc3N0YXRlLT50dXBkZXNjID0gZ2V0X3R1cGRlc2NfZm9yX2pvaW5fc2Nh bl90dXBsZXMobm9kZSk7CisJCWZzc3RhdGUtPnR1cGRlc2MgPSBnZXRfdHVwZGVzY19mb3Jfam9p bl9zY2FuX3R1cGxlcyhub2RlLCBydGZ1bmNkYXRhLAorCQkJCQkJCQkJCQkJCQkJcnRvZmZzZXQp OwogCX0KIAogCWZzc3RhdGUtPmF0dGlubWV0YSA9IFR1cGxlRGVzY0dldEF0dEluTWV0YWRhdGEo ZnNzdGF0ZS0+dHVwZGVzYyk7CkBAIC0yOTQxLDcgKzMwNjAsMTUgQEAgcG9zdGdyZXNCZWdpbkRp cmVjdE1vZGlmeShGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKQogCQlUdXBsZURl c2MJdHVwZGVzYzsKIAogCQlpZiAoZnNwbGFuLT5zY2FuLnNjYW5yZWxpZCA9PSAwKQotCQkJdHVw ZGVzYyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUpOworCQl7CisJCQkv KgorCQkJICogRGlyZWN0TW9kaWZ5IG9uIGEgZm9yZWlnbiBqb2luOiBwYXNzIE5JTC8wIGZvciB0 aGUgZnVuY3Rpb24KKwkJCSAqIG1ldGFkYXRhLiAgV2UgZG9uJ3QgY3VycmVudGx5IHB1c2ggZnVu Y3Rpb24gUlRFcyB0aHJvdWdoIHRoZQorCQkJICogZGlyZWN0LW1vZGlmeSBwYXRoLCBzbyB0aGVy ZSBhcmUgbm8gd2hvbGUtcm93IFZhcnMgcG9pbnRpbmcgYXQKKwkJCSAqIGZ1bmN0aW9uLVJURSB0 dXBsZXMgdG8gcmVjb25zdHJ1Y3QuCisJCQkgKi8KKwkJCXR1cGRlc2MgPSBnZXRfdHVwZGVzY19m b3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlLCBOSUwsIDApOworCQl9CiAJCWVsc2UKIAkJCXR1cGRl c2MgPSBSZWxhdGlvbkdldERlc2NyKGRtc3RhdGUtPnJlbCk7CiAKQEAgLTMwNTQsNyArMzE4MSw4 IEBAIHBvc3RncmVzRXhwbGFpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIEV4 cGxhaW5TdGF0ZSAqZXMpCiAJICogV2UgZG8gdGhhdCBoZXJlLCBub3Qgd2hlbiB0aGUgcGxhbiBp cyBjcmVhdGVkLCBiZWNhdXNlIHdlIGNhbid0IGtub3cKIAkgKiB3aGF0IGFsaWFzZXMgcnVsZXV0 aWxzLmMgd2lsbCBhc3NpZ24gYXQgcGxhbiBjcmVhdGlvbiB0aW1lLgogCSAqLwotCWlmIChsaXN0 X2xlbmd0aChmZHdfcHJpdmF0ZSkgPiBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucykKKwlpZiAobGlz dF9sZW5ndGgoZmR3X3ByaXZhdGUpID4gRmR3U2NhblByaXZhdGVSZWxhdGlvbnMgJiYKKwkJbGlz dF9udGgoZmR3X3ByaXZhdGUsIEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zKSAhPSBOVUxMKQogCXsK IAkJU3RyaW5nSW5mb0RhdGEgcmVsYXRpb25zOwogCQljaGFyCSAgICpyYXdyZWxhdGlvbnM7CkBA IC0zMTA0LDYgKzMyMzIsMjIgQEAgcG9zdGdyZXNFeHBsYWluRm9yZWlnblNjYW4oRm9yZWlnblNj YW5TdGF0ZSAqbm9kZSwgRXhwbGFpblN0YXRlICplcykKIAkJCQlydGkgKz0gcnRvZmZzZXQ7CiAJ CQkJQXNzZXJ0KGJtc19pc19tZW1iZXIocnRpLCBwbGFuLT5mc19iYXNlX3JlbGlkcykpOwogCQkJ CXJ0ZSA9IHJ0X2ZldGNoKHJ0aSwgZXMtPnJ0YWJsZSk7CisKKwkJCQkvKgorCQkJCSAqIElmIGEg ZnVuY3Rpb24gUlRFIHdhcyBhYnNvcmJlZCBpbnRvIHRoZSBmb3JlaWduIGpvaW4sCisJCQkJICog cmVuZGVyIGl0IGFzICJGdW5jdGlvbiA8YWxpYXM+IiBzaW5jZSB3ZSBoYXZlIG5vIGZvcmVpZ24K KwkJCQkgKiByZWxpZC4KKwkJCQkgKi8KKwkJCQlpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5D VElPTikKKwkJCQl7CisJCQkJCXJlZm5hbWUgPSAoY2hhciAqKSBsaXN0X250aChlcy0+cnRhYmxl X25hbWVzLCBydGkgLSAxKTsKKwkJCQkJaWYgKHJlZm5hbWUgPT0gTlVMTCkKKwkJCQkJCXJlZm5h bWUgPSBydGUtPmVyZWYtPmFsaWFzbmFtZTsKKwkJCQkJYXBwZW5kU3RyaW5nSW5mbygmcmVsYXRp b25zLCAiRnVuY3Rpb24gJXMiLAorCQkJCQkJCQkJIHF1b3RlX2lkZW50aWZpZXIocmVmbmFtZSkp OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKIAkJCQlBc3NlcnQocnRlLT5ydGVraW5kID09IFJU RV9SRUxBVElPTik7CiAJCQkJLyogVGhpcyBsb2dpYyBzaG91bGQgYWdyZWUgd2l0aCBleHBsYWlu LmMncyBFeHBsYWluVGFyZ2V0UmVsICovCiAJCQkJcmVsbmFtZSA9IGdldF9yZWxfbmFtZShydGUt PnJlbGlkKTsKQEAgLTM0NzksOCArMzYyMywxNyBAQCBlc3RpbWF0ZV9wYXRoX2Nvc3Rfc2l6ZShQ bGFubmVySW5mbyAqcm9vdCwKIAkJCS8qIEZvciBqb2luIHdlIGV4cGVjdCBpbm5lciBhbmQgb3V0 ZXIgcmVsYXRpb25zIHNldCAqLwogCQkJQXNzZXJ0KGZwaW5mby0+aW5uZXJyZWwgJiYgZnBpbmZv LT5vdXRlcnJlbCk7CiAKLQkJCWZwaW5mb19pID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGZwaW5m by0+aW5uZXJyZWwtPmZkd19wcml2YXRlOwotCQkJZnBpbmZvX28gPSAoUGdGZHdSZWxhdGlvbklu Zm8gKikgZnBpbmZvLT5vdXRlcnJlbC0+ZmR3X3ByaXZhdGU7CisJCQkvKgorCQkJICogRm9yIGEg RlVOQ1RJT04gUlRFIGFic29yYmVkIGludG8gdGhlIGpvaW4sIHVzZSB0aGUgc3R1YiBmcGluZm8K KwkJCSAqIHdlIGJ1aWx0IGluIGZvcmVpZ25fam9pbl9vaygpLCBzaW5jZSB0aGUgZnVuY3Rpb24g cmVsIGl0c2VsZgorCQkJICogaGFzIG5vIGZkd19wcml2YXRlLgorCQkJICovCisJCQlmcGluZm9f aSA9IGZwaW5mby0+aW5uZXJfZnVuY19mcGluZm8gPworCQkJCWZwaW5mby0+aW5uZXJfZnVuY19m cGluZm8gOgorCQkJCShQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPmlubmVycmVsLT5mZHdf cHJpdmF0ZTsKKwkJCWZwaW5mb19vID0gZnBpbmZvLT5vdXRlcl9mdW5jX2ZwaW5mbyA/CisJCQkJ ZnBpbmZvLT5vdXRlcl9mdW5jX2ZwaW5mbyA6CisJCQkJKFBnRmR3UmVsYXRpb25JbmZvICopIGZw aW5mby0+b3V0ZXJyZWwtPmZkd19wcml2YXRlOwogCiAJCQkvKiBFc3RpbWF0ZSBvZiBudW1iZXIg b2Ygcm93cyBpbiBjcm9zcyBwcm9kdWN0ICovCiAJCQlucm93cyA9IGZwaW5mb19pLT5yb3dzICog ZnBpbmZvX28tPnJvd3M7CkBAIC02NjE5LDYgKzY3NzIsMTgxIEBAIHNlbWlqb2luX3RhcmdldF9v ayhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqam9pbnJlbCwgUmVsT3B0SW5mbyAqb3V0 ZXJyZWwsCiAJcmV0dXJuIG9rOwogfQogCisvKgorICogZ2V0X2Jhc2VfcmVsaWRzCisgKgkJUmV0 dXJuIHRoZSBzZXQgb2YgYmFzZSByZWxpZHMgcmVmZXJlbmNlZCBieSBhIGZvcmVpZ24gc2NhbiBy ZWwuCisgKgorICogRm9yIGFuIHVwcGVyIHJlbCB3ZSB1c2UgdGhlIGFsbC1xdWVyeSByZWxpZHMg bWludXMgdGhlIG91dGVyIGpvaW5zOworICogb3RoZXJ3aXNlIHRoZSByZWwncyBvd24gcmVsaWRz IG1pbnVzIHRoZSBvdXRlciBqb2lucy4gIFRoZSByZXN1bHQgbWF0Y2hlcworICogdGhlIHJlbGlk cyB0aGF0IGNyZWF0ZV9mb3JlaWduc2Nhbl9wbGFuKCkgdWx0aW1hdGVseSB1c2VzIGZvcgorICog Rm9yZWlnblNjYW4uZnNfYmFzZV9yZWxpZHMsIHNvIGl0IGlzIHN1aXRhYmxlIGZvciBhbnkgdGFn Z2luZyB3ZSB3YW50IHRvCisgKiBzdG9yZSB2aWEgcGxhbi1wcml2YXRlIHN0YXRlLgorICovCitz dGF0aWMgUmVsaWRzCitnZXRfYmFzZV9yZWxpZHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdElu Zm8gKnJlbCkKK3sKKwlSZWxpZHMJCXJlbGlkczsKKworCWlmIChyZWwtPnJlbG9wdGtpbmQgPT0g UkVMT1BUX1VQUEVSX1JFTCkKKwkJcmVsaWRzID0gcm9vdC0+YWxsX3F1ZXJ5X3JlbHM7CisJZWxz ZQorCQlyZWxpZHMgPSByZWwtPnJlbGlkczsKKworCXJldHVybiBibXNfZGlmZmVyZW5jZShyZWxp ZHMsIHJvb3QtPm91dGVyX2pvaW5fcmVscyk7Cit9CisKKy8qCisgKiBnZXRfbWluX2Jhc2VfcnRp CisgKgkJTG93ZXN0IGJhc2UgUlQgaW5kZXggaW4gdGhlIGZvcmVpZ24gc2NhbiByZWwuCisgKgor ICogQWZ0ZXIgc2V0cmVmcy5jIGZsYXR0ZW5zIHRoZSBydGFibGUsIHRoZSBzY2FuLWxvY2FsIGlu ZGV4ZXMgc2F2ZWQgaW4KKyAqIHBsYW4tcHJpdmF0ZSBkYXRhIGNhbiBiZSB0cmFuc2xhdGVkIHRv IGVzdGF0ZSBpbmRleGVzIGJ5IGFkZGluZworICogKEZvcmVpZ25TY2FuLmZzX2Jhc2VfcmVsaWRz IG1pbiAtIHRoaXMgdmFsdWUpLiAgQ2FwdHVyZWQgYXQgcGxhbiB0aW1lCisgKiBiZWNhdXNlIGNy ZWF0ZV9mb3JlaWduc2Nhbl9wbGFuKCkgY29tcHV0ZXMgdGhlIHNhbWUgdmFsdWUgaW50ZXJuYWxs eS4KKyAqLworc3RhdGljIGludAorZ2V0X21pbl9iYXNlX3J0aShQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsKQoreworCVJlbGlkcwkJcmVsaWRzID0gZ2V0X2Jhc2VfcmVsaWRzKHJv b3QsIHJlbCk7CisKKwlyZXR1cm4gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgLTEpOworfQorCisv KgorICogZ2V0X2Z1bmN0aW9uc19kYXRhCisgKgkJQnVpbGQgdGhlIHBlci1SVEUgZnVuY3Rpb24g bWV0YWRhdGEgbGlzdCBzYXZlZCBhcworICoJCUZkd1NjYW5Qcml2YXRlRnVuY3Rpb25zLgorICoK KyAqIFRoZSByZXN1bHQgbGlzdCBpcyBpbmRleGVkIGJ5IGJhc2UgUlQgaW5kZXggcmVsYXRpdmUg dG8gdGhlIGxvd2VzdCBiYXNlCisgKiBSVCBpbmRleCBvZiB0aGUgc2Nhbi4gIEVhY2ggZWxlbWVu dCBpcyBlaXRoZXIgTlVMTCAoZm9yIG5vbi1SVEVfRlVOQ1RJT04KKyAqIGJhc2UgcmVscyBpbiB0 aGlzIHNjYW4pIG9yIGEgTGlzdCBvZiBMaXN0IG9mIHRocmVlIEludGVnZXIgbm9kZXM6CisgKiAo ZnVuY2lkLCBmdW5jcmV0dHlwZSwgZnVuY2NvbGxhdGlvbikgLS0gb25lIGlubmVyIGxpc3QgcGVy IFJhbmdlVGJsRnVuY3Rpb24uCisgKgorICogT25seSBSVEVfRlVOQ1RJT04gcmVsaWRzIGFjdHVh bGx5IGFwcGVhcmluZyBpbiB0aGUgZm9yZWlnbiBzY2FuJ3MKKyAqIGZzX2Jhc2VfcmVsaWRzIGNv bnRyaWJ1dGU7IG90aGVycyBhcmUgcGxhY2Vob2xkZXJzIHNvIHRoYXQgdGhlIGNvbnN1bWVyCisg KiBjYW4gaW5kZXggaW50byB0aGUgcmVzdWx0IGJ5IFJUSSBvZmZzZXQuCisgKi8KK3N0YXRpYyBM aXN0ICoKK2dldF9mdW5jdGlvbnNfZGF0YShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAq cmVsKQoreworCUxpc3QJICAgKnJ0ZnVuY2RhdGEgPSBOSUw7CisJUmVsaWRzCQlmc2Nhbl9yZWxp ZHMgPSBnZXRfYmFzZV9yZWxpZHMocm9vdCwgcmVsKTsKKwlpbnQJCQlpOworCisJZm9yIChpID0g MDsgaSA8IHJvb3QtPnNpbXBsZV9yZWxfYXJyYXlfc2l6ZTsgaSsrKQorCXsKKwkJUmFuZ2VUYmxF bnRyeSAqcnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXTsKKwkJTGlzdAkgICAqZnVuY2Rh dGEgPSBOSUw7CisJCUxpc3RDZWxsICAgKmxjOworCisJCWlmIChydGUgPT0gTlVMTCB8fCBpID09 IDAgfHwKKwkJCSFibXNfaXNfbWVtYmVyKGksIGZzY2FuX3JlbGlkcykgfHwKKwkJCXJ0ZS0+cnRl a2luZCAhPSBSVEVfRlVOQ1RJT04pCisJCXsKKwkJCXJ0ZnVuY2RhdGEgPSBsYXBwZW5kKHJ0ZnVu Y2RhdGEsIE5VTEwpOworCQkJY29udGludWU7CisJCX0KKworCQlmb3JlYWNoKGxjLCBydGUtPmZ1 bmN0aW9ucykKKwkJeworCQkJUmFuZ2VUYmxGdW5jdGlvbiAqcnRmdW5jID0gKFJhbmdlVGJsRnVu Y3Rpb24gKikgbGZpcnN0KGxjKTsKKwkJCU9pZAkJCWZ1bmNyZXR0eXBlOworCQkJT2lkCQkJZnVu Y2NvbGxhdGlvbjsKKwkJCVR1cGxlRGVzYwl0dXBkZXNjOworCQkJT2lkCQkJZnVuY2lkID0gSW52 YWxpZE9pZDsKKworCQkJZ2V0X2V4cHJfcmVzdWx0X3R5cGUocnRmdW5jLT5mdW5jZXhwciwgJmZ1 bmNyZXR0eXBlLCAmdHVwZGVzYyk7CisKKwkJCWlmICghT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkg fHwgZnVuY3JldHR5cGUgPT0gUkVDT1JET0lEKQorCQkJCWVsb2coRVJST1IsCisJCQkJCSAiY291 bGQgbm90IGRldGVybWluZSByZXR1cm4gdHlwZSBmb3IgZnVuY3Rpb24gaW4gZm9yZWlnbiBzY2Fu Iik7CisKKwkJCWZ1bmNjb2xsYXRpb24gPSBleHByQ29sbGF0aW9uKHJ0ZnVuYy0+ZnVuY2V4cHIp OworCisJCQlpZiAoSXNBKHJ0ZnVuYy0+ZnVuY2V4cHIsIEZ1bmNFeHByKSkKKwkJCQlmdW5jaWQg PSAoKEZ1bmNFeHByICopIHJ0ZnVuYy0+ZnVuY2V4cHIpLT5mdW5jaWQ7CisKKwkJCWZ1bmNkYXRh ID0gbGFwcGVuZChmdW5jZGF0YSwKKwkJCQkJCQkgICBsaXN0X21ha2UzKG1ha2VJbnRlZ2VyKGZ1 bmNpZCksCisJCQkJCQkJCQkJICBtYWtlSW50ZWdlcihmdW5jcmV0dHlwZSksCisJCQkJCQkJCQkJ ICBtYWtlSW50ZWdlcihmdW5jY29sbGF0aW9uKSkpOworCQl9CisKKwkJcnRmdW5jZGF0YSA9IGxh cHBlbmQocnRmdW5jZGF0YSwgZnVuY2RhdGEpOworCX0KKworCXJldHVybiBydGZ1bmNkYXRhOwor fQorCisvKgorICogQ2hlY2sgaWYgYSByZWxhdGlvbiBpcyBhIEZVTkNUSU9OIFJURSB0aGF0IGNh biBiZSBhYnNvcmJlZCBpbnRvIGEgcmVtb3RlCisgKiBqb2luLiAgRXZlcnkgZnVuY3Rpb24gaW4g dGhlIFJURSBtdXN0CisgKgorICogICAtIHJldHVybiBhIHdlbGwtZGVmaW5lZCBzY2FsYXIgdHlw ZSAtLSB3ZSBkb24ndCBzaGlwIHJlY29yZHMvY29tcG9zaXRlCisgKiAgICAgc2luY2UgdGhlIHJl bW90ZSBzZXJ2ZXIgY2Fubm90IHJlY29uc3RydWN0IGEgY29sdW1uIGRlZmluaXRpb24gbGlzdAor ICogICAgIGFuZCBvdXIgZGVwYXJzZXIgZG9lcyBub3QgZW1pdCBvbmU7CisgKiAgIC0gaGF2ZSBh IHNoaXBwYWJsZSBleHByZXNzaW9uIHdpdGggbm8gbXV0YWJsZSBzdWJub2RlcyAtLSBpc19mb3Jl aWduX2V4cHIoKQorICogICAgIHJlamVjdHMgdm9sYXRpbGUvc3RhYmxlIGZ1bmN0aW9ucyB0aHJv dWdoIGNvbnRhaW5fbXV0YWJsZV9mdW5jdGlvbnMoKSwKKyAqICAgICBzbyB0aGUgSU1NVVRBQkxF LW9ubHkgcmVzdHJpY3Rpb24gaXMgaW1wbGljaXQ7CisgKiAgIC0gbm90IGNvbnRhaW4gU3ViUGxh bnMgLS0gd2UnZCBvdGhlcndpc2UgbmVlZCB0byBzaGlwIHN1Yi1yZXN1bHRzIHRvCisgKiAgICAg dGhlIHJlbW90ZSwgd2hpY2ggd2UgZG8gbm90IGltcGxlbWVudC4KKyAqCisgKiBXSVRIIE9SRElO QUxJVFkgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisgKi8KK3N0YXRpYyBib29sCitmdW5jdGlvbl9y dGVfcHVzaGRvd25fb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJ CSBSZWxPcHRJbmZvICpmZHdyZWwpCit7CisJUmFuZ2VUYmxFbnRyeSAqcnRlOworCUxpc3RDZWxs ICAgKmxjOworCisJaWYgKHJlbC0+cnRla2luZCAhPSBSVEVfRlVOQ1RJT04pCisJCXJldHVybiBm YWxzZTsKKwlydGUgPSBwbGFubmVyX3J0X2ZldGNoKHJlbC0+cmVsaWQsIHJvb3QpOworCWlmIChy dGUtPnJ0ZWtpbmQgIT0gUlRFX0ZVTkNUSU9OKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHJ0ZS0+ ZnVuY29yZGluYWxpdHkpCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogUmVqZWN0IHVwLWZy b250IGFueSBmdW5jdGlvbiBSVEUgdGhhdCBsYXRlcmFsLXJlZmVyZW5jZXMgYW5vdGhlcgorCSAq IHJlbGF0aW9uOiBmb3JlaWduLWpvaW4gcHVzaC1kb3duIHdvdWxkIG5lZWQgdG8gcGFyYW1ldGVy aXNlIHRoZSByZW1vdGUKKwkgKiBxdWVyeSBwZXIgb3V0ZXIgcm93LCB3aGljaCB3ZSBkb24ndCBz dXBwb3J0LCBhbmQgZXZlbiBjb25zaWRlcmluZyB0aGUKKwkgKiBwYXRoIGlzIGV4cGVuc2l2ZSBv biB0aGUgcGxhbm5lciBzaWRlLiAgVGhlIHN1cnJvdW5kaW5nIGxhdGVyYWxfcmVsaWRzCisJICog Y2hlY2sgaW4gcG9zdGdyZXNHZXRGb3JlaWduSm9pblBhdGhzKCkgd291bGQgbm9ybWFsbHkgYmFp bCBvdXQgZm9yIHRoZQorCSAqIGpvaW5yZWwsIGJ1dCBkb2luZyB0aGUgY2hlY2sgaGVyZSBhdm9p ZHMgd2Fsa2luZyB0aGUgZnVuY3Rpb24KKwkgKiBleHByZXNzaW9uIGVudGlyZWx5LgorCSAqLwor CWlmICghYm1zX2lzX2VtcHR5KHJlbC0+bGF0ZXJhbF9yZWxpZHMpKQorCQlyZXR1cm4gZmFsc2U7 CisKKwlBc3NlcnQobGlzdF9sZW5ndGgocnRlLT5mdW5jdGlvbnMpID49IDEpOworCisJZm9yZWFj aChsYywgcnRlLT5mdW5jdGlvbnMpCisJeworCQlSYW5nZVRibEZ1bmN0aW9uICpydGZ1bmMgPSAo UmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMpOworCQlUeXBlRnVuY0NsYXNzIGZ1bmN0eXBj bGFzczsKKwkJT2lkCQkJZnVuY3JldHR5cGU7CisJCVR1cGxlRGVzYwl0dXBkZXNjOworCisJCWZ1 bmN0eXBjbGFzcyA9IGdldF9leHByX3Jlc3VsdF90eXBlKHJ0ZnVuYy0+ZnVuY2V4cHIsCisJCQkJ CQkJCQkJCSZmdW5jcmV0dHlwZSwgJnR1cGRlc2MpOworCQlpZiAoZnVuY3R5cGNsYXNzICE9IFRZ UEVGVU5DX1NDQUxBUikKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFPaWRJc1ZhbGlkKGZ1bmNy ZXR0eXBlKSB8fAorCQkJZnVuY3JldHR5cGUgPT0gUkVDT1JET0lEIHx8CisJCQlmdW5jcmV0dHlw ZSA9PSBWT0lET0lEKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChjb250YWluX3N1YnBsYW5z KHJ0ZnVuYy0+ZnVuY2V4cHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoIWlzX2ZvcmVpZ25f ZXhwcihyb290LCBmZHdyZWwsIChFeHByICopIHJ0ZnVuYy0+ZnVuY2V4cHIpKQorCQkJcmV0dXJu IGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCiAvKgogICogQXNzZXNzIHdoZXRoZXIg dGhlIGpvaW4gYmV0d2VlbiBpbm5lciBhbmQgb3V0ZXIgcmVsYXRpb25zIGNhbiBiZSBwdXNoZWQg ZG93bgogICogdG8gdGhlIGZvcmVpZ24gc2VydmVyLiBBcyBhIHNpZGUgZWZmZWN0LCBzYXZlIGlu Zm9ybWF0aW9uIHdlIG9idGFpbiBpbiB0aGlzCkBAIC02NjM0LDYgKzY5NjIsOCBAQCBmb3JlaWdu X2pvaW5fb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsIEpvaW5UeXBl IGpvaW50eXBlLAogCVBnRmR3UmVsYXRpb25JbmZvICpmcGluZm9faTsKIAlMaXN0Q2VsbCAgICps YzsKIAlMaXN0CSAgICpqb2luY2xhdXNlczsKKwlib29sCQlvdXRlcl9pc19mdW5jdGlvbiA9IGZh bHNlOworCWJvb2wJCWlubmVyX2lzX2Z1bmN0aW9uID0gZmFsc2U7CiAKIAkvKgogCSAqIFdlIHN1 cHBvcnQgcHVzaGluZyBkb3duIElOTkVSLCBMRUZULCBSSUdIVCwgRlVMTCBPVVRFUiBhbmQgU0VN SSBqb2lucy4KQEAgLTY2NTIsMTUgKzY5ODIsNzAgQEAgZm9yZWlnbl9qb2luX29rKFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLCBKb2luVHlwZSBqb2ludHlwZSwKIAkJcmV0 dXJuIGZhbHNlOwogCiAJLyoKLQkgKiBJZiBlaXRoZXIgb2YgdGhlIGpvaW5pbmcgcmVsYXRpb25z IGlzIG1hcmtlZCBhcyB1bnNhZmUgdG8gcHVzaGRvd24sIHRoZQotCSAqIGpvaW4gY2FuIG5vdCBi ZSBwdXNoZWQgZG93bi4KKwkgKiBEZXRlY3QgbWl4ZWQgKGZvcmVpZ24geCBmdW5jdGlvbi1SVEUp IGNhc2VzLiAgT25seSBJTk5FUiBqb2lucyBhcmUKKwkgKiBzdXBwb3J0ZWQgaW5pdGlhbGx5LiAg V2UgZGlzcGF0Y2ggb24gcnRla2luZCBoZXJlIHNvIHRoYXQgdGhlIHNhbWUKKwkgKiBmdW5jdGlv biBSVEUgY2FuIGJlIGFic29yYmVkIGludG8gam9pbnMgb24gbXVsdGlwbGUgZm9yZWlnbiBzZXJ2 ZXJzCisJICogKGVhY2ggY2FsbCBnZXRzIGl0cyBvd24gc3R1YiBmcGluZm8gYW5kIHJlY2hlY2tz IHNoaXBwYWJpbGl0eSBmb3IgdGhlCisJICogc3BlY2lmaWMgc2VydmVyKS4KIAkgKi8KIAlmcGlu Zm8gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgam9pbnJlbC0+ZmR3X3ByaXZhdGU7Ci0JZnBpbmZv X28gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2YXRlOwotCWZwaW5m b19pID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGlubmVycmVsLT5mZHdfcHJpdmF0ZTsKLQlpZiAo IWZwaW5mb19vIHx8ICFmcGluZm9fby0+cHVzaGRvd25fc2FmZSB8fAotCQkhZnBpbmZvX2kgfHwg IWZwaW5mb19pLT5wdXNoZG93bl9zYWZlKQotCQlyZXR1cm4gZmFsc2U7CisJaWYgKGpvaW50eXBl ID09IEpPSU5fSU5ORVIgJiYgaW5uZXJyZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OICYmCisJ CShmcGluZm9fbyA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBvdXRlcnJlbC0+ZmR3X3ByaXZhdGUp ICYmCisJCWZwaW5mb19vLT5wdXNoZG93bl9zYWZlICYmCisJCWZ1bmN0aW9uX3J0ZV9wdXNoZG93 bl9vayhyb290LCBpbm5lcnJlbCwgb3V0ZXJyZWwpKQorCXsKKwkJaW5uZXJfaXNfZnVuY3Rpb24g PSB0cnVlOworCX0KKwllbHNlIGlmIChqb2ludHlwZSA9PSBKT0lOX0lOTkVSICYmIG91dGVycmVs LT5ydGVraW5kID09IFJURV9GVU5DVElPTiAmJgorCQkJIChmcGluZm9faSA9IChQZ0Zkd1JlbGF0 aW9uSW5mbyAqKSBpbm5lcnJlbC0+ZmR3X3ByaXZhdGUpICYmCisJCQkgZnBpbmZvX2ktPnB1c2hk b3duX3NhZmUgJiYKKwkJCSBmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2socm9vdCwgb3V0ZXJyZWws IGlubmVycmVsKSkKKwl7CisJCW91dGVyX2lzX2Z1bmN0aW9uID0gdHJ1ZTsKKwl9CisJZWxzZQor CXsKKwkJZnBpbmZvX28gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2 YXRlOworCQlmcGluZm9faSA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBpbm5lcnJlbC0+ZmR3X3By aXZhdGU7CisJCWlmICghZnBpbmZvX28gfHwgIWZwaW5mb19vLT5wdXNoZG93bl9zYWZlIHx8CisJ CQkhZnBpbmZvX2kgfHwgIWZwaW5mb19pLT5wdXNoZG93bl9zYWZlKQorCQkJcmV0dXJuIGZhbHNl OworCX0KKworCS8qCisJICogSWYgb25lIHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUsIGFsbG9jYXRl IGEgc3R1YiBmcGluZm8gc28gdGhlIHJlc3Qgb2YKKwkgKiB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUg Y29zdCBlc3RpbWF0b3IgY2FuIHRyZWF0IGl0IHVuaWZvcm1seS4gIFdlIGhhbmQKKwkgKiB0aGUg c3R1YiB0byB0aGUgam9pbnJlbCdzIGRlcGFyc2VyIHZpYSB0aGUgc2FtZSBwYXRoIHRoZSBmb3Jl aWduIHNpZGUKKwkgKiB1c2VzLCBidXQgd2UgbmV2ZXIgcGVybWFuZW50bHkgYXR0YWNoIGl0IHRv IHRoZSBmdW5jdGlvbiByZWwncworCSAqIGZkd19wcml2YXRlIChkaWZmZXJlbnQgam9pbnJlbHMg bWF5IHBhaXIgdGhlIHNhbWUgZnVuY3Rpb24gUlRFIHdpdGgKKwkgKiBkaWZmZXJlbnQgZm9yZWln biBzZXJ2ZXJzKS4KKwkgKi8KKwlpZiAoaW5uZXJfaXNfZnVuY3Rpb24pCisJeworCQlmcGluZm9f aSA9IHBhbGxvYzBfb2JqZWN0KFBnRmR3UmVsYXRpb25JbmZvKTsKKwkJZnBpbmZvX2ktPnB1c2hk b3duX3NhZmUgPSB0cnVlOworCQlmcGluZm9faS0+c2VydmVyID0gZnBpbmZvX28tPnNlcnZlcjsK KwkJZnBpbmZvX2ktPnJlbGF0aW9uX25hbWUgPSBwc3ByaW50ZigiJXUiLCBpbm5lcnJlbC0+cmVs aWQpOworCQlmcGluZm9faS0+cm93cyA9IGlubmVycmVsLT5yb3dzOworCQlmcGluZm9faS0+d2lk dGggPSBpbm5lcnJlbC0+cmVsdGFyZ2V0LT53aWR0aDsKKwkJZnBpbmZvX2ktPnJldHJpZXZlZF9y b3dzID0gaW5uZXJyZWwtPnJvd3M7CisJCWZwaW5mb19pLT5yZWxfc3RhcnR1cF9jb3N0ID0gMDsK KwkJZnBpbmZvX2ktPnJlbF90b3RhbF9jb3N0ID0gMDsKKwkJZnBpbmZvLT5pbm5lcl9mdW5jX2Zw aW5mbyA9IGZwaW5mb19pOworCX0KKwllbHNlIGlmIChvdXRlcl9pc19mdW5jdGlvbikKKwl7CisJ CWZwaW5mb19vID0gcGFsbG9jMF9vYmplY3QoUGdGZHdSZWxhdGlvbkluZm8pOworCQlmcGluZm9f by0+cHVzaGRvd25fc2FmZSA9IHRydWU7CisJCWZwaW5mb19vLT5zZXJ2ZXIgPSBmcGluZm9faS0+ c2VydmVyOworCQlmcGluZm9fby0+cmVsYXRpb25fbmFtZSA9IHBzcHJpbnRmKCIldSIsIG91dGVy cmVsLT5yZWxpZCk7CisJCWZwaW5mb19vLT5yb3dzID0gb3V0ZXJyZWwtPnJvd3M7CisJCWZwaW5m b19vLT53aWR0aCA9IG91dGVycmVsLT5yZWx0YXJnZXQtPndpZHRoOworCQlmcGluZm9fby0+cmV0 cmlldmVkX3Jvd3MgPSBvdXRlcnJlbC0+cm93czsKKwkJZnBpbmZvX28tPnJlbF9zdGFydHVwX2Nv c3QgPSAwOworCQlmcGluZm9fby0+cmVsX3RvdGFsX2Nvc3QgPSAwOworCQlmcGluZm8tPm91dGVy X2Z1bmNfZnBpbmZvID0gZnBpbmZvX287CisJfQogCiAJLyoKIAkgKiBJZiBqb2luaW5nIHJlbGF0 aW9ucyBoYXZlIGxvY2FsIGNvbmRpdGlvbnMsIHRob3NlIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1n aXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCBiL2NvbnRyaWIvcG9zdGdy ZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCmluZGV4IGEyYmIxZmYzNTJjLi41YjJmZmNmMDZmNyAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKKysrIGIvY29udHJp Yi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgKQEAgLTEwNiw2ICsxMDYsMTYgQEAgdHlwZWRl ZiBzdHJ1Y3QgUGdGZHdSZWxhdGlvbkluZm8KIAkvKiBqb2luY2xhdXNlcyBjb250YWlucyBvbmx5 IEpPSU4vT04gY29uZGl0aW9ucyBmb3IgYW4gb3V0ZXIgam9pbiAqLwogCUxpc3QJICAgKmpvaW5j bGF1c2VzOwkvKiBMaXN0IG9mIFJlc3RyaWN0SW5mbyAqLwogCisJLyoKKwkgKiBJZiBhIEZVTkNU SU9OIFJURSB3YXMgYWJzb3JiZWQgaW50byB0aGlzIGpvaW4sIHRoZXNlIHBvaW50IGF0IHRoZSBz dHViCisJICogUGdGZHdSZWxhdGlvbkluZm8gZm9yIHRoZSBmdW5jdGlvbiBzaWRlIChwYWlyZWQg d2l0aCB0aGUKKwkgKiBvdXRlcnJlbC9pbm5lcnJlbCksIHNvIHRoZSBjb3N0IGVzdGltYXRvciBh bmQgZGVwYXJzZXIgY2FuIGZpbmQgaXQKKwkgKiB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGZ1bmN0 aW9uIHJlbCdzIGZkd19wcml2YXRlLiAgQXQgbW9zdCBvbmUgb2YKKwkgKiBvdXRlcl9mdW5jX2Zw aW5mby9pbm5lcl9mdW5jX2ZwaW5mbyBpcyBzZXQuCisJICovCisJc3RydWN0IFBnRmR3UmVsYXRp b25JbmZvICpvdXRlcl9mdW5jX2ZwaW5mbzsKKwlzdHJ1Y3QgUGdGZHdSZWxhdGlvbkluZm8gKmlu bmVyX2Z1bmNfZnBpbmZvOworCiAJLyogVXBwZXIgcmVsYXRpb24gaW5mb3JtYXRpb24gKi8KIAlV cHBlclJlbGF0aW9uS2luZCBzdGFnZTsKIApkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdy ZXNfZmR3LnNxbAppbmRleCAyNjdkM2MxYTdlNy4uZmJiMGMzZjI3ODUgMTAwNjQ0Ci0tLSBhL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCisrKyBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCkBAIC03OTAsNiArNzkwLDE2OCBAQCBTRUxF Q1QgdDEuYzEsIHQyLmMyIEZST00gdjQgdDEgTEVGVCBKT0lOIGZ0NSB0MiBPTiAodDEuYzEgPSB0 Mi5jMSkgT1JERVIgQlkgdDEuYwogU0VMRUNUIHQxLmMxLCB0Mi5jMiBGUk9NIHY0IHQxIExFRlQg Sk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQxLmMxLCB0Mi5jMSBPRkZT RVQgMTAgTElNSVQgMTA7CiBBTFRFUiBWSUVXIHY0IE9XTkVSIFRPIHJlZ3Jlc3Nfdmlld19vd25l cjsKIAorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PQorLS0gRm9yZWlnbi1qb2luIHdpdGggRlVOQ1RJT04gUlRFIHB1 c2hkb3duIChJTU1VVEFCTEUgZnVuY3Rpb25zIG9ubHkpCistLSA9PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLSBJTU1V VEFCTEUgZnVuY3Rpb246IHVubmVzdCBvZiBjb25zdGFudCBhcnJheSBjYW4gYmUgcHVzaGVkIGRv d24KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDEuYzMgRlJP TSBmdDEgdDEsIHVubmVzdChBUlJBWVsxLCA1LCAxMCwgMTAwXTo6aW50W10pIEFTIHUoaWQpCitX SEVSRSB0MS5jMSA9IHUuaWQgT1JERVIgQlkgdDEuYzE7CitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZS T00gZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQor V0hFUkUgdDEuYzEgPSB1LmlkIE9SREVSIEJZIHQxLmMxOworCistLSBJTU1VVEFCTEUgZnVuY3Rp b246IGdlbmVyYXRlX3NlcmllcyB3aXRoIGNvbnN0YW50IGFyZ3MKK0VYUExBSU4gKFZFUkJPU0Us IENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSBGUk9NIGZ0MSB0MSwgZ2VuZXJhdGVfc2VyaWVzKDEs IDQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQgT1JERVIgQlkgdDEuYzE7CitTRUxFQ1Qg dDEuYzEgRlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hFUkUg dDEuYzEgPSBnLmlkIE9SREVSIEJZIHQxLmMxOworCistLSBWT0xBVElMRSBmdW5jdGlvbiAocmFu ZG9tKSBtdXN0IE5PVCBiZSBwdXNoZWQgZG93bgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZG KQorU0VMRUNUIHQxLmMxIEZST00gZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5k b20oKSAqIDApOjppbnQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQ7CisKKy0tIFdJVEgg T1JESU5BTElUWSBtdXN0IE5PVCBiZSBwdXNoZWQgZG93biAobGltaXRhdGlvbiBvZiB0aGlzIGlt cGxlbWVudGF0aW9uKQorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMx LCB1Lm9yZAorRlJPTSBmdDEgdDEsIHVubmVzdChBUlJBWVsxLCA1LCAxMF06OmludFtdKSBXSVRI IE9SRElOQUxJVFkgQVMgdShpZCwgb3JkKQorV0hFUkUgdDEuYzEgPSB1LmlkOworCistLSBTYW1l IGZ1bmN0aW9uIFJURSBqb2luZWQgd2l0aCB0d28gZGlmZmVyZW50IGZvcmVpZ24gc2VydmVyczog cGxhbm5lciBwaWNrcworLS0gb25lIGFic29ycHRpb24gKyBhIGxvY2FsIGpvaW4gd2l0aCB0aGUg c2Vjb25kIGZvcmVpZ24gc2VydmVyLiAgVGhlIGZhY3QKKy0tIHRoYXQgdGhlIGZ1bmN0aW9uIGlz IElNTVVUQUJMRSBtYWtlcyB0aGlzIHNhZmUgZXZlbiBpZiBib3RoIHNpZGVzIGNob3NlIHRvCist LSBhYnNvcmIgaXQgaW5kZXBlbmRlbnRseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBmdDYgdDIsIHVubmVzdChBUlJBWVsx LCA1LCAxMCwgMTAwXTo6aW50W10pIEFTIHUoaWQpCitXSEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQy LmMxID0gdS5pZCBPUkRFUiBCWSB0MS5jMTsKKworLS0gQ29zdC1iYXNlZCBzZWxlY3Rpb24gYmV0 d2VlbiB0d28gZm9yZWlnbiBzZXJ2ZXJzOiBmdDEgKCJTIDEiLiJUIDEiKSBoYXMKKy0tIDEwMDAg cm93cywgZnQ2ICgiUyAxIi4iVCA0IikgaGFzIH4zMyByb3dzLiAgVGhlIHNhbWUgcXVlcnkgc2hh cGUgZ2V0cyBhCistLSBkaWZmZXJlbnQgcHVzaC1kb3duIHRhcmdldCBkZXBlbmRpbmcgb24gYSBw cmVkaWNhdGUgdGhhdCBjaGFuZ2VzIHRoZQorLS0gZWZmZWN0aXZlIGNhcmRpbmFsaXR5IG9mIG9u ZSBzaWRlIC0tIHRoZSBmdW5jdGlvbiAianVtcHMiIHRvIHdoaWNoZXZlcgorLS0gZm9yZWlnbiBz Y2FuIGJlbmVmaXRzIG1vcmUgZnJvbSBiZWluZyBwcmUtZmlsdGVyZWQuCitBTkFMWVpFIGZ0MTsK K0FOQUxZWkUgZnQ2OworLS0gTm8gZXh0cmEgcHJlZGljYXRlOiBmdDEgaXMgdGhlIGJpZ2dlciBz aWRlLCBmdW5jdGlvbiBhYnNvcmJlZCB0aGVyZS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9G RikKK1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBmdDYgdDIsIHVubmVzdChBUlJB WVszLCA2LCA5LCAxMiwgMTUsIDE4XTo6aW50W10pIEFTIHUoaWQpCitXSEVSRSB0MS5jMSA9IHUu aWQgQU5EIHQyLmMxID0gdS5pZDsKKy0tIFNlbGVjdGl2ZSBwcmVkaWNhdGUgb24gZnQxLmMzIChu b3QgaW4gdGhlIGVxY2xhc3MpIHNocmlua3MgZnQxIHRvIGEKKy0tIGhhbmRmdWwgb2YgcmVtb3Rl IHJvd3M7IG5vdyBmdDYgaXMgZWZmZWN0aXZlbHkgdGhlIGJpZ2dlciBzaWRlIGFuZCB0aGUKKy0t IGZ1bmN0aW9uIGlzIGFic29yYmVkIGludG8gZnQ2IGluc3RlYWQuCitFWFBMQUlOIChWRVJCT1NF LCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1 bm5lc3QoQVJSQVlbMywgNiwgOSwgMTIsIDE1LCAxOF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUg dDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgQU5EIHQxLmMzIDwgJzAwMDEwJzsKKworLS0g VGhlIHJlbWFpbmluZyBzY2VuYXJpb3MgbWlycm9yIHRoZSByZXByb2R1Y2VycyBmcm9tIFB5aGFs b3YncworLS0gdjQtcGF0Y2ggcmV2aWV3IChwb3N0Z3IuZXMvbS83ZTJhYmViM2VhOWJjN2NhMDI0 ZjRlNDU3ZGNlMzNmNSU0MHBvc3RncmVzcHJvLnJ1KSwKKy0tIHNvIHRoZSBzYW1lIGRlZGljYXRl ZCBmb3JlaWduIHRhYmxlIGlzIHJldXNlZCBmb3IgZWFjaC4KK0NSRUFURSBUQUJMRSBiYXNlX3Ri bF9weWggKGEgaW50LCBiIGludCk7CitJTlNFUlQgSU5UTyBiYXNlX3RibF9weWgKKyAgU0VMRUNU IGcsIGcgKyAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzApIGc7CitDUkVBVEUgRk9SRUlH TiBUQUJMRSByZW1vdGVfdGJsIChhIGludCwgYiBpbnQpCisgIFNFUlZFUiBsb29wYmFjayBPUFRJ T05TICh0YWJsZV9uYW1lICdiYXNlX3RibF9weWgnKTsKKworLS0gUHloYWxvdiAjMzogZnVuY3Rp b24gUlRFIGFwcGVhcnMgZmlyc3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRpb24KKy0tIGlz IGZvdW5kIGJ5IHNjYW5uaW5nIGZzX2Jhc2VfcmVsaWRzIGZvciBhbiBSVEVfUkVMQVRJT04gcmF0 aGVyIHRoYW4KKy0tIHVzaW5nIHNjYW4tPmZzX3JlbGlkIGJsaW5kbHkuCitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0XSkgbiwg cmVtb3RlX3RibCByIFdIRVJFIHIuYSA9IG47CitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsy LCAzLCA0XSkgbiwgcmVtb3RlX3RibCByCitXSEVSRSByLmEgPSBuIE9SREVSIEJZIHIuYTsKKwor LS0gUHloYWxvdiAjMjogZnVuY3Rpb24gcmV0dXJuaW5nIHJlY29yZCAoY29tcG9zaXRlKSBpcyBm b3JiaWRkZW47CistLSBwdXNoaW5nIGl0IHdvdWxkIHlpZWxkIGEgcmVtb3RlICJjb2x1bW4gZGVm aW5pdGlvbiBsaXN0IGlzIHJlcXVpcmVkIgorLS0gZXJyb3IuICBmdW5jdGlvbl9ydGVfcHVzaGRv d25fb2soKSByZWplY3RzIGl0IHZpYSBUWVBFRlVOQ19TQ0FMQVIuCitDUkVBVEUgT1IgUkVQTEFD RSBGVU5DVElPTiBmX3JldF9yZWNvcmQoKSBSRVRVUk5TIHJlY29yZCBBUyAkJAorICBTRUxFQ1Qg KDEsIDIpOjpyZWNvcmQKKyQkIExBTkdVQUdFIFNRTCBJTU1VVEFCTEU7CitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgcyBGUk9NIHJlbW90ZV90YmwgcnQsIGZfcmV0X3JlY29y ZCgpIEFTIHMoYSBpbnQsIGIgaW50KQorV0hFUkUgcy5hID0gcnQuYTsKK0RST1AgRlVOQ1RJT04g Zl9yZXRfcmVjb3JkKCk7CisKKy0tIFB5aGFsb3YgIzE6IFVQREFURSAuLi4gRlJPTSB1bm5lc3Qo KSB3aXRoIGEgY29tcGxleCBlbGVtZW50IHR5cGU7CistLSBhcmVhKGJveCkgeWllbGRzIHRoZSB2 YWx1ZSB0byBtYXRjaC4gIFRoZSBsb2NraW5nIG1hY2hpbmVyeSBmb3IgdGhlCistLSBub24tcmVs YXRpb24gUlRFIGdlbmVyYXRlcyBhIHdob2xlLXJvdyBWYXIgdGhhdCBkZXBhcnNlQ29sdW1uUmVm CistLSBub3cgZW1pdHMgYXMgUk9XKGY8cnRpPi5jMSwgLi4uKS4KK1VQREFURSByZW1vdGVfdGJs IHIgU0VUIGIgPSA5OTkKK0ZST00gdW5uZXN0KGFycmF5W2JveCAnKCgyLDMpLCgtMiwtMykpJ10p IEFTIHQoYngpCitXSEVSRSByLmEgPSBhcmVhKHQuYngpOworU0VMRUNUICogRlJPTSByZW1vdGVf dGJsIFdIRVJFIGEgSU4gKDIzLCAyNCwgMjUpIE9SREVSIEJZIGE7CisKKy0tIFB5aGFsb3YgIzQ6 IHNhbWUgc2hhcGUgd2l0aCBDQVNFIGFuZCBSRVRVUk5JTkcuICBFeGVyY2lzZXMgdGhlCistLSBE aXJlY3RNb2RpZnkgcGF0aCBhbmQgdGhlIGV4ZWN1dG9yJ3MgdHVwbGUtZGVzYyByZWNvbnN0cnVj dGlvbi4KK1VQREFURSByZW1vdGVfdGJsIHIKKyAgIFNFVCBiID0gQ0FTRSBXSEVOIHJhbmRvbSgp ID49IDAgVEhFTiA1IEVMU0UgMCBFTkQKKyAgRlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyks KC0yLC0zKSknXSkgQVMgdChieCkKKyBXSEVSRSByLmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBh LCBiOworCistLSBQeWhhbG92ICM1OiBST1dTIEZST00gKC4uLikgd2l0aCBzZXZlcmFsIGZ1bmN0 aW9ucy4gIFdlIGZvcmNlCistLSBwdXNoZG93biBiZWNhdXNlIHRoZSBjb3N0IG1vZGVsIG90aGVy d2lzZSBwaWNrcyBhIGxvY2FsIHBsYW4uCitTRVQgZW5hYmxlX2hhc2hqb2luID0gb2ZmOworU0VU IGVuYWJsZV9tZXJnZWpvaW4gPSBvZmY7CitTRVQgZW5hYmxlX25lc3Rsb29wID0gb2ZmOworRVhQ TEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSBy ZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwg cykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworU0VMRUNUIHIuYSwgdC5uLCB0LnMK KyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykp IEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworCistLSBXaG9sZS1y b3cgVmFyIG9uIHRoZSBhYnNvcmJlZCBmdW5jdGlvbiBzaWRlIChlLmcuIHZpYSBhIGNhc3QgdG8K Ky0tIHRleHQpLiAgRXhlcmNpc2VzIGJvdGggZGVwYXJzZUNvbHVtblJlZiB3aG9sZS1yb3cgYnJh bmNoIGFuZCB0aGUKKy0tIGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKCkgUlRFX0ZV TkNUSU9OIG1ldGFkYXRhIHBhdGguCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxF Q1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChh cnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRl X3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIu YTsKK1NFTEVDVCB0Ojp0ZXh0LCByLmEKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAo dW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JE RVIgQlkgci5hOworUkVTRVQgZW5hYmxlX2hhc2hqb2luOworUkVTRVQgZW5hYmxlX21lcmdlam9p bjsKK1JFU0VUIGVuYWJsZV9uZXN0bG9vcDsKKworLS0gVm9sYXRpbGUgZnVuY3Rpb24gaW4gUk9X UyBGUk9NIGRpc3F1YWxpZmllcyB0aGUgd2hvbGUgUlRFLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09T VFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgciwKKyAgICAgICAgICAgICAgICBS T1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAg ICAgICBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpKSBBUyB0KG4s IHMpCisgV0hFUkUgci5hID0gdC5uOworCistLSBMQVRFUkFMIGZ1bmN0aW9uIHJlZmVyZW5jaW5n IGEgZm9yZWlnbiBWYXI6IHBvc3RncmVzX2ZkdydzCistLSBmb3JlaWduLWpvaW4gcHVzaGRvd24g cmVqZWN0cyB0aGlzIHZpYSB0aGUgam9pbnJlbC0+bGF0ZXJhbF9yZWxpZHMKKy0tIGNoZWNrOyB0 aGUgcGxhbiBpcyB0aGVyZWZvcmUgYSBsb2NhbCBOZXN0TG9vcCArIEZ1bmN0aW9uU2Nhbi4KK0VY UExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEsIHQueCBGUk9NIHJlbW90ZV90 YmwgciwgTEFURVJBTCB1bm5lc3QoYXJyYXlbci5hXSkgQVMgdCh4KQorV0hFUkUgci5hIDw9IDMg T1JERVIgQlkgci5hOworCistLSBPdXRlciBqb2lucyB3aXRoIHRoZSBmdW5jdGlvbiBSVEUgYXJl IG5vdCBwdXNoZWQgZG93biAob25seSBJTk5FUgorLS0gam9pbnMgYXJlIHN1cHBvcnRlZCBieSBm dW5jdGlvbl9ydGVfcHVzaGRvd25fb2soKSkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYp CitTRUxFQ1Qgci5hLCB0Lm4gRlJPTSByZW1vdGVfdGJsIHIKKyAgICAgTEVGVCBKT0lOIHVubmVz dChhcnJheVsxLCAyLCAzXSkgQVMgdChuKSBPTiByLmEgPSB0Lm4KKyBXSEVSRSByLmEgPD0gNSBP UkRFUiBCWSByLmE7CisKKy0tIFNFTUkgam9pbiAoRVhJU1RTKSB3aXRoIGEgZnVuY3Rpb24gUlRF IGlzIGFsc28gbm90IHB1c2hlZCBkb3duLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQor U0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgcgorIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEgRlJP TSB1bm5lc3QoYXJyYXlbMywgNiwgOV0pIEFTIHQobikgV0hFUkUgdC5uID0gci5hKQorIE9SREVS IEJZIHIuYTsKKworRFJPUCBGT1JFSUdOIFRBQkxFIHJlbW90ZV90Ymw7CitEUk9QIFRBQkxFIGJh c2VfdGJsX3B5aDsKKwogLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIENoZWNrIHRoYXQgdXNlcmlkIHRvIHVz ZSB3aGVuIHF1ZXJ5aW5nIHRoZSByZW1vdGUgdGFibGUgaXMgY29ycmVjdGx5CiAtLSBwcm9wYWdh dGVkIGludG8gZm9yZWlnbiByZWxzIHByZXNlbnQgaW4gc3VicXVlcmllcyB1bmRlciBhbiBVTklP TiBBTEwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYyBi L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYwppbmRleCAzZmMyYzJmNzFkMC4u ZjIxYWUxYmFlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5v ZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMKQEAgLTc0Niw2 ICs3NDYsMzAgQEAgc2V0X2ZvcmVpZ25fcmVsX3Byb3BlcnRpZXMoUmVsT3B0SW5mbyAqam9pbnJl bCwgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJam9pbnJlbC0+ZmR3cm91dGluZSA9IG91dGVy X3JlbC0+ZmR3cm91dGluZTsKIAkJfQogCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKG91dGVyX3Jl bC0+c2VydmVyaWQpICYmCisJCQkgaW5uZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTikK Kwl7CisJCS8qCisJCSAqIE9uZSBzaWRlIGlzIGEgZm9yZWlnbiByZWxhdGlvbiwgdGhlIG90aGVy IHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUuCisJCSAqIElmIHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFC TEUsIHRoZSBGRFcgY2FuIGFic29yYiB0aGUgZnVuY3Rpb24gY2FsbAorCQkgKiBpbnRvIHRoZSBy ZW1vdGUgcXVlcnkgKHRoZSByZXN1bHQgaXMgaWRlbnRpY2FsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gK KwkJICogc2VydmVyIGV2YWx1YXRlcyBpdCkuICBMZXQgdGhlIEZEVyBkZWNpZGUgd2hldGhlciB0 aGUgam9pbiBpcworCQkgKiBhY3R1YWxseSBzaGlwcGFibGU7IGhlcmUgd2UganVzdCBwcm9wYWdh dGUgdGhlIEZEVyByb3V0aW5lIHNvIHRoZQorCQkgKiBGRFcgZ2V0cyBhIGNoYW5jZS4KKwkJICov CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gb3V0ZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJlbC0+ dXNlcmlkID0gb3V0ZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVudCA9 IG91dGVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0gb3V0 ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKGlubmVyX3JlbC0+ c2VydmVyaWQpICYmCisJCQkgb3V0ZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTikKKwl7 CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gaW5uZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJlbC0+ dXNlcmlkID0gaW5uZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVudCA9 IGlubmVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0gaW5u ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KIH0KIAogLyoKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1 NCkKCg== --000000000000c1608b0652151bc0--