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 1w8Cga-000Iwl-0I for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Apr 2026 07:41:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w8CgY-004SEg-2l for pgsql-hackers@arkaria.postgresql.org; Thu, 02 Apr 2026 07:41:51 +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 1w8CgY-004SEX-0a for pgsql-hackers@lists.postgresql.org; Thu, 02 Apr 2026 07:41:50 +0000 Received: from mail-pj1-x1029.google.com ([2607:f8b0:4864:20::1029]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w8CgW-000000009CF-0dkb for pgsql-hackers@postgresql.org; Thu, 02 Apr 2026 07:41:49 +0000 Received: by mail-pj1-x1029.google.com with SMTP id 98e67ed59e1d1-35c124d2613so293842a91.2 for ; Thu, 02 Apr 2026 00:41:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775115707; cv=none; d=google.com; s=arc-20240605; b=DWGoqb2Zu43VaS5rYnwY2ZhS8l9GvKrYHnuALpT/cEG2vP1u2jyb8aHr0MfTiXNDZo zEh6NbUUK4TBYwftC3nNggBpqxDfRMzO3nIkIN1xS36FKx8SwElKQpt5dyaR7hGyUtZW qV2y3TiUnNEcbj9xsOfKQzK3DZvVz+Cd5JMEvuSh2bnfxtkvjEK5lt17cS3w7iTe3kQh 6EQ3Clc8riI0N/4fZUKaCexO7B2kMeyNtGckqntKRVEtxkCizAxYyDS6eGvqxZMEm8T/ 3A1F4qeZ1kMk28D/YPPLm0ON/j9ZSYpT0OJEAbPNpZX8AGcuJOgPZFg7jHKS6Cs1Z4r3 dMvQ== 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=937C0iwp1Sw5YcPFCWKhIuzUabel1WaJ+MLnck52fBY=; fh=rEgjuhV0CcdzzMytaPYvHNPcKh47LSelg7T/dTkKQvw=; b=jNsodcyCVLG+IFGzaltawWwsHhZqAVHCfhI+eHl8UJnW+Lx9e7SqSAUFTVNuORo0VR UeS+xDmsc+ZdgOcIMC6m0wRQt6Zs6GT+yfVH0QolKMM5J6JAaxxRod1T+En97Fo3Yv7H WmtZ2KVK2yLOaHDCr9XKYojoRzBhDfOYMysrg9VfZAd7IWkTuIIPcaJrQBvmr0lcGrIZ e+Mr2O2ZrMnjq29RD4/S9FIGP32uYW3po4ZNLQ9XUGS80lDIQwo0plUy9DeWNLb0x5jD 1rUOEgu8nV8O9npJLFCztQIAS4Ft4jGuBRqEvXgftFKNjphHz2uDjA3P2Gq9izjjCW2R O7SQ==; darn=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=1775115707; x=1775720507; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=937C0iwp1Sw5YcPFCWKhIuzUabel1WaJ+MLnck52fBY=; b=QI8fzGze0ub0+WCNUH+gWwtCwwBE1wRa3W1Y4e280eLGxA7JSctfgHyL1OEhkKzpxz xcWPECNXlC6W9rqBNyC9DjeShyRMzfxoPOrGe/hhESlV4Eh9G/gquesbGlve0t4aN78K HtMWJUFCUKmOMNUrpM/Bwx3GuEW0hXhiZsU2MH4socNlaWtuCQQpIR7exgMBU+QriFEp i2xnJv7B6qTTsnarb1ScBFT5I/bsTB2o442tq4LhF0qD1FvXGI86ABwJRGUDahtf5UBZ xucCZjMzvO8MX3K8rb+D1G76h/c9wliv1X96I394xuQzlN7AxgD+dJDA75F3FWVLpWsY hh+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775115707; x=1775720507; 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=937C0iwp1Sw5YcPFCWKhIuzUabel1WaJ+MLnck52fBY=; b=hQZFKrnzqBMVMauIE2ulF3VzgHpd16QCjM+ZqdkXIPDUe/9CR+YRED0aZm2U4/89EX X9J3JM8oKkUEYvdF3yoIBV3AhxwHOhIsNEZffN32Bov99+n8d52xrmmcF7OBn17xKsp7 CBPpOJWpYvbnbX82+CfVNDDjGcPzQkApBr7ZdcJKtqCdekR+pdAfyaSUlZleriRMND4V lMSTAYaCiT1hvQfe4+Dbck75TSb55szKcA0Bp7j5vRilCtI8rUpfjcu32okc6QnvjFUB Q5/bWlHia9vmuU5KWdZDqszSXrhn4oilpFGkuch4SqITOJYsVt40Kntp4BF+UsPMZNEh Ezcg== X-Forwarded-Encrypted: i=1; AJvYcCU/uv8QyMHcEEOENOHMFsOxeVdUPTnSe5sk10ZUHzBDtlrGJjtmVioClfpGnc6Phln1dSPyip76W2LRyRAW@postgresql.org X-Gm-Message-State: AOJu0YyTe8JUhubZzlErCQJGiJcAOlIC9JbAYBLrUpZd8bN+dHqhaLJC 63XJlvjAvFsrt9hj15Z1706+tNZMv2VAnW+yzhE+jYG3N7/Z52c1w0dT/mG2aw9I7TaL2BoywwG EUb6SY/C2JogyZR9F6EVFXrrmjKe65e0P9ZMz X-Gm-Gg: ATEYQzwKYdCfq3jY3aXaMinWiY7v3jAtmdNgkZhDdm2Gqcz2+Vc09MCAed0b4hVpYXm X4GXLSVmOfEDxUXQJawfcxji/DjcvwpBzqGWVDLuaenxz9+cZPbhEmdVXCHNefO7BcwyinR6ihB G+gp0OwQZeJk4Fz40Jvh3hHBVLIAfcAw+bnlmhtok+sYMWGu5cOp/9o1uQk3iggLMgZd0YFgp+q GXluXsAFleTRM1I5cKP/zMLnBsC/ZKFNNqSfesW2KZrYDKhijqnzw/uh4R9U26NF3so2iBCBWVE ynHUZPFc X-Received: by 2002:a05:6a20:918c:b0:398:dde7:2dcd with SMTP id adf61e73a8af0-39ef73e46e4mr7410317637.21.1775115707237; Thu, 02 Apr 2026 00:41:47 -0700 (PDT) MIME-Version: 1.0 References: <2BE661BA-D909-4093-BF78-DB9B0C099337@gmail.com> <77FA04FE-1F84-4DA1-8855-8BBFD8CC889A@gmail.com> In-Reply-To: From: Amit Langote Date: Thu, 2 Apr 2026 16:41:30 +0900 X-Gm-Features: AQROBzDCkllAhESisMupfHlHmuoBViuCULUAA-aH0t7XpiC4BdsJVFr_aKmx34Q Message-ID: Subject: Re: Eliminating SPI / SQL from some RI triggers - take 3 To: Junwang Zhao Cc: Chao Li , Haibo Yan , Pavel Stehule , PostgreSQL-development , Tomas Vondra Content-Type: multipart/mixed; boundary="0000000000002a63ee064e7555a8" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002a63ee064e7555a8 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Apr 1, 2026 at 9:18=E2=80=AFPM Amit Langote wrote: > On Wed, Apr 1, 2026 at 8:56=E2=80=AFPM Junwang Zhao w= rote: > > On Wed, Apr 1, 2026 at 5:51=E2=80=AFPM Amit Langote wrote: > > > > > > On Wed, Apr 1, 2026 at 5:51=E2=80=AFPM Amit Langote wrote: > > > > On Wed, Apr 1, 2026 at 12:54=E2=80=AFAM Junwang Zhao wrote: > > > > > + if (riinfo->fpmeta =3D=3D NULL) > > > > > + { > > > > > + /* Reload to ensure it's valid. */ > > > > > + riinfo =3D ri_LoadConstraintInfo(riinfo->constrai= nt_id); > > > > > > > > > > I was thinking of wrapping the reload in a conditional check like > > > > > `!riinfo->valid`, since `riinfo` can be valid even when `fpmeta = =3D=3D NULL`. > > > > > However, `if (riinfo->fpmeta =3D=3D NULL)` should rarely be true= , so the > > > > > unconditional reload is harmless, and the code is cleaner. > > > > > > > > > > +1 to the fix. > > > > > > > > Thanks for checking. > > > > > > > > I have just pushed a slightly modified version of that. > > > > > > > > > > 0002 is the rebased batching patch. > > > > > > > > > > The change of RI_FastPathEntry from storing riinfo to fk_relid > > > > > makes sense to me. I'll do another review on 0002 tomorrow. > > > > > > > > Here's another version. > > > > > > > > This time, I have another fixup patch (0001) to make FastPathMeta > > > > self-contained by copying the FmgrInfo structs it needs out of > > > > RI_CompareHashEntry rather than storing pointers into it. This avo= ids > > > > any dependency on those cache entries remaining stable. I'll push > > > > that once the just committed patch has seen enough BF animals. > > > > > > Pushed. > > > > > > > 0002 is rebased over that. > > > > > > Rebased again. > > > > +static void > > +ri_FastPathBatchFlush(RI_FastPathEntry *fpentry, Relation fk_rel) > > +{ > > + /* Reload; may have been invalidated since last batch accumulation. *= / > > + const RI_ConstraintInfo *riinfo =3D ri_LoadConstraintInfo(fpentry->co= noid); > > > > ... > > + if (riinfo->fpmeta =3D=3D NULL) > > + { > > + /* Reload to ensure it's valid. */ > > + riinfo =3D ri_LoadConstraintInfo(riinfo->constraint_id); > > + ri_populate_fastpath_metadata((RI_ConstraintInfo *) riinfo, > > + fk_rel, idx_rel); > > + } > > > > ri_LoadConstraintInfo is currently invoked twice within > > ri_FastPathBatchFlush. Should we eliminate the second call? > > I think we can't because the entry may be stale by the time we get to > the ri_populate_fastpath_metadata() call due to intervening steps; > even something as benign-looking index_beginscan() may call code paths > that can trigger invalidation in rare cases. Maybe predictably in > CLOBBER_CACHE_ALWAYS builds. > > > Alternatively, we could refactor ri_FastPathBatchFlush to accept > > an additional parameter, `const RI_ConstraintInfo *riinfo`, so we > > can remove the need for the first call. In that case, we need to call > > ri_LoadConstraintInfo in ri_FastPathEndBatch. > > Yeah, I think that's fine. Done that way in the attached. > > Also, I realized that we could do: > > @@ -2937,7 +2937,7 @@ ri_FastPathBatchFlush(RI_FastPathEntry *fpentry, > Relation fk_rel) > fk_rel, idx_rel); > } > Assert(riinfo->fpmeta); > - if (riinfo->nkeys =3D=3D 1) > + if (riinfo->nkeys =3D=3D 1 && fpentry->batch_count > 1) > violation_index =3D ri_FastPathFlushArray(fpentry, fk_slot, riin= fo, > fk_rel, snapshot, scande= sc); > > so that the fixed overhead of ri_FastPathFlushArray (allocating > matched[] array on stack and constructing ArrayType, etc.) is not paid > unnecessarily for single-row batches. There's another case in which it is not ok to use FlushArray and that is if the index AM's amsearcharray is false (should be true in all cases because the unique index used for PK is always btree). Added an Assert to that effect next to where SK_SEARCHARRAY is set in ri_FastPathFlushArray rather than a runtime check in the dispatch condition. Patch updated. Also added a comment about invalidation requirement or lack thereof for RI_FastPathEntry, rename AfterTriggerBatchIsActive() to simply AfterTriggerIsActive(), fixed the comments in trigger.h describing the callback mechanism. Will push tomorrow morning (Friday) barring objections. --=20 Thanks, Amit Langote --0000000000002a63ee064e7555a8 Content-Type: application/octet-stream; name="v17-0001-Batch-FK-rows-and-use-SK_SEARCHARRAY-for-fast-pa.patch" Content-Disposition: attachment; filename="v17-0001-Batch-FK-rows-and-use-SK_SEARCHARRAY-for-fast-pa.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnh61bvq0 RnJvbSA4MTBlYjQ0YTE2OTNhYzgzNmVlZmFkMGFjYjRhODA1MjNjNjA5NDRkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbWl0IExhbmdvdGUgPGFtaXRsYW5AcG9zdGdyZXNxbC5vcmc+ CkRhdGU6IFRodSwgMiBBcHIgMjAyNiAxNDoyODozNiArMDkwMApTdWJqZWN0OiBbUEFUQ0ggdjE3 XSBCYXRjaCBGSyByb3dzIGFuZCB1c2UgU0tfU0VBUkNIQVJSQVkgZm9yIGZhc3QtcGF0aCBGSwog cHJvYmVzCgpJbnN0ZWFkIG9mIHByb2JpbmcgdGhlIFBLIGluZGV4IG9uIGVhY2ggdHJpZ2dlciBp bnZvY2F0aW9uLCBidWZmZXIKRksgcm93cyBpbiBhIG5ldyBwZXItY29uc3RyYWludCBjYWNoZSBl bnRyeSAoUklfRmFzdFBhdGhFbnRyeSkgYW5kCmZsdXNoIHRoZW0gYXMgYSBiYXRjaC4gQ29tYmlu ZWQgd2l0aCB0aGUgZmFzdCBwYXRoIGludHJvZHVjZWQgaW4KdGhlIHByZXZpb3VzIGNvbW1pdCAo MmRhODZjMWVmOSksIHRoaXMgY2hhbmdlIHByb2R1Y2VzIH4yLjl4IHNwZWVkdXAKZm9yIGJ1bGsg RksgaW5zZXJ0cyAoaW50IFBLIC8gaW50IEZLLCAxTSByb3dzLCBQSyB0YWJsZSBhbmQgaW5kZXgK Y2FjaGVkKS4KCk9uIGVhY2ggdHJpZ2dlciBpbnZvY2F0aW9uLCB0aGUgbmV3IHJpX0Zhc3RQYXRo QmF0Y2hBZGQoKSBidWZmZXJzCnRoZSBGSyByb3cgaW4gUklfRmFzdFBhdGhFbnRyeS4gIFdoZW4g dGhlIGJ1ZmZlciBmaWxscyAoNjQgcm93cykKb3IgdGhlIHRyaWdnZXItZmlyaW5nIGN5Y2xlIGVu ZHMsIHRoZSBuZXcgcmlfRmFzdFBhdGhCYXRjaEZsdXNoKCkKcHJvYmVzIHRoZSBpbmRleCBmb3Ig YWxsIGJ1ZmZlcmVkIHJvd3MsIHNoYXJpbmcgYSBzaW5nbGUKQ29tbWFuZENvdW50ZXJJbmNyZW1l bnQsIHNuYXBzaG90LCBwZXJtaXNzaW9uIGNoZWNrLCBhbmQgc2VjdXJpdHkKY29udGV4dCBzd2l0 Y2ggYWNyb3NzIHRoZSBiYXRjaCwgcmF0aGVyIHRoYW4gcmVwZWF0aW5nIGVhY2ggcGVyIHJvdwph cyB0aGUgU1BJIHBhdGggZG9lcy4gIFBlci1mbHVzaCBDQ0kgaXMgc2FmZSBiZWNhdXNlIGFsbCBB RlRFUgp0cmlnZ2VycyBmb3IgdGhlIGJ1ZmZlcmVkIHJvd3MgaGF2ZSBhbHJlYWR5IGZpcmVkIGJ5 IGZsdXNoIHRpbWUuCgpGb3Igc2luZ2xlLWNvbHVtbiBmb3JlaWduIGtleXMsIHRoZSBmbHVzaCBi dWlsZHMgYW4gQXJyYXlUeXBlIGZyb20KdGhlIGJ1ZmZlcmVkIEZLIHZhbHVlcyAoY2FzdGluZyB0 byB0aGUgUEstc2lkZSB0eXBlIGlmIG5lZWRlZCkgYW5kCmNvbnN0cnVjdHMgYSBzY2FuIGtleSB3 aXRoIHRoZSBTS19TRUFSQ0hBUlJBWSBmbGFnLiAgVGhlIGluZGV4IEFNCnNvcnRzIGFuZCBkZWR1 cGxpY2F0ZXMgdGhlIGFycmF5IGludGVybmFsbHksIHRoZW4gd2Fsa3MgbWF0Y2hpbmcKbGVhZiBw YWdlcyBpbiBvbmUgb3JkZXJlZCB0cmF2ZXJzYWwgaW5zdGVhZCBvZiBkZXNjZW5kaW5nIGZyb20g dGhlCnJvb3Qgb25jZSBwZXIgcm93LiAgQSBtYXRjaGVkW10gYml0bWFwIHRyYWNrcyB3aGljaCBi YXRjaCBpdGVtcwp3ZXJlIHNhdGlzZmllZDsgdGhlIGZpcnN0IHVubWF0Y2hlZCBpdGVtIGlzIHJl cG9ydGVkIGFzIGEKdmlvbGF0aW9uLiAgTXVsdGktY29sdW1uIGZvcmVpZ24ga2V5cyBmYWxsIGJh Y2sgdG8gcGVyLXJvdyBwcm9iaW5nCnZpYSB0aGUgbmV3IHJpX0Zhc3RQYXRoRmx1c2hMb29wKCku CgpGSyB0dXBsZXMgYXJlIG1hdGVyaWFsaXplZCB2aWEgRXhlY0NvcHlTbG90SGVhcFR1cGxlKCkg aW50byBhIG5ldwpwdXJwb3NlLXNwZWNpZmljIG1lbW9yeSBjb250ZXh0IChmbHVzaF9jeHQpLCBj aGlsZCBvZgpUb3BUcmFuc2FjdGlvbkNvbnRleHQsIHdoaWNoIGlzIGFsc28gdXNlZCBmb3IgcGVy LWZsdXNoIHRyYW5zaWVudAp3b3JrOiBjYXN0IHJlc3VsdHMsIHRoZSBzZWFyY2ggYXJyYXksIGFu ZCBpbmRleCBzY2FuIGFsbG9jYXRpb25zLgpJdCBpcyByZXNldCBhZnRlciBlYWNoIGZsdXNoIGFu ZCBkZWxldGVkIGluIHRlYXJkb3duLgoKVGhlIFBLIHJlbGF0aW9uLCBpbmRleCwgdHVwbGUgc2xv dHMsIGFuZCBmYXN0LXBhdGggbWV0YWRhdGEgYXJlCmNhY2hlZCBpbiBSSV9GYXN0UGF0aEVudHJ5 IGFjcm9zcyB0cmlnZ2VyIGludm9jYXRpb25zIHdpdGhpbiBhCnRyaWdnZXItZmlyaW5nIGJhdGNo LCBhdm9pZGluZyByZXBlYXRlZCBvcGVuL2Nsb3NlIG92ZXJoZWFkLiAgVGhlCnNuYXBzaG90IGFu ZCBJbmRleFNjYW5EZXNjIGFyZSB0YWtlbiBmcmVzaCBwZXIgZmx1c2guICBUaGUgZW50cnkgaXMK bm90IHN1YmplY3QgdG8gY2FjaGUgaW52YWxpZGF0aW9uOiBjYWNoZWQgcmVsYXRpb25zIGFyZSBo ZWxkIHdpdGgKbG9ja3MgZm9yIHRoZSB0cmFuc2FjdGlvbiBkdXJhdGlvbiwgYW5kIHRoZSBlbnRy eSdzIGxpZmV0aW1lIGlzCmJvdW5kZWQgYnkgdGhlIHRyaWdnZXItZmlyaW5nIGN5Y2xlLgoKcmlf RmFzdFBhdGhFbmRCYXRjaCgpIGZsdXNoZXMgYW55IHBhcnRpYWwgYmF0Y2ggYmVmb3JlIHRlYXJp bmcKZG93biBjYWNoZWQgcmVzb3VyY2VzLiAgU2luY2UgdGhlIEZLIHJlbGF0aW9uIG1heSBhbHJl YWR5IGJlCmNsb3NlZCBieSBmbHVzaCB0aW1lIChlLmcuIGZvciBkZWZlcnJlZCBjb25zdHJhaW50 cyBhdCBDT01NSVQpLAppdCByZW9wZW5zIHRoZSByZWxhdGlvbiB1c2luZyBlbnRyeS0+ZmtfcmVs aWQgaWYgbmVlZGVkLgoKVGhlIGV4aXN0aW5nIEFMVEVSIFRBQkxFIHZhbGlkYXRpb24gcGF0aCBi eXBhc3NlcyBiYXRjaGluZyBhbmQKY29udGludWVzIHRvIGNhbGwgcmlfRmFzdFBhdGhDaGVjaygp IGRpcmVjdGx5IHBlciByb3cuCgpMaWZlY3ljbGUgbWFuYWdlbWVudCBmb3IgUklfRmFzdFBhdGhF bnRyeSByZWxpZXMgb24gdGhyZWUgbmV3Cm1lY2hhbmlzbXM6CgogIC0gQWZ0ZXJUcmlnZ2VyQmF0 Y2hDYWxsYmFjazogQSBuZXcgZ2VuZXJhbC1wdXJwb3NlIGNhbGxiYWNrCiAgICBtZWNoYW5pc20g aW4gdHJpZ2dlci5jLiAgQ2FsbGJhY2tzIHJlZ2lzdGVyZWQgdmlhCiAgICBSZWdpc3RlckFmdGVy VHJpZ2dlckJhdGNoQ2FsbGJhY2soKSBmaXJlIGF0IHRoZSBlbmQgb2YgZWFjaAogICAgdHJpZ2dl ci1maXJpbmcgYmF0Y2ggKEFmdGVyVHJpZ2dlckVuZFF1ZXJ5IGZvciBpbW1lZGlhdGUKICAgIGNv bnN0cmFpbnRzLCBBZnRlclRyaWdnZXJGaXJlRGVmZXJyZWQgYXQgQ09NTUlULCBhbmQKICAgIEFm dGVyVHJpZ2dlclNldFN0YXRlIGZvciBTRVQgQ09OU1RSQUlOVFMgSU1NRURJQVRFKS4gIFRoZSBS SQogICAgY29kZSByZWdpc3RlcnMgcmlfRmFzdFBhdGhFbmRCYXRjaCBhcyBhIGJhdGNoIGNhbGxi YWNrLgoKICAtIEJhdGNoIGNhbGxiYWNrcyBvbmx5IGZpcmUgYXQgdGhlIG91dGVybW9zdCBxdWVy eSBsZXZlbAogICAgKGNoZWNrZWQgaW5zaWRlIEZpcmVBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNr cyksIHNvIG5lc3RlZAogICAgcXVlcmllcyBmcm9tIFNQSSBpbnNpZGUgb3RoZXIgQUZURVIgdHJp Z2dlcnMgZG8gbm90IHRlYXIgZG93bgogICAgdGhlIGNhY2hlIG1pZC1iYXRjaC4KCiAgLSBYYWN0 Q2FsbGJhY2s6IHJpX0Zhc3RQYXRoWGFjdENhbGxiYWNrIE5VTExzIHRoZSBzdGF0aWMgY2FjaGUK ICAgIHBvaW50ZXIgYXQgdHJhbnNhY3Rpb24gZW5kLCBoYW5kbGluZyB0aGUgYWJvcnQgcGF0aCB3 aGVyZSB0aGUKICAgIGJhdGNoIGNhbGxiYWNrIG5ldmVyIGZpcmVkLgoKICAtIFN1YlhhY3RDYWxs YmFjazogcmlfRmFzdFBhdGhTdWJYYWN0Q2FsbGJhY2sgTlVMTHMgdGhlIHN0YXRpYwogICAgY2Fj aGUgcG9pbnRlciBvbiBzdWJ0cmFuc2FjdGlvbiBhYm9ydCwgcHJldmVudGluZyB0aGUgYmF0Y2gK ICAgIGNhbGxiYWNrIGZyb20gYWNjZXNzaW5nIGFscmVhZHktcmVsZWFzZWQgcmVzb3VyY2VzLgoK ICAtIEFmdGVyVHJpZ2dlckJhdGNoSXNBY3RpdmUoKTogQSBuZXcgZXhwb3J0ZWQgYWNjZXNzb3Ig dGhhdAogICAgcmV0dXJucyB0cnVlIHdoZW4gYWZ0ZXJUcmlnZ2Vycy5xdWVyeV9kZXB0aCA+PSAw LiAgRHVyaW5nCiAgICBBTFRFUiBUQUJMRSAuLi4gQUREIEZPUkVJR04gS0VZIHZhbGlkYXRpb24s IFJJIHRyaWdnZXJzIGFyZQogICAgY2FsbGVkIGRpcmVjdGx5IG91dHNpZGUgdGhlIGFmdGVyLXRy aWdnZXIgZnJhbWV3b3JrLCBzbyBiYXRjaAogICAgY2FsbGJhY2tzIHdvdWxkIG5ldmVyIGZpcmUu ICBUaGUgZmFzdC1wYXRoIGNvZGUgdXNlcyB0aGlzIHRvCiAgICBmYWxsIGJhY2sgdG8gdGhlIG5v bi1jYWNoZWQgcGVyLWludm9jYXRpb24gcGF0aCBpbiB0aGF0CiAgICBjb250ZXh0LgoKQXV0aG9y OiBBbWl0IExhbmdvdGUgPGFtaXRsYW5nb3RlMDlAZ21haWwuY29tPgpDby1hdXRob3JlZC1ieTog SnVud2FuZyBaaGFvIDx6aGp3cGt1QGdtYWlsLmNvbT4KUmV2aWV3ZWQtYnk6IEhhaWJvIFlhbiA8 dHJpc3Rhbi55aW1AZ21haWwuY29tPgpUZXN0ZWQtYnk6IFRvbWFzIFZvbmRyYSA8dG9tYXNAdm9u ZHJhLm1lPgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9tL0NBK0hpd3FGNEMwd3MzY08r ejVjTGtQdXZ3bkF3a1NwN3NmdmdHajN5UT1MaTZLTk1xQUBtYWlsLmdtYWlsLmNvbQotLS0KIHNy Yy9iYWNrZW5kL2NvbW1hbmRzL3RyaWdnZXIuYyAgICAgICAgICAgIHwgMTA1ICsrKysKIHNyYy9i YWNrZW5kL3V0aWxzL2FkdC9yaV90cmlnZ2Vycy5jICAgICAgIHwgNjA4ICsrKysrKysrKysrKysr KysrKysrKy0KIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RyaWdnZXIuaCAgICAgICAgICAgIHwgIDIx ICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZm9yZWlnbl9rZXkub3V0IHwgMTI2ICsrKysr CiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwgICAgICB8IDExOCArKysrKwog c3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgfCAgIDMgKwogNiBmaWxl cyBjaGFuZ2VkLCA5NzcgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQg YS9zcmMvYmFja2VuZC9jb21tYW5kcy90cmlnZ2VyLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy90 cmlnZ2VyLmMKaW5kZXggNjU5Njg0M2E4ZDguLjkwZTk0ZmI4YTVhIDEwMDY0NAotLS0gYS9zcmMv YmFja2VuZC9jb21tYW5kcy90cmlnZ2VyLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvdHJp Z2dlci5jCkBAIC0zODkzLDYgKzM4OTMsOCBAQCB0eXBlZGVmIHN0cnVjdCBBZnRlclRyaWdnZXJz RGF0YQogCS8qIHBlci1zdWJ0cmFuc2FjdGlvbi1sZXZlbCBkYXRhOiAqLwogCUFmdGVyVHJpZ2dl cnNUcmFuc0RhdGEgKnRyYW5zX3N0YWNrOwkvKiBhcnJheSBvZiBzdHJ1Y3RzIHNob3duIGJlbG93 ICovCiAJaW50CQkJbWF4dHJhbnNkZXB0aDsJLyogYWxsb2NhdGVkIGxlbiBvZiBhYm92ZSBhcnJh eSAqLworCisJTGlzdAkgICAqYmF0Y2hfY2FsbGJhY2tzOwkvKiBMaXN0IG9mIEFmdGVyVHJpZ2dl ckNhbGxiYWNrSXRlbSAqLwogfSBBZnRlclRyaWdnZXJzRGF0YTsKIAogc3RydWN0IEFmdGVyVHJp Z2dlcnNRdWVyeURhdGEKQEAgLTM5MjksNiArMzkzMSwxMyBAQCBzdHJ1Y3QgQWZ0ZXJUcmlnZ2Vy c1RhYmxlRGF0YQogCVR1cGxlVGFibGVTbG90ICpzdG9yZXNsb3Q7CS8qIGZvciBjb252ZXJ0aW5n IHRvIHR1cGxlc3RvcmUncyBmb3JtYXQgKi8KIH07CiAKKy8qIEVudHJ5IGluIGFmdGVyVHJpZ2dl cnMuYmF0Y2hfY2FsbGJhY2tzICovCit0eXBlZGVmIHN0cnVjdCBBZnRlclRyaWdnZXJDYWxsYmFj a0l0ZW0KK3sKKwlBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrIGNhbGxiYWNrOworCXZvaWQJICAg KmFyZzsKK30gQWZ0ZXJUcmlnZ2VyQ2FsbGJhY2tJdGVtOworCiBzdGF0aWMgQWZ0ZXJUcmlnZ2Vy c0RhdGEgYWZ0ZXJUcmlnZ2VyczsKIAogc3RhdGljIHZvaWQgQWZ0ZXJUcmlnZ2VyRXhlY3V0ZShF U3RhdGUgKmVzdGF0ZSwKQEAgLTM5NjQsNiArMzk3Myw3IEBAIHN0YXRpYyBTZXRDb25zdHJhaW50 U3RhdGUgU2V0Q29uc3RyYWludFN0YXRlQWRkSXRlbShTZXRDb25zdHJhaW50U3RhdGUgc3RhdGUs CiAJCQkJCQkJCQkJCQkJT2lkIHRnb2lkLCBib29sIHRnaXNkZWZlcnJlZCk7CiBzdGF0aWMgdm9p ZCBjYW5jZWxfcHJpb3Jfc3RtdF90cmlnZ2VycyhPaWQgcmVsaWQsIENtZFR5cGUgY21kVHlwZSwg aW50IHRnZXZlbnQpOwogCitzdGF0aWMgdm9pZCBGaXJlQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFj a3Modm9pZCk7CiAKIC8qCiAgKiBHZXQgdGhlIEZEVyB0dXBsZXN0b3JlIGZvciB0aGUgY3VycmVu dCB0cmlnZ2VyIHF1ZXJ5IGxldmVsLCBjcmVhdGluZyBpdApAQCAtNTA4OSw2ICs1MDk5LDcgQEAg QWZ0ZXJUcmlnZ2VyQmVnaW5YYWN0KHZvaWQpCiAJICovCiAJYWZ0ZXJUcmlnZ2Vycy5maXJpbmdf Y291bnRlciA9IChDb21tYW5kSWQpIDE7CS8qIG11c3RuJ3QgYmUgMCAqLwogCWFmdGVyVHJpZ2dl cnMucXVlcnlfZGVwdGggPSAtMTsKKwlhZnRlclRyaWdnZXJzLmJhdGNoX2NhbGxiYWNrcyA9IE5J TDsKIAogCS8qCiAJICogVmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm8gbGVmdG92ZXIgc3RhdGUgcmVt YWluaW5nLiAgSWYgdGhlc2UgYXNzZXJ0aW9ucwpAQCAtNTIxMCw2ICs1MjIxLDE1IEBAIEFmdGVy VHJpZ2dlckVuZFF1ZXJ5KEVTdGF0ZSAqZXN0YXRlKQogCQkJYnJlYWs7CiAJfQogCisJLyoKKwkg KiBGaXJlIGJhdGNoIGNhbGxiYWNrcyBiZWZvcmUgcmVsZWFzaW5nIHF1ZXJ5LWxldmVsIHN0b3Jh Z2UgYW5kIGJlZm9yZQorCSAqIGRlY3JlbWVudGluZyBxdWVyeV9kZXB0aC4gIENhbGxiYWNrcyBt YXkgZG8gcmVhbCB3b3JrIChpbmRleCBwcm9iZXMsCisJICogZXJyb3IgcmVwb3J0aW5nKSBhbmQg cmVseSBvbiBxdWVyeV9kZXB0aCBzdGlsbCByZWZsZWN0aW5nIHRoZSBjdXJyZW50CisJICogYmF0 Y2ggbGV2ZWwgc28gdGhhdCBuZXN0ZWQgY2FsbHMgZnJvbSBTUEkgaW5zaWRlIEFGVEVSIHRyaWdn ZXJzIGFyZQorCSAqIGNvcnJlY3RseSBzdXBwcmVzc2VkIGJ5IEZpcmVBZnRlclRyaWdnZXJCYXRj aENhbGxiYWNrcydzIGRlcHRoIGd1YXJkLgorCSAqLworCUZpcmVBZnRlclRyaWdnZXJCYXRjaENh bGxiYWNrcygpOworCiAJLyogUmVsZWFzZSBxdWVyeS1sZXZlbC1sb2NhbCBzdG9yYWdlLCBpbmNs dWRpbmcgdHVwbGVzdG9yZXMgaWYgYW55ICovCiAJQWZ0ZXJUcmlnZ2VyRnJlZVF1ZXJ5KCZhZnRl clRyaWdnZXJzLnF1ZXJ5X3N0YWNrW2FmdGVyVHJpZ2dlcnMucXVlcnlfZGVwdGhdKTsKIApAQCAt NTMxNyw2ICs1MzM3LDkgQEAgQWZ0ZXJUcmlnZ2VyRmlyZURlZmVycmVkKHZvaWQpCiAJCQlicmVh azsJCQkJLyogYWxsIGZpcmVkICovCiAJfQogCisJLyogRmx1c2ggYW55IGZhc3QtcGF0aCBiYXRj aGVzIGFjY3VtdWxhdGVkIGJ5IHRoZSB0cmlnZ2VycyBqdXN0IGZpcmVkLiAqLworCUZpcmVBZnRl clRyaWdnZXJCYXRjaENhbGxiYWNrcygpOworCiAJLyoKIAkgKiBXZSBkb24ndCBib3RoZXIgZnJl ZWluZyB0aGUgZXZlbnQgbGlzdCwgc2luY2UgaXQgd2lsbCBnbyBhd2F5IGFueXdheQogCSAqIChh bmQgbW9yZSBlZmZpY2llbnRseSB0aGFuIHZpYSBwZnJlZSkgaW4gQWZ0ZXJUcmlnZ2VyRW5kWGFj dC4KQEAgLTYwNTksNiArNjA4MiwxMSBAQCBBZnRlclRyaWdnZXJTZXRTdGF0ZShDb25zdHJhaW50 c1NldFN0bXQgKnN0bXQpCiAJCQkJYnJlYWs7CQkJLyogYWxsIGZpcmVkICovCiAJCX0KIAorCQkv KgorCQkgKiBGbHVzaCBhbnkgZmFzdC1wYXRoIGJhdGNoZXMgYWNjdW11bGF0ZWQgYnkgdGhlIHRy aWdnZXJzIGp1c3QgZmlyZWQuCisJCSAqLworCQlGaXJlQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFj a3MoKTsKKwogCQlpZiAoc25hcHNob3Rfc2V0KQogCQkJUG9wQWN0aXZlU25hcHNob3QoKTsKIAl9 CkBAIC02NzU1LDMgKzY3ODMsODAgQEAgY2hlY2tfbW9kaWZpZWRfdmlydHVhbF9nZW5lcmF0ZWQo VHVwbGVEZXNjIHR1cGRlc2MsIEhlYXBUdXBsZSB0dXBsZSkKIAogCXJldHVybiB0dXBsZTsKIH0K KworLyoKKyAqIFJlZ2lzdGVyQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFjaworICoJCVJlZ2lzdGVy IGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgdHJpZ2dlci1maXJpbmcK KyAqCQliYXRjaCBjb21wbGV0ZXMuCisgKgorICogTXVzdCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4g YSB0cmlnZ2VyIGZ1bmN0aW9uJ3MgZXhlY3V0aW9uIGNvbnRleHQKKyAqIChpLmUuLCB3aGlsZSBh ZnRlclRyaWdnZXJzIHN0YXRlIGlzIGFjdGl2ZSkuCisgKgorICogVGhlIGNhbGxiYWNrIGxpc3Qg aXMgY2xlYXJlZCBhZnRlciBpbnZvY2F0aW9uLCBzbyB0aGUgY2FsbGVyIG11c3QKKyAqIHJlLXJl Z2lzdGVyIGZvciBlYWNoIG5ldyBiYXRjaCBpZiBuZWVkZWQuCisgKi8KK3ZvaWQKK1JlZ2lzdGVy QWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFjayhBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrIGNhbGxi YWNrLAorCQkJCQkJCQkgIHZvaWQgKmFyZykKK3sKKwlBZnRlclRyaWdnZXJDYWxsYmFja0l0ZW0g Kml0ZW07CisJTWVtb3J5Q29udGV4dCBvbGRjeHQ7CisKKwkvKgorCSAqIEFsbG9jYXRlIGluIFRv cFRyYW5zYWN0aW9uQ29udGV4dCBzbyB0aGUgaXRlbSBzdXJ2aXZlcyBmb3IgdGhlIGR1cmF0aW9u CisJICogb2YgdGhlIGJhdGNoLCB3aGljaCBtYXkgc3BhbiBtdWx0aXBsZSB0cmlnZ2VyIGludm9j YXRpb25zLgorCSAqCisJICogTXVzdCBiZSBjYWxsZWQgd2hpbGUgYWZ0ZXJUcmlnZ2VycyBpcyBh Y3RpdmUgKHF1ZXJ5X2RlcHRoID49IDApOworCSAqIGNhbGxiYWNrcyByZWdpc3RlcmVkIG91dHNp ZGUgYSB0cmlnZ2VyLWZpcmluZyBjb250ZXh0IHdvdWxkIG5ldmVyIGZpcmUuCisJICovCisJQXNz ZXJ0KGFmdGVyVHJpZ2dlcnMucXVlcnlfZGVwdGggPj0gMCk7CisJb2xkY3h0ID0gTWVtb3J5Q29u dGV4dFN3aXRjaFRvKFRvcFRyYW5zYWN0aW9uQ29udGV4dCk7CisJaXRlbSA9IHBhbGxvYyhzaXpl b2YoQWZ0ZXJUcmlnZ2VyQ2FsbGJhY2tJdGVtKSk7CisJaXRlbS0+Y2FsbGJhY2sgPSBjYWxsYmFj azsKKwlpdGVtLT5hcmcgPSBhcmc7CisJYWZ0ZXJUcmlnZ2Vycy5iYXRjaF9jYWxsYmFja3MgPQor CQlsYXBwZW5kKGFmdGVyVHJpZ2dlcnMuYmF0Y2hfY2FsbGJhY2tzLCBpdGVtKTsKKwlNZW1vcnlD b250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKK30KKworLyoKKyAqIEZpcmVBZnRlclRyaWdnZXJCYXRj aENhbGxiYWNrcworICoJCUludm9rZSBhbmQgY2xlYXIgYWxsIHJlZ2lzdGVyZWQgYmF0Y2ggY2Fs bGJhY2tzLgorICoKKyAqIE9ubHkgZmlyZXMgYXQgdGhlIG91dGVybW9zdCBxdWVyeSBsZXZlbCAo cXVlcnlfZGVwdGggPT0gMCkgb3IgZnJvbQorICogdG9wLWxldmVsIG9wZXJhdGlvbnMgKHF1ZXJ5 X2RlcHRoID09IC0xLCBlLmcuIEFmdGVyVHJpZ2dlckZpcmVEZWZlcnJlZAorICogYXQgQ09NTUlU KS4gIE5lc3RlZCBxdWVyaWVzIGZyb20gU1BJIGluc2lkZSBBRlRFUiB0cmlnZ2VycyBydW4gYXQK KyAqIGRlcHRoID4gMCBhbmQgbXVzdCBub3QgdGVhciBkb3duIHJlc291cmNlcyB0aGUgb3V0ZXIg YmF0Y2ggc3RpbGwgbmVlZHMuCisgKi8KK3N0YXRpYyB2b2lkCitGaXJlQWZ0ZXJUcmlnZ2VyQmF0 Y2hDYWxsYmFja3Modm9pZCkKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKworCWlmIChhZnRlclRyaWdn ZXJzLnF1ZXJ5X2RlcHRoID4gMCkKKwkJcmV0dXJuOworCisJZm9yZWFjaChsYywgYWZ0ZXJUcmln Z2Vycy5iYXRjaF9jYWxsYmFja3MpCisJeworCQlBZnRlclRyaWdnZXJDYWxsYmFja0l0ZW0gKml0 ZW0gPSBsZmlyc3QobGMpOworCisJCWl0ZW0tPmNhbGxiYWNrKGl0ZW0tPmFyZyk7CisJfQorCisJ bGlzdF9mcmVlX2RlZXAoYWZ0ZXJUcmlnZ2Vycy5iYXRjaF9jYWxsYmFja3MpOworCWFmdGVyVHJp Z2dlcnMuYmF0Y2hfY2FsbGJhY2tzID0gTklMOworfQorCisvKgorICogQWZ0ZXJUcmlnZ2VySXNB Y3RpdmUKKyAqCQlSZXR1cm5zIHRydWUgaWYgd2UncmUgaW5zaWRlIHRoZSBhZnRlci10cmlnZ2Vy IGZyYW1ld29yayB3aGVyZQorICoJCXJlZ2lzdGVyZWQgYmF0Y2ggY2FsbGJhY2tzIHdpbGwgYWN0 dWFsbHkgYmUgaW52b2tlZC4KKyAqCisgKiBUaGlzIGlzIGZhbHNlIGR1cmluZyB2YWxpZGF0ZUZv cmVpZ25LZXlDb25zdHJhaW50KCksIHdoaWNoIGNhbGxzCisgKiBSSSB0cmlnZ2VyIGZ1bmN0aW9u cyBkaXJlY3RseSBvdXRzaWRlIHRoZSBhZnRlci10cmlnZ2VyIGZyYW1ld29yay4KKyAqLworYm9v bAorQWZ0ZXJUcmlnZ2VySXNBY3RpdmUodm9pZCkKK3sKKwlyZXR1cm4gYWZ0ZXJUcmlnZ2Vycy5x dWVyeV9kZXB0aCA+PSAwOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Jp X3RyaWdnZXJzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dlcnMuYwppbmRleCAy ZGUwOGRhNjUzOS4uZTc4ZmMyNGY0OGUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9yaV90cmlnZ2Vycy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yaV90cmlnZ2Vycy5j CkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlICJwb3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAi YWNjZXNzL2FtYXBpLmgiCiAjaW5jbHVkZSAiYWNjZXNzL2dlbmFtLmgiCiAjaW5jbHVkZSAiYWNj ZXNzL2h0dXBfZGV0YWlscy5oIgogI2luY2x1ZGUgImFjY2Vzcy9za2V5LmgiCkBAIC0xOTksNiAr MjAwLDU1IEBAIHR5cGVkZWYgc3RydWN0IFJJX0NvbXBhcmVIYXNoRW50cnkKIAlGbWdySW5mbwlj YXN0X2Z1bmNfZmluZm87CS8qIGluIGNhc2Ugd2UgbXVzdCBjb2VyY2UgaW5wdXQgKi8KIH0gUklf Q29tcGFyZUhhc2hFbnRyeTsKIAorLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIEZLIHJvd3MgYnVm ZmVyZWQgYmVmb3JlIGZsdXNoaW5nLgorICoKKyAqIExhcmdlciBiYXRjaGVzIGFtb3J0aXplIHBl ci1mbHVzaCBvdmVyaGVhZCBhbmQgbGV0IHRoZSBTS19TRUFSQ0hBUlJBWQorICogcGF0aCB3YWxr IG1vcmUgbGVhZiBwYWdlcyBpbiBhIHNpbmdsZSBzb3J0ZWQgdHJhdmVyc2FsLiAgQnV0IGVhY2gK KyAqIGJ1ZmZlcmVkIHJvdyBpcyBhIG1hdGVyaWFsaXplZCBIZWFwVHVwbGUgaW4gZmx1c2hfY3h0 LCBhbmQgdGhlIG1hdGNoZWRbXQorICogc2NhbiBpbiByaV9GYXN0UGF0aEZsdXNoQXJyYXkoKSBp cyBPKGJhdGNoX3NpemUpIHBlciBpbmRleCBtYXRjaC4KKyAqIEJlbmNobWFya2luZyBzaG93ZWQg bGl0dGxlIGRpZmZlcmVuY2UgYmV0d2VlbiAxNiBhbmQgNjQsIHdpdGggMjU2CisgKiBjb25zaXN0 ZW50bHkgc2xvd2VyLiAgNjQgaXMgYSByZWFzb25hYmxlIGRlZmF1bHQuCisgKi8KKyNkZWZpbmUg UklfRkFTVFBBVEhfQkFUQ0hfU0laRQk2NAorCisvKgorICogUklfRmFzdFBhdGhFbnRyeQorICoJ CVBlci1jb25zdHJhaW50IGNhY2hlIG9mIHJlc291cmNlcyBuZWVkZWQgYnkgcmlfRmFzdFBhdGhC YXRjaEZsdXNoKCkuCisgKgorICogT25lIGVudHJ5IHBlciBjb25zdHJhaW50LCBrZXllZCBieSBw Z19jb25zdHJhaW50IE9JRC4gIENyZWF0ZWQgbGF6aWx5CisgKiBieSByaV9GYXN0UGF0aEdldEVu dHJ5KCkgb24gZmlyc3QgdXNlIHdpdGhpbiBhIHRyaWdnZXItZmlyaW5nIGJhdGNoCisgKiBhbmQg dG9ybiBkb3duIGJ5IHJpX0Zhc3RQYXRoVGVhcmRvd24oKSBhdCBiYXRjaCBlbmQuCisgKgorICog RksgdHVwbGVzIGFyZSBidWZmZXJlZCBpbiBiYXRjaFtdIGFjcm9zcyB0cmlnZ2VyIGludm9jYXRp b25zIGFuZAorICogZmx1c2hlZCB3aGVuIHRoZSBidWZmZXIgZmlsbHMgb3IgdGhlIGJhdGNoIGVu ZHMuCisgKgorICogUklfRmFzdFBhdGhFbnRyeSBpcyBub3Qgc3ViamVjdCB0byBjYWNoZSBpbnZh bGlkYXRpb24uICBUaGUgY2FjaGVkCisgKiByZWxhdGlvbnMgYXJlIGhlbGQgb3BlbiB3aXRoIGxv Y2tzIGZvciB0aGUgdHJhbnNhY3Rpb24gZHVyYXRpb24sIHByZXZlbnRpbmcKKyAqIHJlbGNhY2hl IGludmFsaWRhdGlvbi4gIFRoZSBlbnRyeSBpdHNlbGYgaXMgdG9ybiBkb3duIGF0IGJhdGNoIGF0 IGJhdGNoIGVuZAorICogYnkgcmlfRmFzdFBhdGhFbmRCYXRjaCgpOyBvbiBhYm9ydCwgUmVzb3Vy Y2VPd25lciByZWxlYXNlcyB0aGUgY2FjaGVkCisgKiByZWxhdGlvbnMgYW5kIHRoZSBYYWN0Q2Fs bGJhY2svU3ViWGFjdENhbGxiYWNrIE5VTEwgdGhlIHN0YXRpYyBjYWNoZSBwb2ludGVyCisgKiB0 byBwcmV2ZW50IGFueSBzdWJzZXF1ZW50IGFjY2Vzcy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgUklf RmFzdFBhdGhFbnRyeQoreworCU9pZAkJCWNvbm9pZDsJCQkvKiBoYXNoIGtleTogcGdfY29uc3Ry YWludCBPSUQgKi8KKwlPaWQJCQlma19yZWxpZDsJCS8qIGZvciByaV9GYXN0UGF0aEVuZEJhdGNo KCkgKi8KKwlSZWxhdGlvbglwa19yZWw7CisJUmVsYXRpb24JaWR4X3JlbDsKKwlUdXBsZVRhYmxl U2xvdCAqcGtfc2xvdDsKKwlUdXBsZVRhYmxlU2xvdCAqZmtfc2xvdDsKKwlNZW1vcnlDb250ZXh0 IGZsdXNoX2N4dDsJLyogc2hvcnQtbGl2ZWQgY29udGV4dCBmb3IgcGVyLWZsdXNoIHdvcmsgKi8K KworCS8qCisJICogVE9ETzogYmF0Y2hbXSBpcyBIZWFwVHVwbGVbXSBiZWNhdXNlIHRoZSBBRlRF UiB0cmlnZ2VyIG1hY2hpbmVyeQorCSAqIGN1cnJlbnRseSBwYXNzZXMgdHVwbGVzIGFzIEhlYXBU dXBsZXMuICBPbmNlIHRyaWdnZXIgaW5mcmFzdHJ1Y3R1cmUgaXMKKwkgKiBzbG90aWZpZWQsIHRo aXMgc2hvdWxkIHVzZSBhIHNsb3QgYXJyYXkgb3Igd2hhdGV2ZXIgYmF0Y2hlZCB0dXBsZQorCSAq IHN0b3JhZ2UgYWJzdHJhY3Rpb24gZXhpc3RzIGF0IHRoYXQgcG9pbnQgdG8gYmUgVEFNLWFnbm9z dGljLgorCSAqLworCUhlYXBUdXBsZQliYXRjaFtSSV9GQVNUUEFUSF9CQVRDSF9TSVpFXTsKKwlp bnQJCQliYXRjaF9jb3VudDsKK30gUklfRmFzdFBhdGhFbnRyeTsKIAogLyoKICAqIExvY2FsIGRh dGEKQEAgLTIwOCw2ICsyNTgsOCBAQCBzdGF0aWMgSFRBQiAqcmlfcXVlcnlfY2FjaGUgPSBOVUxM Owogc3RhdGljIEhUQUIgKnJpX2NvbXBhcmVfY2FjaGUgPSBOVUxMOwogc3RhdGljIGRjbGlzdF9o ZWFkIHJpX2NvbnN0cmFpbnRfY2FjaGVfdmFsaWRfbGlzdDsKIAorc3RhdGljIEhUQUIgKnJpX2Zh c3RwYXRoX2NhY2hlID0gTlVMTDsKK3N0YXRpYyBib29sIHJpX2Zhc3RwYXRoX2NhbGxiYWNrX3Jl Z2lzdGVyZWQgPSBmYWxzZTsKIAogLyoKICAqIExvY2FsIGZ1bmN0aW9uIHByb3RvdHlwZXMKQEAg LTI1OCw2ICszMTAsMTYgQEAgc3RhdGljIGJvb2wgcmlfUGVyZm9ybUNoZWNrKGNvbnN0IFJJX0Nv bnN0cmFpbnRJbmZvICpyaWluZm8sCiAJCQkJCQkJYm9vbCBkZXRlY3ROZXdSb3dzLCBpbnQgZXhw ZWN0X09LKTsKIHN0YXRpYyB2b2lkIHJpX0Zhc3RQYXRoQ2hlY2soY29uc3QgUklfQ29uc3RyYWlu dEluZm8gKnJpaW5mbywKIAkJCQkJCQkgUmVsYXRpb24gZmtfcmVsLCBUdXBsZVRhYmxlU2xvdCAq bmV3c2xvdCk7CitzdGF0aWMgdm9pZCByaV9GYXN0UGF0aEJhdGNoQWRkKGNvbnN0IFJJX0NvbnN0 cmFpbnRJbmZvICpyaWluZm8sCisJCQkJCQkJCVJlbGF0aW9uIGZrX3JlbCwgVHVwbGVUYWJsZVNs b3QgKm5ld3Nsb3QpOworc3RhdGljIGludAlyaV9GYXN0UGF0aEZsdXNoQXJyYXkoUklfRmFzdFBh dGhFbnRyeSAqZnBlbnRyeSwgVHVwbGVUYWJsZVNsb3QgKmZrX3Nsb3QsCisJCQkJCQkJCSAgY29u c3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywgUmVsYXRpb24gZmtfcmVsLAorCQkJCQkJCQkg IFNuYXBzaG90IHNuYXBzaG90LCBJbmRleFNjYW5EZXNjIHNjYW5kZXNjKTsKK3N0YXRpYyBpbnQJ cmlfRmFzdFBhdGhGbHVzaExvb3AoUklfRmFzdFBhdGhFbnRyeSAqZnBlbnRyeSwgVHVwbGVUYWJs ZVNsb3QgKmZrX3Nsb3QsCisJCQkJCQkJCSBjb25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZv LCBSZWxhdGlvbiBma19yZWwsCisJCQkJCQkJCSBTbmFwc2hvdCBzbmFwc2hvdCwgSW5kZXhTY2Fu RGVzYyBzY2FuZGVzYyk7CitzdGF0aWMgdm9pZCByaV9GYXN0UGF0aEJhdGNoRmx1c2goUklfRmFz dFBhdGhFbnRyeSAqZnBlbnRyeSwgUmVsYXRpb24gZmtfcmVsLAorCQkJCQkJCQkgIGNvbnN0IFJJ X0NvbnN0cmFpbnRJbmZvICpyaWluZm8pOwogc3RhdGljIGJvb2wgcmlfRmFzdFBhdGhQcm9iZU9u ZShSZWxhdGlvbiBwa19yZWwsIFJlbGF0aW9uIGlkeF9yZWwsCiAJCQkJCQkJCUluZGV4U2NhbkRl c2Mgc2NhbmRlc2MsIFR1cGxlVGFibGVTbG90ICpzbG90LAogCQkJCQkJCQlTbmFwc2hvdCBzbmFw c2hvdCwgY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywKQEAgLTI4MCw2ICszNDIsMTAg QEAgcGdfbm9yZXR1cm4gc3RhdGljIHZvaWQgcmlfUmVwb3J0VmlvbGF0aW9uKGNvbnN0IFJJX0Nv bnN0cmFpbnRJbmZvICpyaWluZm8sCiAJCQkJCQkJCQkJICAgUmVsYXRpb24gcGtfcmVsLCBSZWxh dGlvbiBma19yZWwsCiAJCQkJCQkJCQkJICAgVHVwbGVUYWJsZVNsb3QgKnZpb2xhdG9yc2xvdCwg VHVwbGVEZXNjIHR1cGRlc2MsCiAJCQkJCQkJCQkJICAgaW50IHF1ZXJ5bm8sIGJvb2wgaXNfcmVz dHJpY3QsIGJvb2wgcGFydGdvbmUpOworc3RhdGljIFJJX0Zhc3RQYXRoRW50cnkgKnJpX0Zhc3RQ YXRoR2V0RW50cnkoY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywKKwkJCQkJCQkJCQkJ IFJlbGF0aW9uIGZrX3JlbCk7CitzdGF0aWMgdm9pZCByaV9GYXN0UGF0aEVuZEJhdGNoKHZvaWQg KmFyZyk7CitzdGF0aWMgdm9pZCByaV9GYXN0UGF0aFRlYXJkb3duKHZvaWQpOwogCiAKIC8qCkBA IC0zOTAsMTIgKzQ1NiwyMiBAQCBSSV9GS2V5X2NoZWNrKFRyaWdnZXJEYXRhICp0cmlnZGF0YSkK IAkgKiBsb2NrLiAgVGhpcyBpcyBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0byB0aGUgU1BJIHBh dGggYmVsb3cgYnV0IGF2b2lkcwogCSAqIHRoZSBwZXItcm93IGV4ZWN1dG9yIG92ZXJoZWFkLgog CSAqCi0JICogcmlfRmFzdFBhdGhDaGVjaygpIHJlcG9ydHMgdGhlIHZpb2xhdGlvbiBpdHNlbGYg KHZpYSBlcmVwb3J0KSBpZiBubwotCSAqIG1hdGNoaW5nIFBLIHJvdyBpcyBmb3VuZCwgc28gaXQg b25seSByZXR1cm5zIG9uIHN1Y2Nlc3MuCisJICogcmlfRmFzdFBhdGhCYXRjaEFkZCgpIGFuZCBy aV9GYXN0UGF0aENoZWNrKCkgcmVwb3J0IHRoZSB2aW9sYXRpb24KKwkgKiB0aGVtc2VsdmVzIGlm IG5vIG1hdGNoaW5nIFBLIHJvdyBpcyBmb3VuZCwgc28gdGhleSBvbmx5IHJldHVybiBvbgorCSAq IHN1Y2Nlc3MuCiAJICovCiAJaWYgKHJpX2Zhc3RwYXRoX2lzX2FwcGxpY2FibGUocmlpbmZvKSkK IAl7Ci0JCXJpX0Zhc3RQYXRoQ2hlY2socmlpbmZvLCBma19yZWwsIG5ld3Nsb3QpOworCQlpZiAo QWZ0ZXJUcmlnZ2VySXNBY3RpdmUoKSkKKwkJeworCQkJLyogQmF0Y2hlZCBwYXRoOiBidWZmZXIg YW5kIHByb2JlIGluIGdyb3VwcyAqLworCQkJcmlfRmFzdFBhdGhCYXRjaEFkZChyaWluZm8sIGZr X3JlbCwgbmV3c2xvdCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKiBBTFRFUiBUQUJMRSB2YWxp ZGF0aW9uOiBwZXItcm93LCBubyBjYWNoZSAqLworCQkJcmlfRmFzdFBhdGhDaGVjayhyaWluZm8s IGZrX3JlbCwgbmV3c2xvdCk7CisJCX0KIAkJcmV0dXJuIFBvaW50ZXJHZXREYXR1bShOVUxMKTsK IAl9CiAKQEAgLTI2OTAsMTAgKzI3NjYsMTQgQEAgcmlfUGVyZm9ybUNoZWNrKGNvbnN0IFJJX0Nv bnN0cmFpbnRJbmZvICpyaWluZm8sCiAKIC8qCiAgKiByaV9GYXN0UGF0aENoZWNrCi0gKgkJUGVy Zm9ybSBGSyBleGlzdGVuY2UgY2hlY2sgdmlhIGRpcmVjdCBpbmRleCBwcm9iZSwgYnlwYXNzaW5n IFNQSS4KKyAqCQlQZXJmb3JtIHBlciByb3cgRksgZXhpc3RlbmNlIGNoZWNrIHZpYSBkaXJlY3Qg aW5kZXggcHJvYmUsCisgKgkJYnlwYXNzaW5nIFNQSS4KICAqCiAgKiBJZiBubyBtYXRjaGluZyBQ SyByb3cgZXhpc3RzLCByZXBvcnQgdGhlIHZpb2xhdGlvbiB2aWEgcmlfUmVwb3J0VmlvbGF0aW9u KCksCiAgKiBvdGhlcndpc2UsIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vcm1hbGx5LgorICoKKyAq IE5vdGU6IFRoaXMgaXMgb25seSB1c2VkIGJ5IHRoZSBBTFRFUiBUQUJMRSB2YWxpZGF0aW9uIHBh dGguIE90aGVyIHBhdGhzIHVzZQorICogcmlfRmFzdFBhdGhCYXRjaEFkZCgpLgogICovCiBzdGF0 aWMgdm9pZAogcmlfRmFzdFBhdGhDaGVjayhjb25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZv LApAQCAtMjc2MSw2ICsyODQxLDMzMiBAQCByaV9GYXN0UGF0aENoZWNrKGNvbnN0IFJJX0NvbnN0 cmFpbnRJbmZvICpyaWluZm8sCiAJdGFibGVfY2xvc2UocGtfcmVsLCBOb0xvY2spOwogfQogCisv KgorICogcmlfRmFzdFBhdGhCYXRjaEFkZAorICoJCUJ1ZmZlciBhIEZLIHJvdyBmb3IgYmF0Y2hl ZCBwcm9iaW5nLgorICoKKyAqIEFkZHMgdGhlIHJvdyB0byB0aGUgYmF0Y2ggYnVmZmVyLiAgV2hl biB0aGUgYnVmZmVyIGlzIGZ1bGwsIGZsdXNoZXMgYWxsCisgKiBidWZmZXJlZCByb3dzIGJ5IHBy b2JpbmcgdGhlIFBLIGluZGV4LiAgQW55IHZpb2xhdGlvbiBpcyByZXBvcnRlZAorICogaW1tZWRp YXRlbHkgZHVyaW5nIHRoZSBmbHVzaCB2aWEgcmlfUmVwb3J0VmlvbGF0aW9uICh3aGljaCBkb2Vz IG5vdCByZXR1cm4pLgorICoKKyAqIFVzZXMgdGhlIHBlci1iYXRjaCBjYWNoZSAoUklfRmFzdFBh dGhFbnRyeSkgdG8gYXZvaWQgcGVyLXJvdyByZWxhdGlvbgorICogb3Blbi9jbG9zZSwgc2xvdCBj cmVhdGlvbiwgZXRjLgorICoKKyAqIFRoZSBiYXRjaCBpcyBhbHNvIGZsdXNoZWQgYXQgZW5kIG9m IHRyaWdnZXItZmlyaW5nIGN5Y2xlIHZpYQorICogcmlfRmFzdFBhdGhFbmRCYXRjaCgpLgorICov CitzdGF0aWMgdm9pZAorcmlfRmFzdFBhdGhCYXRjaEFkZChjb25zdCBSSV9Db25zdHJhaW50SW5m byAqcmlpbmZvLAorCQkJCQlSZWxhdGlvbiBma19yZWwsIFR1cGxlVGFibGVTbG90ICpuZXdzbG90 KQoreworCVJJX0Zhc3RQYXRoRW50cnkgKmZwZW50cnkgPSByaV9GYXN0UGF0aEdldEVudHJ5KHJp aW5mbywgZmtfcmVsKTsKKwlNZW1vcnlDb250ZXh0IG9sZGN4dDsKKworCW9sZGN4dCA9IE1lbW9y eUNvbnRleHRTd2l0Y2hUbyhmcGVudHJ5LT5mbHVzaF9jeHQpOworCWZwZW50cnktPmJhdGNoW2Zw ZW50cnktPmJhdGNoX2NvdW50XSA9CisJCUV4ZWNDb3B5U2xvdEhlYXBUdXBsZShuZXdzbG90KTsK KwlmcGVudHJ5LT5iYXRjaF9jb3VudCsrOworCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRjeHQp OworCisJaWYgKGZwZW50cnktPmJhdGNoX2NvdW50ID49IFJJX0ZBU1RQQVRIX0JBVENIX1NJWkUp CisJCXJpX0Zhc3RQYXRoQmF0Y2hGbHVzaChmcGVudHJ5LCBma19yZWwsIHJpaW5mbyk7Cit9CisK Ky8qCisgKiByaV9GYXN0UGF0aEJhdGNoRmx1c2gKKyAqCQlGbHVzaCBhbGwgYnVmZmVyZWQgRksg cm93cyBieSBwcm9iaW5nIHRoZSBQSyBpbmRleC4KKyAqCisgKiBEaXNwYXRjaGVzIHRvIHJpX0Zh c3RQYXRoRmx1c2hBcnJheSgpIGZvciBzaW5nbGUtY29sdW1uIEZLcworICogKHVzaW5nIFNLX1NF QVJDSEFSUkFZKSBvciByaV9GYXN0UGF0aEZsdXNoTG9vcCgpIGZvciBtdWx0aS1jb2x1bW4KKyAq IEZLcyAocGVyLXJvdyBwcm9iaW5nKS4gIFZpb2xhdGlvbnMgYXJlIHJlcG9ydGVkIGltbWVkaWF0 ZWx5IHZpYQorICogcmlfUmVwb3J0VmlvbGF0aW9uKCksIHdoaWNoIGRvZXMgbm90IHJldHVybi4K KyAqLworc3RhdGljIHZvaWQKK3JpX0Zhc3RQYXRoQmF0Y2hGbHVzaChSSV9GYXN0UGF0aEVudHJ5 ICpmcGVudHJ5LCBSZWxhdGlvbiBma19yZWwsCisJCQkJCSAgY29uc3QgUklfQ29uc3RyYWludElu Zm8gKnJpaW5mbykKK3sKKwlSZWxhdGlvbglwa19yZWwgPSBmcGVudHJ5LT5wa19yZWw7CisJUmVs YXRpb24JaWR4X3JlbCA9IGZwZW50cnktPmlkeF9yZWw7CisJVHVwbGVUYWJsZVNsb3QgKmZrX3Ns b3QgPSBmcGVudHJ5LT5ma19zbG90OworCVNuYXBzaG90CXNuYXBzaG90OworCUluZGV4U2NhbkRl c2Mgc2NhbmRlc2M7CisJT2lkCQkJc2F2ZWRfdXNlcmlkOworCWludAkJCXNhdmVkX3NlY19jb250 ZXh0OworCU1lbW9yeUNvbnRleHQgb2xkY3h0OworCWludAkJCXZpb2xhdGlvbl9pbmRleDsKKwor CWlmIChmcGVudHJ5LT5iYXRjaF9jb3VudCA9PSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEND SSBhbmQgc2VjdXJpdHkgY29udGV4dCBzd2l0Y2ggYXJlIGRvbmUgb25jZSBmb3IgdGhlIGVudGly ZSBiYXRjaC4KKwkgKiBQZXItcm93IENDSSBpcyB1bm5lY2Vzc2FyeSBiZWNhdXNlIGJ5IHRoZSB0 aW1lIGEgZmx1c2ggcnVucywgYWxsIEFGVEVSCisJICogdHJpZ2dlcnMgZm9yIHRoZSBidWZmZXJl ZCByb3dzIGhhdmUgYWxyZWFkeSBmaXJlZCAodHJpZ2dlciBpbnZvY2F0aW9ucworCSAqIHN0cmlj dGx5IGFsdGVybmF0ZSBwZXIgcm93KSwgc28gYSBzaW5nbGUgQ0NJIGFkdmFuY2VzIHBhc3QgYWxs IHRoZWlyCisJICogZWZmZWN0cy4gIFBlci1yb3cgc2VjdXJpdHkgY29udGV4dCBzd2l0Y2ggaXMg dW5uZWNlc3NhcnkgYmVjYXVzZSBlYWNoCisJICogcm93J3MgcHJvYmUgcnVucyBlbnRpcmVseSBh cyB0aGUgUEsgdGFibGUgb3duZXIsIHNhbWUgYXMgdGhlIFNQSSBwYXRoCisJICogLS0gdGhlIG9u bHkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBTUEkgcGF0aCBzZXRzIGFuZCByZXN0b3JlcyB0aGUK KwkgKiBjb250ZXh0IHBlciByb3cgd2hlcmVhcyB3ZSBkbyBpdCBvbmNlIGFyb3VuZCB0aGUgd2hv bGUgYmF0Y2guCisJICovCisJQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQoKTsKKwlzbmFwc2hvdCA9 IFJlZ2lzdGVyU25hcHNob3QoR2V0VHJhbnNhY3Rpb25TbmFwc2hvdCgpKTsKKworCS8qCisJICog YnVpbGRfaW5kZXhfc2NhbmtleXMoKSBtYXkgcGFsbG9jIGNhc3QgcmVzdWx0cyBmb3IgY3Jvc3Mt dHlwZSBGS3MuIFVzZQorCSAqIHRoZSBlbnRyeSdzIHNob3J0LWxpdmVkIGZsdXNoIGNvbnRleHQg c28gdGhlc2UgZG9uJ3QgYWNjdW11bGF0ZSBhY3Jvc3MKKwkgKiBiYXRjaGVzLgorCSAqLworCW9s ZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhmcGVudHJ5LT5mbHVzaF9jeHQpOworCisJc2Nh bmRlc2MgPSBpbmRleF9iZWdpbnNjYW4ocGtfcmVsLCBpZHhfcmVsLCBzbmFwc2hvdCwgTlVMTCwK KwkJCQkJCQkgICByaWluZm8tPm5rZXlzLCAwLCBTT19OT05FKTsKKworCUdldFVzZXJJZEFuZFNl Y0NvbnRleHQoJnNhdmVkX3VzZXJpZCwgJnNhdmVkX3NlY19jb250ZXh0KTsKKwlTZXRVc2VySWRB bmRTZWNDb250ZXh0KFJlbGF0aW9uR2V0Rm9ybShwa19yZWwpLT5yZWxvd25lciwKKwkJCQkJCSAg IHNhdmVkX3NlY19jb250ZXh0IHwKKwkJCQkJCSAgIFNFQ1VSSVRZX0xPQ0FMX1VTRVJJRF9DSEFO R0UgfAorCQkJCQkJICAgU0VDVVJJVFlfTk9GT1JDRV9STFMpOworCisJLyoKKwkgKiBDaGVjayB0 aGF0IHRoZSBjdXJyZW50IHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHBrX3JlbC4gRG9u ZSBoZXJlCisJICogcmF0aGVyIHRoYW4gYXQgZW50cnkgY3JlYXRpb24gc28gdGhhdCBwZXJtaXNz aW9uIGNoYW5nZXMgYmV0d2VlbgorCSAqIGZsdXNoZXMgYXJlIHJlc3BlY3RlZCwgbWF0Y2hpbmcg dGhlIHBlci1yb3cgYmVoYXZpb3Igb2YgdGhlIFNQSSBwYXRoLAorCSAqIGFsYmVpdCBjaGVja2Vk IG9uY2UgcGVyIGZsdXNoIHJhdGhlciB0aGFuIG9uY2UgcGVyIHJvdywgbGlrZSBpbgorCSAqIHJp X0Zhc3RQYXRoQ2hlY2soKS4KKwkgKi8KKwlyaV9DaGVja1Blcm1pc3Npb25zKHBrX3JlbCk7CisK KwlpZiAocmlpbmZvLT5mcG1ldGEgPT0gTlVMTCkKKwl7CisJCS8qIFJlbG9hZCB0byBlbnN1cmUg aXQncyB2YWxpZC4gKi8KKwkJcmlpbmZvID0gcmlfTG9hZENvbnN0cmFpbnRJbmZvKHJpaW5mby0+ Y29uc3RyYWludF9pZCk7CisJCXJpX3BvcHVsYXRlX2Zhc3RwYXRoX21ldGFkYXRhKChSSV9Db25z dHJhaW50SW5mbyAqKSByaWluZm8sCisJCQkJCQkJCQkgIGZrX3JlbCwgaWR4X3JlbCk7CisJfQor CUFzc2VydChyaWluZm8tPmZwbWV0YSk7CisKKwkvKiBTa2lwIGFycmF5IG92ZXJoZWFkIGZvciBz aW5nbGUtcm93IGJhdGNoZXMuICovCisJaWYgKHJpaW5mby0+bmtleXMgPT0gMSAmJiBmcGVudHJ5 LT5iYXRjaF9jb3VudCA+IDEpCisJCXZpb2xhdGlvbl9pbmRleCA9IHJpX0Zhc3RQYXRoRmx1c2hB cnJheShmcGVudHJ5LCBma19zbG90LCByaWluZm8sCisJCQkJCQkJCQkJCQlma19yZWwsIHNuYXBz aG90LCBzY2FuZGVzYyk7CisJZWxzZQorCQl2aW9sYXRpb25faW5kZXggPSByaV9GYXN0UGF0aEZs dXNoTG9vcChmcGVudHJ5LCBma19zbG90LCByaWluZm8sCisJCQkJCQkJCQkJCSAgIGZrX3JlbCwg c25hcHNob3QsIHNjYW5kZXNjKTsKKworCVNldFVzZXJJZEFuZFNlY0NvbnRleHQoc2F2ZWRfdXNl cmlkLCBzYXZlZF9zZWNfY29udGV4dCk7CisJVW5yZWdpc3RlclNuYXBzaG90KHNuYXBzaG90KTsK KwlpbmRleF9lbmRzY2FuKHNjYW5kZXNjKTsKKworCWlmICh2aW9sYXRpb25faW5kZXggPj0gMCkK Kwl7CisJCUV4ZWNTdG9yZUhlYXBUdXBsZShmcGVudHJ5LT5iYXRjaFt2aW9sYXRpb25faW5kZXhd LCBma19zbG90LCBmYWxzZSk7CisJCXJpX1JlcG9ydFZpb2xhdGlvbihyaWluZm8sIHBrX3JlbCwg ZmtfcmVsLAorCQkJCQkJICAgZmtfc2xvdCwgTlVMTCwKKwkJCQkJCSAgIFJJX1BMQU5fQ0hFQ0tf TE9PS1VQUEssIGZhbHNlLCBmYWxzZSk7CisJfQorCisJTWVtb3J5Q29udGV4dFJlc2V0KGZwZW50 cnktPmZsdXNoX2N4dCk7CisJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7CisKKwkvKiBS ZXNldC4gKi8KKwlmcGVudHJ5LT5iYXRjaF9jb3VudCA9IDA7Cit9CisKKy8qCisgKiByaV9GYXN0 UGF0aEZsdXNoTG9vcAorICoJCU11bHRpLWNvbHVtbiBmYWxsYmFjazogcHJvYmUgdGhlIGluZGV4 IG9uY2UgcGVyIGJ1ZmZlcmVkIHJvdy4KKyAqCisgKiBVc2VkIGZvciBjb21wb3NpdGUgZm9yZWln biBrZXlzIHdoZXJlIFNLX1NFQVJDSEFSUkFZIGRvZXMgbm90CisgKiBhcHBseSwgYW5kIGFsc28g Zm9yIHNpbmdsZS1yb3cgYmF0Y2hlcyBvZiBzaW5nbGUtY29sdW1uIEZLcyB3aGVyZQorICogdGhl IGFycmF5IG92ZXJoZWFkIGlzIG5vdCB3b3J0aCBpdC4KKyAqCisgKiBSZXR1cm5zIHRoZSBpbmRl eCBvZiB0aGUgZmlyc3QgdmlvbGF0aW5nIHJvdyBpbiB0aGUgYmF0Y2ggYXJyYXksIG9yIC0xIGlm CisgKiBhbGwgcm93cyBhcmUgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQKK3JpX0Zhc3RQYXRoRmx1 c2hMb29wKFJJX0Zhc3RQYXRoRW50cnkgKmZwZW50cnksIFR1cGxlVGFibGVTbG90ICpma19zbG90 LAorCQkJCQkgY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywgUmVsYXRpb24gZmtfcmVs LAorCQkJCQkgU25hcHNob3Qgc25hcHNob3QsIEluZGV4U2NhbkRlc2Mgc2NhbmRlc2MpCit7CisJ UmVsYXRpb24JcGtfcmVsID0gZnBlbnRyeS0+cGtfcmVsOworCVJlbGF0aW9uCWlkeF9yZWwgPSBm cGVudHJ5LT5pZHhfcmVsOworCVR1cGxlVGFibGVTbG90ICpwa19zbG90ID0gZnBlbnRyeS0+cGtf c2xvdDsKKwlEYXR1bQkJcGtfdmFsc1tJTkRFWF9NQVhfS0VZU107CisJY2hhcgkJcGtfbnVsbHNb SU5ERVhfTUFYX0tFWVNdOworCVNjYW5LZXlEYXRhIHNrZXlbSU5ERVhfTUFYX0tFWVNdOworCWJv b2wJCWZvdW5kID0gdHJ1ZTsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgZnBlbnRyeS0+YmF0Y2hf Y291bnQ7IGkrKykKKwl7CisJCUV4ZWNTdG9yZUhlYXBUdXBsZShmcGVudHJ5LT5iYXRjaFtpXSwg Zmtfc2xvdCwgZmFsc2UpOworCQlyaV9FeHRyYWN0VmFsdWVzKGZrX3JlbCwgZmtfc2xvdCwgcmlp bmZvLCBmYWxzZSwgcGtfdmFscywgcGtfbnVsbHMpOworCQlidWlsZF9pbmRleF9zY2Fua2V5cyhy aWluZm8sIGlkeF9yZWwsIHBrX3ZhbHMsIHBrX251bGxzLCBza2V5KTsKKworCQlmb3VuZCA9IHJp X0Zhc3RQYXRoUHJvYmVPbmUocGtfcmVsLCBpZHhfcmVsLCBzY2FuZGVzYywgcGtfc2xvdCwKKwkJ CQkJCQkJCXNuYXBzaG90LCByaWluZm8sIHNrZXksIHJpaW5mby0+bmtleXMpOworCisJCS8qIFJl cG9ydCBmaXJzdCB1bm1hdGNoZWQgcm93ICovCisJCWlmICghZm91bmQpCisJCQlyZXR1cm4gaTsK Kwl9CisKKwkvKiBBbGwgcGFzcy4gKi8KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiByaV9GYXN0 UGF0aEZsdXNoQXJyYXkKKyAqCQlTaW5nbGUtY29sdW1uIGZhc3QgcGF0aCB1c2luZyBTS19TRUFS Q0hBUlJBWS4KKyAqCisgKiBCdWlsZHMgYW4gYXJyYXkgb2YgRksgdmFsdWVzIGFuZCBkb2VzIG9u ZSBpbmRleCBzY2FuIHdpdGgKKyAqIFNLX1NFQVJDSEFSUkFZLiAgVGhlIGluZGV4IEFNIHNvcnRz IGFuZCBkZWR1cGxpY2F0ZXMgdGhlIGFycmF5CisgKiBpbnRlcm5hbGx5LCB0aGVuIHdhbGtzIG1h dGNoaW5nIGxlYWYgcGFnZXMgaW4gb3JkZXIuICBFYWNoCisgKiBtYXRjaGVkIFBLIHR1cGxlIGlz IGxvY2tlZCBhbmQgcmVjaGVja2VkIGFzIGJlZm9yZTsgYSBtYXRjaGVkW10KKyAqIGJpdG1hcCB0 cmFja3Mgd2hpY2ggYmF0Y2ggaXRlbXMgd2VyZSBzYXRpc2ZpZWQuCisgKgorICogUmV0dXJucyB0 aGUgaW5kZXggb2YgdGhlIGZpcnN0IHZpb2xhdGluZyByb3cgaW4gdGhlIGJhdGNoIGFycmF5LCBv ciAtMSBpZgorICogYWxsIHJvd3MgYXJlIHZhbGlkLgorICovCitzdGF0aWMgaW50CityaV9GYXN0 UGF0aEZsdXNoQXJyYXkoUklfRmFzdFBhdGhFbnRyeSAqZnBlbnRyeSwgVHVwbGVUYWJsZVNsb3Qg KmZrX3Nsb3QsCisJCQkJCSAgY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywgUmVsYXRp b24gZmtfcmVsLAorCQkJCQkgIFNuYXBzaG90IHNuYXBzaG90LCBJbmRleFNjYW5EZXNjIHNjYW5k ZXNjKQoreworCUZhc3RQYXRoTWV0YSAqZnBtZXRhID0gcmlpbmZvLT5mcG1ldGE7CisJUmVsYXRp b24JcGtfcmVsID0gZnBlbnRyeS0+cGtfcmVsOworCVJlbGF0aW9uCWlkeF9yZWwgPSBmcGVudHJ5 LT5pZHhfcmVsOworCVR1cGxlVGFibGVTbG90ICpwa19zbG90ID0gZnBlbnRyeS0+cGtfc2xvdDsK KwlEYXR1bQkJc2VhcmNoX3ZhbHNbUklfRkFTVFBBVEhfQkFUQ0hfU0laRV07CisJYm9vbAkJbWF0 Y2hlZFtSSV9GQVNUUEFUSF9CQVRDSF9TSVpFXTsKKwlpbnQJCQludmFscyA9IGZwZW50cnktPmJh dGNoX2NvdW50OworCURhdHVtCQlwa192YWxzW0lOREVYX01BWF9LRVlTXTsKKwljaGFyCQlwa19u dWxsc1tJTkRFWF9NQVhfS0VZU107CisJU2NhbktleURhdGEgc2tleVsxXTsKKwlGbWdySW5mbyAg ICpjYXN0X2Z1bmNfZmluZm87CisJRm1nckluZm8gICAqZXFfb3ByX2ZpbmZvOworCU9pZAkJCWVs ZW1fdHlwZTsKKwlpbnQxNgkJZWxlbV9sZW47CisJYm9vbAkJZWxlbV9ieXZhbDsKKwljaGFyCQll bGVtX2FsaWduOworCUFycmF5VHlwZSAgKmFycjsKKworCUFzc2VydChmcG1ldGEpOworCisJbWVt c2V0KG1hdGNoZWQsIDAsIG52YWxzICogc2l6ZW9mKGJvb2wpKTsKKworCS8qCisJICogRXh0cmFj dCBGSyB2YWx1ZXMsIGNhc3RpbmcgdG8gdGhlIG9wZXJhdG9yJ3MgZXhwZWN0ZWQgaW5wdXQgdHlw ZSBpZgorCSAqIG5lZWRlZCAoZS5nLiBpbnQ4IEZLIC0+IGludDQgZm9yIGludDQ4ZXEpLgorCSAq LworCWNhc3RfZnVuY19maW5mbyA9ICZmcG1ldGEtPmNhc3RfZnVuY19maW5mb1swXTsKKwllcV9v cHJfZmluZm8gPSAmZnBtZXRhLT5lcV9vcHJfZmluZm9bMF07CisJZm9yIChpbnQgaSA9IDA7IGkg PCBudmFsczsgaSsrKQorCXsKKwkJRXhlY1N0b3JlSGVhcFR1cGxlKGZwZW50cnktPmJhdGNoW2ld LCBma19zbG90LCBmYWxzZSk7CisJCXJpX0V4dHJhY3RWYWx1ZXMoZmtfcmVsLCBma19zbG90LCBy aWluZm8sIGZhbHNlLCBwa192YWxzLCBwa19udWxscyk7CisKKwkJLyogQ2FzdCBpZiBuZWVkZWQg KGUuZy4gaW50OCBGSyAtPiBudW1lcmljIFBLKSAqLworCQlpZiAoT2lkSXNWYWxpZChjYXN0X2Z1 bmNfZmluZm8tPmZuX29pZCkpCisJCQlzZWFyY2hfdmFsc1tpXSA9IEZ1bmN0aW9uQ2FsbDMoY2Fz dF9mdW5jX2ZpbmZvLAorCQkJCQkJCQkJCSAgIHBrX3ZhbHNbMF0sCisJCQkJCQkJCQkJICAgSW50 MzJHZXREYXR1bSgtMSksCisJCQkJCQkJCQkJICAgQm9vbEdldERhdHVtKGZhbHNlKSk7CisJCWVs c2UKKwkJCXNlYXJjaF92YWxzW2ldID0gcGtfdmFsc1swXTsKKwl9CisKKwkvKgorCSAqIEFycmF5 IGVsZW1lbnQgdHlwZSBtdXN0IG1hdGNoIHRoZSBvcGVyYXRvcidzIHJpZ2h0LWhhbmQgaW5wdXQg dHlwZSwKKwkgKiB3aGljaCBpcyB3aGF0IHRoZSBpbmRleCBjb21wYXJpc29uIGV4cGVjdHMgb24g dGhlIHNlYXJjaCBzaWRlLgorCSAqIHJpX3BvcHVsYXRlX2Zhc3RwYXRoX21ldGFkYXRhKCkgc3Rv cmVzIGV4YWN0bHkgdGhpcyB2aWEKKwkgKiBnZXRfb3Bfb3BmYW1pbHlfcHJvcGVydGllcygpLCB3 aGljaCByZXR1cm5zIHRoZSBvcGVyYXRvcidzIHJpZ2h0LWhhbmQKKwkgKiB0eXBlIGFzIHRoZSBz dWJ0eXBlIGZvciBjcm9zcy10eXBlIG9wZXJhdG9ycyAoZS5nLiBpbnQ4IGZvciBpbnQ0OGVxKQor CSAqIGFuZCB0aGUgY29tbW9uIHR5cGUgZm9yIHNhbWUtdHlwZSBvcGVyYXRvcnMuCisJICovCisJ ZWxlbV90eXBlID0gZnBtZXRhLT5zdWJ0eXBlc1swXTsKKwlBc3NlcnQoT2lkSXNWYWxpZChlbGVt X3R5cGUpKTsKKwlnZXRfdHlwbGVuYnl2YWxhbGlnbihlbGVtX3R5cGUsICZlbGVtX2xlbiwgJmVs ZW1fYnl2YWwsICZlbGVtX2FsaWduKTsKKworCWFyciA9IGNvbnN0cnVjdF9hcnJheShzZWFyY2hf dmFscywgbnZhbHMsCisJCQkJCQkgIGVsZW1fdHlwZSwgZWxlbV9sZW4sIGVsZW1fYnl2YWwsIGVs ZW1fYWxpZ24pOworCisJLyoKKwkgKiBCdWlsZCBzY2FuIGtleSB3aXRoIFNLX1NFQVJDSEFSUkFZ LiAgVGhlIGluZGV4IEFNIGNvZGUgd2lsbCBpbnRlcm5hbGx5CisJICogc29ydCBhbmQgZGVkdXBs aWNhdGUsIHRoZW4gd2FsayBsZWFmIHBhZ2VzIGluIG9yZGVyLgorCSAqCisJICogUEsgaW5kZXhl cyBhcmUgYWx3YXlzIGJ0cmVlLCB3aGljaCBzdXBwb3J0cyBTS19TRUFSQ0hBUlJBWS4KKwkgKi8K KwlBc3NlcnQoaWR4X3JlbC0+cmRfaW5kYW0tPmFtc2VhcmNoYXJyYXkpOworCVNjYW5LZXlFbnRy eUluaXRpYWxpemUoJnNrZXlbMF0sCisJCQkJCQkgICBTS19TRUFSQ0hBUlJBWSwKKwkJCQkJCSAg IDEsCS8qIGF0dG5vICovCisJCQkJCQkgICBmcG1ldGEtPnN0cmF0c1swXSwKKwkJCQkJCSAgIGZw bWV0YS0+c3VidHlwZXNbMF0sCisJCQkJCQkgICBpZHhfcmVsLT5yZF9pbmRjb2xsYXRpb25bMF0s CisJCQkJCQkgICBmcG1ldGEtPnJlZ29wc1swXSwKKwkJCQkJCSAgIFBvaW50ZXJHZXREYXR1bShh cnIpKTsKKworCWluZGV4X3Jlc2NhbihzY2FuZGVzYywgc2tleSwgMSwgTlVMTCwgMCk7CisKKwkv KgorCSAqIFdhbGsgYWxsIG1hdGNoZXMuICBUaGUgaW5kZXggQU0gcmV0dXJucyB0aGVtIGluIGlu ZGV4IG9yZGVyLiAgRm9yIGVhY2gKKwkgKiBtYXRjaCwgZmluZCB3aGljaCBiYXRjaCBpdGVtKHMp IGl0IHNhdGlzZmllcy4KKwkgKi8KKwl3aGlsZSAoaW5kZXhfZ2V0bmV4dF9zbG90KHNjYW5kZXNj LCBGb3J3YXJkU2NhbkRpcmVjdGlvbiwgcGtfc2xvdCkpCisJeworCQlEYXR1bQkJZm91bmRfdmFs OworCQlib29sCQlmb3VuZF9udWxsOworCQlib29sCQljb25jdXJyZW50bHlfdXBkYXRlZDsKKwkJ U2NhbktleURhdGEgcmVjaGVja19za2V5WzFdOworCisJCWlmICghcmlfTG9ja1BLVHVwbGUocGtf cmVsLCBwa19zbG90LCBzbmFwc2hvdCwgJmNvbmN1cnJlbnRseV91cGRhdGVkKSkKKwkJCWNvbnRp bnVlOworCisJCS8qIEV4dHJhY3QgdGhlIFBLIHZhbHVlIGZyb20gdGhlIG1hdGNoZWQgYW5kIGxv Y2tlZCB0dXBsZSAqLworCQlmb3VuZF92YWwgPSBzbG90X2dldGF0dHIocGtfc2xvdCwgcmlpbmZv LT5wa19hdHRudW1zWzBdLCAmZm91bmRfbnVsbCk7CisJCUFzc2VydCghZm91bmRfbnVsbCk7CisK KwkJaWYgKGNvbmN1cnJlbnRseV91cGRhdGVkKQorCQl7CisJCQkvKgorCQkJICogQnVpbGQgYSBz aW5nbGUta2V5IHNjYW5rZXkgZm9yIHJlY2hlY2suICBXZSBuZWVkIHRoZSBhY3R1YWwgUEsKKwkJ CSAqIHZhbHVlIHRoYXQgd2FzIGZvdW5kLCBub3QgdGhlIEZLIHNlYXJjaCB2YWx1ZS4KKwkJCSAq LworCQkJU2NhbktleUVudHJ5SW5pdGlhbGl6ZSgmcmVjaGVja19za2V5WzBdLCAwLCAxLAorCQkJ CQkJCQkgICBmcG1ldGEtPnN0cmF0c1swXSwKKwkJCQkJCQkJICAgZnBtZXRhLT5zdWJ0eXBlc1sw XSwKKwkJCQkJCQkJICAgaWR4X3JlbC0+cmRfaW5kY29sbGF0aW9uWzBdLAorCQkJCQkJCQkgICBm cG1ldGEtPnJlZ29wc1swXSwKKwkJCQkJCQkJICAgZm91bmRfdmFsKTsKKwkJCWlmICghcmVjaGVj a19tYXRjaGVkX3BrX3R1cGxlKGlkeF9yZWwsIHJlY2hlY2tfc2tleSwgcGtfc2xvdCkpCisJCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBMaW5lYXIgc2NhbiB0byBtYXJrIGFsbCBiYXRj aCBpdGVtcyBtYXRjaGluZyB0aGlzIFBLIHZhbHVlLgorCQkgKiBPKGJhdGNoX3NpemUpIHBlciBt YXRjaCwgTyhiYXRjaF9zaXplXjIpIHdvcnN0IGNhc2UgLS0gZmluZSBmb3IgdGhlCisJCSAqIGN1 cnJlbnQgYmF0Y2ggc2l6ZSBvZiA2NC4KKwkJICovCisJCWZvciAoaW50IGkgPSAwOyBpIDwgbnZh bHM7IGkrKykKKwkJeworCQkJaWYgKCFtYXRjaGVkW2ldICYmCisJCQkJRGF0dW1HZXRCb29sKEZ1 bmN0aW9uQ2FsbDJDb2xsKGVxX29wcl9maW5mbywKKwkJCQkJCQkJCQkJICAgaWR4X3JlbC0+cmRf aW5kY29sbGF0aW9uWzBdLAorCQkJCQkJCQkJCQkgICBmb3VuZF92YWwsCisJCQkJCQkJCQkJCSAg IHNlYXJjaF92YWxzW2ldKSkpCisJCQkJbWF0Y2hlZFtpXSA9IHRydWU7CisJCX0KKwl9CisKKwkv KiBSZXBvcnQgZmlyc3QgdW5tYXRjaGVkIHJvdyAqLworCWZvciAoaW50IGkgPSAwOyBpIDwgbnZh bHM7IGkrKykKKwkJaWYgKCFtYXRjaGVkW2ldKQorCQkJcmV0dXJuIGk7CisKKwkvKiBBbGwgcGFz cy4gKi8KKwlyZXR1cm4gLTE7Cit9CisKIC8qCiAgKiByaV9GYXN0UGF0aFByb2JlT25lCiAgKgkJ UHJvYmUgdGhlIFBLIGluZGV4IGZvciBvbmUgc2V0IG9mIHNjYW4ga2V5cywgbG9jayB0aGUgbWF0 Y2hpbmcKQEAgLTM2ODcsMyArNDA5MywxOTcgQEAgUklfRktleV90cmlnZ2VyX3R5cGUoT2lkIHRn Zm9pZCkKIAogCXJldHVybiBSSV9UUklHR0VSX05PTkU7CiB9CisKKy8qCisgKiByaV9GYXN0UGF0 aEVuZEJhdGNoCisgKgkJRmx1c2ggcmVtYWluaW5nIHJvd3MgYW5kIHRlYXIgZG93biBjYWNoZWQg c3RhdGUuCisgKgorICogUmVnaXN0ZXJlZCBhcyBhbiBBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNr LiAgTm90ZTogdGhlIGZsdXNoIGNhbgorICogZG8gcmVhbCB3b3JrIChDQ0ksIHNlY3VyaXR5IGNv bnRleHQgc3dpdGNoLCBpbmRleCBwcm9iZXMpIGFuZCBjYW4KKyAqIHRocm93IEVSUk9SIG9uIGEg Y29uc3RyYWludCB2aW9sYXRpb24uICBJZiB0aGF0IGhhcHBlbnMsCisgKiByaV9GYXN0UGF0aFRl YXJkb3duIG5ldmVyIHJ1bnM7IFJlc291cmNlT3duZXIgKyBYYWN0Q2FsbGJhY2sKKyAqIGhhbmRs ZSByZXNvdXJjZSBjbGVhbnVwIG9uIHRoZSBhYm9ydCBwYXRoLgorICovCitzdGF0aWMgdm9pZAor cmlfRmFzdFBhdGhFbmRCYXRjaCh2b2lkICphcmcpCit7CisJSEFTSF9TRVFfU1RBVFVTIHN0YXR1 czsKKwlSSV9GYXN0UGF0aEVudHJ5ICplbnRyeTsKKworCWlmIChyaV9mYXN0cGF0aF9jYWNoZSA9 PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBGbHVzaCBhbnkgcGFydGlhbCBiYXRjaGVzIC0tIGNh biB0aHJvdyBFUlJPUiAqLworCWhhc2hfc2VxX2luaXQoJnN0YXR1cywgcmlfZmFzdHBhdGhfY2Fj aGUpOworCXdoaWxlICgoZW50cnkgPSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwp CisJeworCQlpZiAoZW50cnktPmJhdGNoX2NvdW50ID4gMCkKKwkJeworCQkJUmVsYXRpb24JZmtf cmVsID0gdGFibGVfb3BlbihlbnRyeS0+ZmtfcmVsaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJCQlj b25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZvID0gcmlfTG9hZENvbnN0cmFpbnRJbmZvKGVu dHJ5LT5jb25vaWQpOworCisJCQlyaV9GYXN0UGF0aEJhdGNoRmx1c2goZW50cnksIGZrX3JlbCwg cmlpbmZvKTsKKwkJCXRhYmxlX2Nsb3NlKGZrX3JlbCwgTm9Mb2NrKTsKKwkJfQorCX0KKworCS8q IE9yZGVybHkgdGVhcmRvd24gKi8KKwlyaV9GYXN0UGF0aFRlYXJkb3duKCk7Cit9CisKKy8qCisg KiByaV9GYXN0UGF0aFRlYXJkb3duCisgKgkJVGVhciBkb3duIGFsbCBjYWNoZWQgZmFzdC1wYXRo IHN0YXRlLgorICoKKyAqIENhbGxlZCBmcm9tIHJpX0Zhc3RQYXRoRW5kQmF0Y2goKSBhZnRlciBm bHVzaGluZyBhbnkgcmVtYWluaW5nIHJvd3MuCisgKi8KK3N0YXRpYyB2b2lkCityaV9GYXN0UGF0 aFRlYXJkb3duKHZvaWQpCit7CisJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKKwlSSV9GYXN0UGF0 aEVudHJ5ICplbnRyeTsKKworCWlmIChyaV9mYXN0cGF0aF9jYWNoZSA9PSBOVUxMKQorCQlyZXR1 cm47CisKKwloYXNoX3NlcV9pbml0KCZzdGF0dXMsIHJpX2Zhc3RwYXRoX2NhY2hlKTsKKwl3aGls ZSAoKGVudHJ5ID0gaGFzaF9zZXFfc2VhcmNoKCZzdGF0dXMpKSAhPSBOVUxMKQorCXsKKwkJaWYg KGVudHJ5LT5pZHhfcmVsKQorCQkJaW5kZXhfY2xvc2UoZW50cnktPmlkeF9yZWwsIE5vTG9jayk7 CisJCWlmIChlbnRyeS0+cGtfcmVsKQorCQkJdGFibGVfY2xvc2UoZW50cnktPnBrX3JlbCwgTm9M b2NrKTsKKwkJaWYgKGVudHJ5LT5wa19zbG90KQorCQkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxl U2xvdChlbnRyeS0+cGtfc2xvdCk7CisJCWlmIChlbnRyeS0+Zmtfc2xvdCkKKwkJCUV4ZWNEcm9w U2luZ2xlVHVwbGVUYWJsZVNsb3QoZW50cnktPmZrX3Nsb3QpOworCQlpZiAoZW50cnktPmZsdXNo X2N4dCkKKwkJCU1lbW9yeUNvbnRleHREZWxldGUoZW50cnktPmZsdXNoX2N4dCk7CisJfQorCisJ aGFzaF9kZXN0cm95KHJpX2Zhc3RwYXRoX2NhY2hlKTsKKwlyaV9mYXN0cGF0aF9jYWNoZSA9IE5V TEw7CisJcmlfZmFzdHBhdGhfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZhbHNlOworfQorCitzdGF0 aWMgYm9vbCByaV9mYXN0cGF0aF94YWN0X2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSBmYWxzZTsKKwor c3RhdGljIHZvaWQKK3JpX0Zhc3RQYXRoWGFjdENhbGxiYWNrKFhhY3RFdmVudCBldmVudCwgdm9p ZCAqYXJnKQoreworCS8qCisJICogT24gYWJvcnQsIFJlc291cmNlT3duZXIgYWxyZWFkeSByZWxl YXNlZCByZWxhdGlvbnM7IG9uIGNvbW1pdCwKKwkgKiByaV9GYXN0UGF0aFRlYXJkb3duIGFscmVh ZHkgcmFuLiAgRWl0aGVyIHdheSwganVzdCBOVUxMIHRoZSBzdGF0aWMKKwkgKiBwb2ludGVycyBz byB0aGV5IGRvbid0IGRhbmdsZSBpbnRvIHRoZSBuZXh0IHRyYW5zYWN0aW9uLgorCSAqLworCXJp X2Zhc3RwYXRoX2NhY2hlID0gTlVMTDsKKwlyaV9mYXN0cGF0aF9jYWxsYmFja19yZWdpc3RlcmVk ID0gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkCityaV9GYXN0UGF0aFN1YlhhY3RDYWxsYmFjayhT dWJYYWN0RXZlbnQgZXZlbnQsIFN1YlRyYW5zYWN0aW9uSWQgbXlTdWJpZCwKKwkJCQkJCSAgIFN1 YlRyYW5zYWN0aW9uSWQgcGFyZW50U3ViaWQsIHZvaWQgKmFyZykKK3sKKwlpZiAoZXZlbnQgPT0g U1VCWEFDVF9FVkVOVF9BQk9SVF9TVUIpCisJeworCQkvKgorCQkgKiBSZXNvdXJjZU93bmVyIGFs cmVhZHkgcmVsZWFzZWQgcmVsYXRpb25zLiAgTlVMTCB0aGUgc3RhdGljIHBvaW50ZXJzCisJCSAq IHNvIHRoZSBzdGlsbC1yZWdpc3RlcmVkIGJhdGNoIGNhbGxiYWNrIGJlY29tZXMgYSBuby1vcCBm b3IgdGhlIHJlc3QKKwkJICogb2YgdGhpcyB0cmFuc2FjdGlvbi4KKwkJICovCisJCXJpX2Zhc3Rw YXRoX2NhY2hlID0gTlVMTDsKKwkJcmlfZmFzdHBhdGhfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZh bHNlOworCX0KK30KKworLyoKKyAqIHJpX0Zhc3RQYXRoR2V0RW50cnkKKyAqCQlMb29rIHVwIG9y IGNyZWF0ZSBhIHBlci1iYXRjaCBjYWNoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIGNvbnN0cmFpbnQu CisgKgorICogT24gZmlyc3QgY2FsbCBmb3IgYSBjb25zdHJhaW50IHdpdGhpbiBhIGJhdGNoOiBv cGVucyBwa19yZWwgYW5kIHRoZSBpbmRleCwKKyAqIGFsbG9jYXRlcyBzbG90cyBmb3IgYm90aCBG SyByb3cgYW5kIHRoZSBsb29rZWQgdXAgUEsgcm93LCBhbmQgcmVnaXN0ZXJzIHRoZQorICogY2xl YW51cCBjYWxsYmFjay4KKyAqCisgKiBPbiBzdWJzZXF1ZW50IGNhbGxzOiByZXR1cm5zIHRoZSBl eGlzdGluZyBlbnRyeS4KKyAqLworc3RhdGljIFJJX0Zhc3RQYXRoRW50cnkgKgorcmlfRmFzdFBh dGhHZXRFbnRyeShjb25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZvLCBSZWxhdGlvbiBma19y ZWwpCit7CisJUklfRmFzdFBhdGhFbnRyeSAqZW50cnk7CisJYm9vbAkJZm91bmQ7CisKKwkvKiBD cmVhdGUgaGFzaCB0YWJsZSBvbiBmaXJzdCB1c2UgaW4gdGhpcyBiYXRjaCAqLworCWlmIChyaV9m YXN0cGF0aF9jYWNoZSA9PSBOVUxMKQorCXsKKwkJSEFTSENUTAkJY3RsOworCisJCWlmICghcmlf ZmFzdHBhdGhfeGFjdF9jYWxsYmFja19yZWdpc3RlcmVkKQorCQl7CisJCQlSZWdpc3RlclhhY3RD YWxsYmFjayhyaV9GYXN0UGF0aFhhY3RDYWxsYmFjaywgTlVMTCk7CisJCQlSZWdpc3RlclN1Ylhh Y3RDYWxsYmFjayhyaV9GYXN0UGF0aFN1YlhhY3RDYWxsYmFjaywgTlVMTCk7CisJCQlyaV9mYXN0 cGF0aF94YWN0X2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSB0cnVlOworCQl9CisKKwkJY3RsLmtleXNp emUgPSBzaXplb2YoT2lkKTsKKwkJY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihSSV9GYXN0UGF0aEVu dHJ5KTsKKwkJY3RsLmhjeHQgPSBUb3BUcmFuc2FjdGlvbkNvbnRleHQ7CisJCXJpX2Zhc3RwYXRo X2NhY2hlID0gaGFzaF9jcmVhdGUoIlJJIGZhc3QtcGF0aCBjYWNoZSIsCisJCQkJCQkJCQkJMTYs CisJCQkJCQkJCQkJJmN0bCwKKwkJCQkJCQkJCQlIQVNIX0VMRU0gfCBIQVNIX0JMT0JTIHwgSEFT SF9DT05URVhUKTsKKwl9CisKKwllbnRyeSA9IGhhc2hfc2VhcmNoKHJpX2Zhc3RwYXRoX2NhY2hl LCAmcmlpbmZvLT5jb25zdHJhaW50X2lkLAorCQkJCQkJSEFTSF9FTlRFUiwgJmZvdW5kKTsKKwor CWlmICghZm91bmQpCisJeworCQlNZW1vcnlDb250ZXh0IG9sZGN4dDsKKworCQkvKgorCQkgKiBa ZXJvIG91dCBub24ta2V5IGZpZWxkcyBzbyByaV9GYXN0UGF0aFRlYXJkb3duIGlzIHNhZmUgaWYg d2UgZXJyb3IKKwkJICogb3V0IGR1cmluZyBwYXJ0aWFsIGluaXRpYWxpemF0aW9uIGJlbG93Lgor CQkgKi8KKwkJbWVtc2V0KCgoY2hhciAqKSBlbnRyeSkgKyBvZmZzZXRvZihSSV9GYXN0UGF0aEVu dHJ5LCBwa19yZWwpLCAwLAorCQkJICAgc2l6ZW9mKFJJX0Zhc3RQYXRoRW50cnkpIC0gb2Zmc2V0 b2YoUklfRmFzdFBhdGhFbnRyeSwgcGtfcmVsKSk7CisKKwkJb2xkY3h0ID0gTWVtb3J5Q29udGV4 dFN3aXRjaFRvKFRvcFRyYW5zYWN0aW9uQ29udGV4dCk7CisKKwkJZW50cnktPmZrX3JlbGlkID0g UmVsYXRpb25HZXRSZWxpZChma19yZWwpOworCisJCS8qCisJCSAqIE9wZW4gUEsgdGFibGUgYW5k IGl0cyB1bmlxdWUgaW5kZXguCisJCSAqCisJCSAqIFJvd1NoYXJlTG9jayBvbiBwa19yZWwgbWF0 Y2hlcyB3aGF0IHRoZSBTUEkgcGF0aCdzIFNFTEVDVCAuLi4gRk9SCisJCSAqIEtFWSBTSEFSRSB3 b3VsZCBhY3F1aXJlIGFzIGEgcmVsYXRpb24tbGV2ZWwgbG9jay4gQWNjZXNzU2hhcmVMb2NrCisJ CSAqIG9uIHRoZSBpbmRleCBpcyBzdGFuZGFyZCBmb3IgaW5kZXggc2NhbnMuCisJCSAqCisJCSAq IFdlIGRvbid0IHJlbGVhc2UgdGhlc2UgbG9ja3MgdW50aWwgZW5kIG9mIHRyYW5zYWN0aW9uLCBt YXRjaGluZyBTUEkKKwkJICogYmVoYXZpb3IuCisJCSAqLworCQllbnRyeS0+cGtfcmVsID0gdGFi bGVfb3BlbihyaWluZm8tPnBrX3JlbGlkLCBSb3dTaGFyZUxvY2spOworCQllbnRyeS0+aWR4X3Jl bCA9IGluZGV4X29wZW4ocmlpbmZvLT5jb25pbmRpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwkJZW50 cnktPnBrX3Nsb3QgPSB0YWJsZV9zbG90X2NyZWF0ZShlbnRyeS0+cGtfcmVsLCBOVUxMKTsKKwor CQkvKgorCQkgKiBNdXN0IGJlIFRUU09wc0hlYXBUdXBsZSBiZWNhdXNlIEV4ZWNTdG9yZUhlYXBU dXBsZSgpIGlzIHVzZWQgdG8KKwkJICogbG9hZCBlbnRyaWVzIGZyb20gYmF0Y2hbXSBpbnRvIHRo aXMgc2xvdCBmb3IgdmFsdWUgZXh0cmFjdGlvbi4KKwkJICovCisJCWVudHJ5LT5ma19zbG90ID0g TWFrZVNpbmdsZVR1cGxlVGFibGVTbG90KFJlbGF0aW9uR2V0RGVzY3IoZmtfcmVsKSwKKwkJCQkJ CQkJCQkJCSAgJlRUU09wc0hlYXBUdXBsZSk7CisKKwkJZW50cnktPmZsdXNoX2N4dCA9IEFsbG9j U2V0Q29udGV4dENyZWF0ZShUb3BUcmFuc2FjdGlvbkNvbnRleHQsCisJCQkJCQkJCQkJCQkgIlJJ IGZhc3QgcGF0aCBmbHVzaCB0ZW1wb3JhcnkgY29udGV4dCIsCisJCQkJCQkJCQkJCQkgQUxMT0NT RVRfU01BTExfU0laRVMpOworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKKworCQkv KiBFbnN1cmUgY2xlYW51cCBhdCBlbmQgb2YgdGhpcyB0cmlnZ2VyLWZpcmluZyBiYXRjaCAqLwor CQlpZiAoIXJpX2Zhc3RwYXRoX2NhbGxiYWNrX3JlZ2lzdGVyZWQpCisJCXsKKwkJCVJlZ2lzdGVy QWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFjayhyaV9GYXN0UGF0aEVuZEJhdGNoLCBOVUxMKTsKKwkJ CXJpX2Zhc3RwYXRoX2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSB0cnVlOworCQl9CisJfQorCisJcmV0 dXJuIGVudHJ5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5o IGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5oCmluZGV4IDI3YWY1Mjg0NDA2Li4xZDk4 Njk5NzNjMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5oCisrKyBi L3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RyaWdnZXIuaApAQCAtMjg5LDQgKzI4OSwyNSBAQCBleHRl cm4gdm9pZCBSSV9QYXJ0aXRpb25SZW1vdmVfQ2hlY2soVHJpZ2dlciAqdHJpZ2dlciwgUmVsYXRp b24gZmtfcmVsLAogCiBleHRlcm4gaW50CVJJX0ZLZXlfdHJpZ2dlcl90eXBlKE9pZCB0Z2ZvaWQp OwogCisvKgorICogQ2FsbGJhY2sgdHlwZSBmb3IgZW5kLW9mLXRyaWdnZXItYmF0Y2ggY2FsbGJh Y2tzLgorICoKKyAqIEN1cnJlbnRseSB1c2VkIGJ5IHJpX3RyaWdnZXJzLmMgdG8gZmx1c2ggZmFz dC1wYXRoIEZLIGJhdGNoZXMgYW5kCisgKiBjbGVhbiB1cCBhc3NvY2lhdGVkIHJlc291cmNlcy4K KyAqCisgKiBSZWdpc3RlcmVkIHZpYSBSZWdpc3RlckFmdGVyVHJpZ2dlckJhdGNoQ2FsbGJhY2so KS4gIEludm9rZWQgd2hlbgorICogdGhlIGN1cnJlbnQgdHJpZ2dlci1maXJpbmcgYmF0Y2ggY29t cGxldGVzOgorICoJLSBBZnRlclRyaWdnZXJFbmRRdWVyeSgpICAgICAgKGltbWVkaWF0ZSBjb25z dHJhaW50cykKKyAqCS0gQWZ0ZXJUcmlnZ2VyRmlyZURlZmVycmVkKCkgIChkZWZlcnJlZCBjb25z dHJhaW50cyBhdCBDT01NSVQpCisgKgktIEFmdGVyVHJpZ2dlclNldFN0YXRlKCkgICAgICAoU0VU IENPTlNUUkFJTlRTIElNTUVESUFURSkKKyAqCisgKiBUaGUgY2FsbGJhY2sgbGlzdCBpcyBjbGVh cmVkIGFmdGVyIGVhY2ggYmF0Y2guICBDYWxsZXJzIG11c3QKKyAqIHJlLXJlZ2lzdGVyIGlmIHRo ZXkgbmVlZCB0byBiZSBjYWxsZWQgYWdhaW4gaW4gYSBzdWJzZXF1ZW50IGJhdGNoLgorICovCit0 eXBlZGVmIHZvaWQgKCpBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrKSAodm9pZCAqYXJnKTsKKwor ZXh0ZXJuIHZvaWQgUmVnaXN0ZXJBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrKEFmdGVyVHJpZ2dl ckJhdGNoQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCQkJCQkJCSAgdm9pZCAqYXJnKTsKK2V4dGVy biBib29sIEFmdGVyVHJpZ2dlcklzQWN0aXZlKHZvaWQpOworCiAjZW5kaWYJCQkJCQkJLyogVFJJ R0dFUl9IICovCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25f a2V5Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZm9yZWlnbl9rZXkub3V0CmluZGV4 IDZjNjA3ZDM2MjIyLi45MTI5NTc1NGJhYiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9l eHBlY3RlZC9mb3JlaWduX2tleS5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9m b3JlaWduX2tleS5vdXQKQEAgLTM1NTcsMyArMzU1NywxMjkgQEAgREVUQUlMOiAgZHJvcCBjYXNj YWRlcyB0byB0YWJsZSBma3BhcnQxM190MQogZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBma3BhcnQx M190MgogZHJvcCBjYXNjYWRlcyB0byB0YWJsZSBma3BhcnQxM190MwogUkVTRVQgc2VhcmNoX3Bh dGg7CistLSBUZXN0cyBmb3JlaWduIGtleSBjaGVjayBmYXN0LXBhdGggbm8tY2FjaGUgcGF0aC4K K0NSRUFURSBUQUJMRSBmcF9wa19hbHRlciAoYSBpbnQgUFJJTUFSWSBLRVkpOworSU5TRVJUIElO VE8gZnBfcGtfYWx0ZXIgU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxLCAxMDApOworQ1JFQVRFIFRB QkxFIGZwX2ZrX2FsdGVyIChhIGludCk7CitJTlNFUlQgSU5UTyBmcF9ma19hbHRlciBTRUxFQ1Qg Z2VuZXJhdGVfc2VyaWVzKDEsIDEwMCk7CistLSBWYWxpZGF0aW9uIHBhdGg6IHNob3VsZCBzdWNj ZWVkCitBTFRFUiBUQUJMRSBmcF9ma19hbHRlciBBREQgRk9SRUlHTiBLRVkgKGEpIFJFRkVSRU5D RVMgZnBfcGtfYWx0ZXI7CitJTlNFUlQgSU5UTyBmcF9ma19hbHRlciBWQUxVRVMgKDEwMSk7ICAt LSBzaG91bGQgZmFpbCAoY29uc3RyYWludCBhY3RpdmUpCitFUlJPUjogIGluc2VydCBvciB1cGRh dGUgb24gdGFibGUgImZwX2ZrX2FsdGVyIiB2aW9sYXRlcyBmb3JlaWduIGtleSBjb25zdHJhaW50 ICJmcF9ma19hbHRlcl9hX2ZrZXkiCitERVRBSUw6ICBLZXkgKGEpPSgxMDEpIGlzIG5vdCBwcmVz ZW50IGluIHRhYmxlICJmcF9wa19hbHRlciIuCitEUk9QIFRBQkxFIGZwX2ZrX2FsdGVyLCBmcF9w a19hbHRlcjsKKy0tIFNlcGFyYXRlIHRlc3Q6IHZhbGlkYXRpb24gY2F0Y2hlcyBleGlzdGluZyB2 aW9sYXRpb24KK0NSRUFURSBUQUJMRSBmcF9wa19hbHRlcjIgKGEgaW50IFBSSU1BUlkgS0VZKTsK K0lOU0VSVCBJTlRPIGZwX3BrX2FsdGVyMiBWQUxVRVMgKDEpOworQ1JFQVRFIFRBQkxFIGZwX2Zr X2FsdGVyMiAoYSBpbnQpOworSU5TRVJUIElOVE8gZnBfZmtfYWx0ZXIyIFZBTFVFUyAoMSksICgy MDApOyAgLS0gMjAwIGhhcyBubyBQSyBtYXRjaAorQUxURVIgVEFCTEUgZnBfZmtfYWx0ZXIyIEFE RCBGT1JFSUdOIEtFWSAoYSkgUkVGRVJFTkNFUyBmcF9wa19hbHRlcjI7ICAtLSBzaG91bGQgZmFp bAorRVJST1I6ICBpbnNlcnQgb3IgdXBkYXRlIG9uIHRhYmxlICJmcF9ma19hbHRlcjIiIHZpb2xh dGVzIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgImZwX2ZrX2FsdGVyMl9hX2ZrZXkiCitERVRBSUw6 ICBLZXkgKGEpPSgyMDApIGlzIG5vdCBwcmVzZW50IGluIHRhYmxlICJmcF9wa19hbHRlcjIiLgor RFJPUCBUQUJMRSBmcF9ma19hbHRlcjIsIGZwX3BrX2FsdGVyMjsKKy0tIFRlc3RzIHRoYXQgdGhl IGZhc3QtcGF0aCBoYW5kbGVzIGNhY2hpbmcgZm9yIG11bHRpcGxlIGNvbnN0cmFpbnRzCitDUkVB VEUgVEFCTEUgZnBfcGsxIChhIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgZnBfcGsy IChiIGludCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5UTyBmcF9wazEgVkFMVUVTICgxKTsKK0lO U0VSVCBJTlRPIGZwX3BrMiBWQUxVRVMgKDEpOworQ1JFQVRFIFRBQkxFIGZwX211bHRpX2ZrICgK KyAgICBhIGludCBSRUZFUkVOQ0VTIGZwX3BrMSwKKyAgICBiIGludCBSRUZFUkVOQ0VTIGZwX3Br MgorKTsKK0lOU0VSVCBJTlRPIGZwX211bHRpX2ZrIFZBTFVFUyAoMSwgMSk7ICAtLSB0d28gY29u c3RyYWludHMsIG9uZSBiYXRjaAorSU5TRVJUIElOVE8gZnBfbXVsdGlfZmsgVkFMVUVTICgxLCAy KTsgIC0tIHNlY29uZCBjb25zdHJhaW50IGZhaWxzCitFUlJPUjogIGluc2VydCBvciB1cGRhdGUg b24gdGFibGUgImZwX211bHRpX2ZrIiB2aW9sYXRlcyBmb3JlaWduIGtleSBjb25zdHJhaW50ICJm cF9tdWx0aV9ma19iX2ZrZXkiCitERVRBSUw6ICBLZXkgKGIpPSgyKSBpcyBub3QgcHJlc2VudCBp biB0YWJsZSAiZnBfcGsyIi4KK0RST1AgVEFCTEUgZnBfbXVsdGlfZmssIGZwX3BrMSwgZnBfcGsy OworLS0gVGVzdCB0aGF0IGZhc3QtcGF0aCBjYWNoZSBoYW5kbGVzIGRlZmVycmVkIGNvbnN0cmFp bnRzIGFuZCBTRVQgQ09OU1RSQUlOVFMgSU1NRURJQVRFCitDUkVBVEUgVEFCTEUgZnBfcGtfZGVm ZXIgKGEgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBmcF9ma19kZWZlciAoYSBpbnQg UkVGRVJFTkNFUyBmcF9wa19kZWZlciBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRCk7CitJ TlNFUlQgSU5UTyBmcF9wa19kZWZlciBWQUxVRVMgKDEpLCAoMik7CitCRUdJTjsKK0lOU0VSVCBJ TlRPIGZwX2ZrX2RlZmVyIFZBTFVFUyAoMSk7CitJTlNFUlQgSU5UTyBmcF9ma19kZWZlciBWQUxV RVMgKDIpOworU0VUIENPTlNUUkFJTlRTIEFMTCBJTU1FRElBVEU7ICAtLSBmaXJlcyBiYXRjaCBj YWxsYmFjayBoZXJlCitJTlNFUlQgSU5UTyBmcF9ma19kZWZlciBWQUxVRVMgKDMpOyAgLS0gc2hv dWxkIGZhaWwsIGFsc28gdGVzdHMgdGhhdCBjYWNoZSB3YXMgY2xlYW5lZCB1cAorRVJST1I6ICBp bnNlcnQgb3IgdXBkYXRlIG9uIHRhYmxlICJmcF9ma19kZWZlciIgdmlvbGF0ZXMgZm9yZWlnbiBr ZXkgY29uc3RyYWludCAiZnBfZmtfZGVmZXJfYV9ma2V5IgorREVUQUlMOiAgS2V5IChhKT0oMykg aXMgbm90IHByZXNlbnQgaW4gdGFibGUgImZwX3BrX2RlZmVyIi4KK0NPTU1JVDsKK0RST1AgVEFC TEUgZnBfcGtfZGVmZXIsIGZwX2ZrX2RlZmVyOworLS0gU3VidHJhbnNhY3Rpb24gYWJvcnQ6IGNh Y2hlZCBzdGF0ZSBtdXN0IGJlIGludmFsaWRhdGVkIG9uIFJPTExCQUNLIFRPCitDUkVBVEUgVEFC TEUgZnBfcGtfc3VieGFjdCAoYSBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGZwX2Zr X3N1YnhhY3QgKGEgaW50IFJFRkVSRU5DRVMgZnBfcGtfc3VieGFjdCk7CitJTlNFUlQgSU5UTyBm cF9wa19zdWJ4YWN0IFZBTFVFUyAoMSksICgyKTsKK0JFR0lOOworSU5TRVJUIElOVE8gZnBfZmtf c3VieGFjdCBWQUxVRVMgKDEpOworU0FWRVBPSU5UIHNwMTsKK0lOU0VSVCBJTlRPIGZwX2ZrX3N1 YnhhY3QgVkFMVUVTICgyKTsKK1JPTExCQUNLIFRPIHNwMTsKK0lOU0VSVCBJTlRPIGZwX2ZrX3N1 YnhhY3QgVkFMVUVTICgxKTsKK0NPTU1JVDsKK1NFTEVDVCAqIEZST00gZnBfZmtfc3VieGFjdDsK KyBhIAorLS0tCisgMQorIDEKKygyIHJvd3MpCisKK0RST1AgVEFCTEUgZnBfZmtfc3VieGFjdCwg ZnBfcGtfc3VieGFjdDsKKy0tIEZLIGNoZWNrIG11c3Qgc2VlIFBLIHJvd3MgaW5zZXJ0ZWQgYnkg ZWFybGllciBBRlRFUiB0cmlnZ2VycworLS0gZmlyaW5nIG9uIHRoZSBzYW1lIHN0YXRlbWVudAor Q1JFQVRFIFRBQkxFIGZwX3BrX2NjaSAoYSBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxF IGZwX2ZrX2NjaSAoYSBpbnQgUkVGRVJFTkNFUyBmcF9wa19jY2kpOworQ1JFQVRFIEZVTkNUSU9O IGZwX2F1dG9fcGsoKSBSRVRVUk5TIHRyaWdnZXIgQVMgJCQKK0JFR0lOCisgIFJBSVNFIE5PVElD RSAnZnBfYXV0b19wayBjYWxsZWQnOworICBJTlNFUlQgSU5UTyBmcF9wa19jY2kgVkFMVUVTIChO RVcuYSk7CisgIFJFVFVSTiBORVc7CitFTkQgJCQgTEFOR1VBR0UgcGxwZ3NxbDsKKy0tIE5hbWUg c29ydHMgYmVmb3JlIHRoZSBSSSB0cmlnZ2VyLCBzbyBmaXJlcyBmaXJzdCBwZXIgcm93CitDUkVB VEUgVFJJR0dFUiAiQUFBX2F1dG8iIEFGVEVSIElOU0VSVCBPTiBmcF9ma19jY2kKKyAgRk9SIEVB Q0ggUk9XIEVYRUNVVEUgRlVOQ1RJT04gZnBfYXV0b19waygpOworLS0gU2hvdWxkIHN1Y2NlZWQ6 IEFBQV9hdXRvIHByb3Zpc2lvbnMgdGhlIFBLIHJvdyBiZWZvcmUgUkkgY2hlY2sKK0lOU0VSVCBJ TlRPIGZwX2ZrX2NjaSBWQUxVRVMgKDEpLCAoMiksICgzKTsKK05PVElDRTogIGZwX2F1dG9fcGsg Y2FsbGVkCitOT1RJQ0U6ICBmcF9hdXRvX3BrIGNhbGxlZAorTk9USUNFOiAgZnBfYXV0b19wayBj YWxsZWQKK0RST1AgVEFCTEUgZnBfZmtfY2NpLCBmcF9wa19jY2k7CitEUk9QIEZVTkNUSU9OIGZw X2F1dG9fcGs7CistLSBNdWx0aS1jb2x1bW4gRks6IGV4ZXJjaXNlcyBiYXRjaGVkIHBlci1yb3cg cHJvYmluZyB3aXRoIGNvbXBvc2l0ZSBrZXlzCitDUkVBVEUgVEFCTEUgZnBfcGtfbXVsdGkgKGEg aW50LCBiIGludCwgUFJJTUFSWSBLRVkgKGEsIGIpKTsKK0lOU0VSVCBJTlRPIGZwX3BrX211bHRp IFNFTEVDVCBpLCBpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCkgaTsKK0NSRUFURSBUQUJM RSBmcF9ma19tdWx0aSAoeCBpbnQsIGEgaW50LCBiIGludCwKKyAgICBGT1JFSUdOIEtFWSAoYSwg YikgUkVGRVJFTkNFUyBmcF9wa19tdWx0aSk7CitJTlNFUlQgSU5UTyBmcF9ma19tdWx0aSBTRUxF Q1QgaSwgaSwgaSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDApIGk7CitJTlNFUlQgSU5UTyBm cF9ma19tdWx0aSBWQUxVRVMgKDEsIDk5OSwgOTk5KTsKK0VSUk9SOiAgaW5zZXJ0IG9yIHVwZGF0 ZSBvbiB0YWJsZSAiZnBfZmtfbXVsdGkiIHZpb2xhdGVzIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQg ImZwX2ZrX211bHRpX2FfYl9ma2V5IgorREVUQUlMOiAgS2V5IChhLCBiKT0oOTk5LCA5OTkpIGlz IG5vdCBwcmVzZW50IGluIHRhYmxlICJmcF9wa19tdWx0aSIuCitEUk9QIFRBQkxFIGZwX2ZrX211 bHRpLCBmcF9wa19tdWx0aTsKKy0tIERlZmVycmVkIGNvbnN0cmFpbnQ6IGJhdGNoIGZsdXNoZWQg YXQgQ09NTUlULCBub3QgYXQgc3RhdGVtZW50IGVuZAorQ1JFQVRFIFRBQkxFIGZwX3BrX2NvbW1p dCAoYSBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGZwX2ZrX2NvbW1pdCAoYSBpbnQg UkVGRVJFTkNFUyBmcF9wa19jb21taXQKKyAgICBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJF RCk7CitJTlNFUlQgSU5UTyBmcF9wa19jb21taXQgVkFMVUVTICgxKTsKK0JFR0lOOworSU5TRVJU IElOVE8gZnBfZmtfY29tbWl0IFZBTFVFUyAoMSk7CitJTlNFUlQgSU5UTyBmcF9ma19jb21taXQg VkFMVUVTICgxKTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2NvbW1pdCBWQUxVRVMgKDk5OSk7CitDT01N SVQ7CitFUlJPUjogIGluc2VydCBvciB1cGRhdGUgb24gdGFibGUgImZwX2ZrX2NvbW1pdCIgdmlv bGF0ZXMgZm9yZWlnbiBrZXkgY29uc3RyYWludCAiZnBfZmtfY29tbWl0X2FfZmtleSIKK0RFVEFJ TDogIEtleSAoYSk9KDk5OSkgaXMgbm90IHByZXNlbnQgaW4gdGFibGUgImZwX3BrX2NvbW1pdCIu CitEUk9QIFRBQkxFIGZwX2ZrX2NvbW1pdCwgZnBfcGtfY29tbWl0OworLS0gQ3Jvc3MtdHlwZSBG SyB3aXRoIGJ1bGsgaW5zZXJ0OiBpbnQ4IEZLIHJlZmVyZW5jaW5nIGludDQgUEssCistLSB2YWx1 ZXMgY2FzdCBkdXJpbmcgYXJyYXkgY29uc3RydWN0aW9uCitDUkVBVEUgVEFCTEUgZnBfcGtfY3Jv c3MgKGEgaW50NCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5UTyBmcF9wa19jcm9zcyBTRUxFQ1Qg Z2VuZXJhdGVfc2VyaWVzKDEsIDIwMCk7CitDUkVBVEUgVEFCTEUgZnBfZmtfY3Jvc3MgKGEgaW50 OCBSRUZFUkVOQ0VTIGZwX3BrX2Nyb3NzKTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2Nyb3NzIFNFTEVD VCBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2Nyb3NzIFZBTFVF UyAoOTk5KTsKK0VSUk9SOiAgaW5zZXJ0IG9yIHVwZGF0ZSBvbiB0YWJsZSAiZnBfZmtfY3Jvc3Mi IHZpb2xhdGVzIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgImZwX2ZrX2Nyb3NzX2FfZmtleSIKK0RF VEFJTDogIEtleSAoYSk9KDk5OSkgaXMgbm90IHByZXNlbnQgaW4gdGFibGUgImZwX3BrX2Nyb3Nz Ii4KK0RST1AgVEFCTEUgZnBfZmtfY3Jvc3MsIGZwX3BrX2Nyb3NzOworLS0gRHVwbGljYXRlIEZL IHZhbHVlczogd2hlbiB1c2luZyB0aGUgYmF0Y2hlZCBTQU9QIHBhdGgsIGV2ZXJ5CistLSByb3cg bXVzdCBiZSByZWNvZ25pemVkIGFzIHNhdGlzZmllZCwgbm90IGp1c3QgdGhlIGZpcnN0IG1hdGNo CitDUkVBVEUgVEFCTEUgZnBfcGtfZHVwIChhIGludCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5U TyBmcF9wa19kdXAgVkFMVUVTICgxKTsKK0NSRUFURSBUQUJMRSBmcF9ma19kdXAgKGEgaW50IFJF RkVSRU5DRVMgZnBfcGtfZHVwKTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2R1cCBTRUxFQ1QgMSBGUk9N IGdlbmVyYXRlX3NlcmllcygxLCAxMDApOworRFJPUCBUQUJMRSBmcF9ma19kdXAsIGZwX3BrX2R1 cDsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbCBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbAppbmRleCBmY2RkMDA2Yzk3MS4uZjY0 NmRkMTA0MDEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNx bAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwKQEAgLTI1MzUsMyAr MjUzNSwxMjEgQEAgV0lUSCBjdGUgQVMgKAogCiBEUk9QIFNDSEVNQSBma3BhcnQxMyBDQVNDQURF OwogUkVTRVQgc2VhcmNoX3BhdGg7CisKKy0tIFRlc3RzIGZvcmVpZ24ga2V5IGNoZWNrIGZhc3Qt cGF0aCBuby1jYWNoZSBwYXRoLgorQ1JFQVRFIFRBQkxFIGZwX3BrX2FsdGVyIChhIGludCBQUklN QVJZIEtFWSk7CitJTlNFUlQgSU5UTyBmcF9wa19hbHRlciBTRUxFQ1QgZ2VuZXJhdGVfc2VyaWVz KDEsIDEwMCk7CitDUkVBVEUgVEFCTEUgZnBfZmtfYWx0ZXIgKGEgaW50KTsKK0lOU0VSVCBJTlRP IGZwX2ZrX2FsdGVyIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKKy0tIFZhbGlkYXRp b24gcGF0aDogc2hvdWxkIHN1Y2NlZWQKK0FMVEVSIFRBQkxFIGZwX2ZrX2FsdGVyIEFERCBGT1JF SUdOIEtFWSAoYSkgUkVGRVJFTkNFUyBmcF9wa19hbHRlcjsKK0lOU0VSVCBJTlRPIGZwX2ZrX2Fs dGVyIFZBTFVFUyAoMTAxKTsgIC0tIHNob3VsZCBmYWlsIChjb25zdHJhaW50IGFjdGl2ZSkKK0RS T1AgVEFCTEUgZnBfZmtfYWx0ZXIsIGZwX3BrX2FsdGVyOworCistLSBTZXBhcmF0ZSB0ZXN0OiB2 YWxpZGF0aW9uIGNhdGNoZXMgZXhpc3RpbmcgdmlvbGF0aW9uCitDUkVBVEUgVEFCTEUgZnBfcGtf YWx0ZXIyIChhIGludCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5UTyBmcF9wa19hbHRlcjIgVkFM VUVTICgxKTsKK0NSRUFURSBUQUJMRSBmcF9ma19hbHRlcjIgKGEgaW50KTsKK0lOU0VSVCBJTlRP IGZwX2ZrX2FsdGVyMiBWQUxVRVMgKDEpLCAoMjAwKTsgIC0tIDIwMCBoYXMgbm8gUEsgbWF0Y2gK K0FMVEVSIFRBQkxFIGZwX2ZrX2FsdGVyMiBBREQgRk9SRUlHTiBLRVkgKGEpIFJFRkVSRU5DRVMg ZnBfcGtfYWx0ZXIyOyAgLS0gc2hvdWxkIGZhaWwKK0RST1AgVEFCTEUgZnBfZmtfYWx0ZXIyLCBm cF9wa19hbHRlcjI7CisKKy0tIFRlc3RzIHRoYXQgdGhlIGZhc3QtcGF0aCBoYW5kbGVzIGNhY2hp bmcgZm9yIG11bHRpcGxlIGNvbnN0cmFpbnRzCitDUkVBVEUgVEFCTEUgZnBfcGsxIChhIGludCBQ UklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgZnBfcGsyIChiIGludCBQUklNQVJZIEtFWSk7CitJ TlNFUlQgSU5UTyBmcF9wazEgVkFMVUVTICgxKTsKK0lOU0VSVCBJTlRPIGZwX3BrMiBWQUxVRVMg KDEpOworQ1JFQVRFIFRBQkxFIGZwX211bHRpX2ZrICgKKyAgICBhIGludCBSRUZFUkVOQ0VTIGZw X3BrMSwKKyAgICBiIGludCBSRUZFUkVOQ0VTIGZwX3BrMgorKTsKK0lOU0VSVCBJTlRPIGZwX211 bHRpX2ZrIFZBTFVFUyAoMSwgMSk7ICAtLSB0d28gY29uc3RyYWludHMsIG9uZSBiYXRjaAorSU5T RVJUIElOVE8gZnBfbXVsdGlfZmsgVkFMVUVTICgxLCAyKTsgIC0tIHNlY29uZCBjb25zdHJhaW50 IGZhaWxzCitEUk9QIFRBQkxFIGZwX211bHRpX2ZrLCBmcF9wazEsIGZwX3BrMjsKKworLS0gVGVz dCB0aGF0IGZhc3QtcGF0aCBjYWNoZSBoYW5kbGVzIGRlZmVycmVkIGNvbnN0cmFpbnRzIGFuZCBT RVQgQ09OU1RSQUlOVFMgSU1NRURJQVRFCitDUkVBVEUgVEFCTEUgZnBfcGtfZGVmZXIgKGEgaW50 IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBmcF9ma19kZWZlciAoYSBpbnQgUkVGRVJFTkNF UyBmcF9wa19kZWZlciBERUZFUlJBQkxFIElOSVRJQUxMWSBERUZFUlJFRCk7CitJTlNFUlQgSU5U TyBmcF9wa19kZWZlciBWQUxVRVMgKDEpLCAoMik7CisKK0JFR0lOOworSU5TRVJUIElOVE8gZnBf ZmtfZGVmZXIgVkFMVUVTICgxKTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2RlZmVyIFZBTFVFUyAoMik7 CitTRVQgQ09OU1RSQUlOVFMgQUxMIElNTUVESUFURTsgIC0tIGZpcmVzIGJhdGNoIGNhbGxiYWNr IGhlcmUKK0lOU0VSVCBJTlRPIGZwX2ZrX2RlZmVyIFZBTFVFUyAoMyk7ICAtLSBzaG91bGQgZmFp bCwgYWxzbyB0ZXN0cyB0aGF0IGNhY2hlIHdhcyBjbGVhbmVkIHVwCitDT01NSVQ7CitEUk9QIFRB QkxFIGZwX3BrX2RlZmVyLCBmcF9ma19kZWZlcjsKKworLS0gU3VidHJhbnNhY3Rpb24gYWJvcnQ6 IGNhY2hlZCBzdGF0ZSBtdXN0IGJlIGludmFsaWRhdGVkIG9uIFJPTExCQUNLIFRPCitDUkVBVEUg VEFCTEUgZnBfcGtfc3VieGFjdCAoYSBpbnQgUFJJTUFSWSBLRVkpOworQ1JFQVRFIFRBQkxFIGZw X2ZrX3N1YnhhY3QgKGEgaW50IFJFRkVSRU5DRVMgZnBfcGtfc3VieGFjdCk7CitJTlNFUlQgSU5U TyBmcF9wa19zdWJ4YWN0IFZBTFVFUyAoMSksICgyKTsKK0JFR0lOOworSU5TRVJUIElOVE8gZnBf Zmtfc3VieGFjdCBWQUxVRVMgKDEpOworU0FWRVBPSU5UIHNwMTsKK0lOU0VSVCBJTlRPIGZwX2Zr X3N1YnhhY3QgVkFMVUVTICgyKTsKK1JPTExCQUNLIFRPIHNwMTsKK0lOU0VSVCBJTlRPIGZwX2Zr X3N1YnhhY3QgVkFMVUVTICgxKTsKK0NPTU1JVDsKK1NFTEVDVCAqIEZST00gZnBfZmtfc3VieGFj dDsKK0RST1AgVEFCTEUgZnBfZmtfc3VieGFjdCwgZnBfcGtfc3VieGFjdDsKKworLS0gRksgY2hl Y2sgbXVzdCBzZWUgUEsgcm93cyBpbnNlcnRlZCBieSBlYXJsaWVyIEFGVEVSIHRyaWdnZXJzCist LSBmaXJpbmcgb24gdGhlIHNhbWUgc3RhdGVtZW50CitDUkVBVEUgVEFCTEUgZnBfcGtfY2NpIChh IGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgZnBfZmtfY2NpIChhIGludCBSRUZFUkVO Q0VTIGZwX3BrX2NjaSk7CisKK0NSRUFURSBGVU5DVElPTiBmcF9hdXRvX3BrKCkgUkVUVVJOUyB0 cmlnZ2VyIEFTICQkCitCRUdJTgorICBSQUlTRSBOT1RJQ0UgJ2ZwX2F1dG9fcGsgY2FsbGVkJzsK KyAgSU5TRVJUIElOVE8gZnBfcGtfY2NpIFZBTFVFUyAoTkVXLmEpOworICBSRVRVUk4gTkVXOwor RU5EICQkIExBTkdVQUdFIHBscGdzcWw7CisKKy0tIE5hbWUgc29ydHMgYmVmb3JlIHRoZSBSSSB0 cmlnZ2VyLCBzbyBmaXJlcyBmaXJzdCBwZXIgcm93CitDUkVBVEUgVFJJR0dFUiAiQUFBX2F1dG8i IEFGVEVSIElOU0VSVCBPTiBmcF9ma19jY2kKKyAgRk9SIEVBQ0ggUk9XIEVYRUNVVEUgRlVOQ1RJ T04gZnBfYXV0b19waygpOworCistLSBTaG91bGQgc3VjY2VlZDogQUFBX2F1dG8gcHJvdmlzaW9u cyB0aGUgUEsgcm93IGJlZm9yZSBSSSBjaGVjaworSU5TRVJUIElOVE8gZnBfZmtfY2NpIFZBTFVF UyAoMSksICgyKSwgKDMpOworCitEUk9QIFRBQkxFIGZwX2ZrX2NjaSwgZnBfcGtfY2NpOworRFJP UCBGVU5DVElPTiBmcF9hdXRvX3BrOworCistLSBNdWx0aS1jb2x1bW4gRks6IGV4ZXJjaXNlcyBi YXRjaGVkIHBlci1yb3cgcHJvYmluZyB3aXRoIGNvbXBvc2l0ZSBrZXlzCitDUkVBVEUgVEFCTEUg ZnBfcGtfbXVsdGkgKGEgaW50LCBiIGludCwgUFJJTUFSWSBLRVkgKGEsIGIpKTsKK0lOU0VSVCBJ TlRPIGZwX3BrX211bHRpIFNFTEVDVCBpLCBpIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCkg aTsKK0NSRUFURSBUQUJMRSBmcF9ma19tdWx0aSAoeCBpbnQsIGEgaW50LCBiIGludCwKKyAgICBG T1JFSUdOIEtFWSAoYSwgYikgUkVGRVJFTkNFUyBmcF9wa19tdWx0aSk7CitJTlNFUlQgSU5UTyBm cF9ma19tdWx0aSBTRUxFQ1QgaSwgaSwgaSBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMDApIGk7 CitJTlNFUlQgSU5UTyBmcF9ma19tdWx0aSBWQUxVRVMgKDEsIDk5OSwgOTk5KTsKK0RST1AgVEFC TEUgZnBfZmtfbXVsdGksIGZwX3BrX211bHRpOworCistLSBEZWZlcnJlZCBjb25zdHJhaW50OiBi YXRjaCBmbHVzaGVkIGF0IENPTU1JVCwgbm90IGF0IHN0YXRlbWVudCBlbmQKK0NSRUFURSBUQUJM RSBmcF9wa19jb21taXQgKGEgaW50IFBSSU1BUlkgS0VZKTsKK0NSRUFURSBUQUJMRSBmcF9ma19j b21taXQgKGEgaW50IFJFRkVSRU5DRVMgZnBfcGtfY29tbWl0CisgICAgREVGRVJSQUJMRSBJTklU SUFMTFkgREVGRVJSRUQpOworSU5TRVJUIElOVE8gZnBfcGtfY29tbWl0IFZBTFVFUyAoMSk7CitC RUdJTjsKK0lOU0VSVCBJTlRPIGZwX2ZrX2NvbW1pdCBWQUxVRVMgKDEpOworSU5TRVJUIElOVE8g ZnBfZmtfY29tbWl0IFZBTFVFUyAoMSk7CitJTlNFUlQgSU5UTyBmcF9ma19jb21taXQgVkFMVUVT ICg5OTkpOworQ09NTUlUOworRFJPUCBUQUJMRSBmcF9ma19jb21taXQsIGZwX3BrX2NvbW1pdDsK KworLS0gQ3Jvc3MtdHlwZSBGSyB3aXRoIGJ1bGsgaW5zZXJ0OiBpbnQ4IEZLIHJlZmVyZW5jaW5n IGludDQgUEssCistLSB2YWx1ZXMgY2FzdCBkdXJpbmcgYXJyYXkgY29uc3RydWN0aW9uCitDUkVB VEUgVEFCTEUgZnBfcGtfY3Jvc3MgKGEgaW50NCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5UTyBm cF9wa19jcm9zcyBTRUxFQ1QgZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMCk7CitDUkVBVEUgVEFCTEUg ZnBfZmtfY3Jvc3MgKGEgaW50OCBSRUZFUkVOQ0VTIGZwX3BrX2Nyb3NzKTsKK0lOU0VSVCBJTlRP IGZwX2ZrX2Nyb3NzIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwgMjAwKTsKK0lOU0VSVCBJTlRP IGZwX2ZrX2Nyb3NzIFZBTFVFUyAoOTk5KTsKK0RST1AgVEFCTEUgZnBfZmtfY3Jvc3MsIGZwX3Br X2Nyb3NzOworCistLSBEdXBsaWNhdGUgRksgdmFsdWVzOiB3aGVuIHVzaW5nIHRoZSBiYXRjaGVk IFNBT1AgcGF0aCwgZXZlcnkKKy0tIHJvdyBtdXN0IGJlIHJlY29nbml6ZWQgYXMgc2F0aXNmaWVk LCBub3QganVzdCB0aGUgZmlyc3QgbWF0Y2gKK0NSRUFURSBUQUJMRSBmcF9wa19kdXAgKGEgaW50 IFBSSU1BUlkgS0VZKTsKK0lOU0VSVCBJTlRPIGZwX3BrX2R1cCBWQUxVRVMgKDEpOworQ1JFQVRF IFRBQkxFIGZwX2ZrX2R1cCAoYSBpbnQgUkVGRVJFTkNFUyBmcF9wa19kdXApOworSU5TRVJUIElO VE8gZnBfZmtfZHVwIFNFTEVDVCAxIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCk7CitEUk9Q IFRBQkxFIGZwX2ZrX2R1cCwgZnBfcGtfZHVwOwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5k ZW50L3R5cGVkZWZzLmxpc3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRl eCA4ZTljMDY1NDdkNi4uYzBiOWU1MWUzMzUgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVu dC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBA IC0zMCw2ICszMCw4IEBAIEFkZEZvcmVpZ25VcGRhdGVUYXJnZXRzX2Z1bmN0aW9uCiBBZGRySW5m bwogQWZmaXhOb2RlCiBBZmZpeE5vZGVEYXRhCitBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrCitB ZnRlclRyaWdnZXJDYWxsYmFja0l0ZW0KIEFmdGVyVHJpZ2dlckV2ZW50CiBBZnRlclRyaWdnZXJF dmVudENodW5rCiBBZnRlclRyaWdnZXJFdmVudERhdGEKQEAgLTI0ODUsNiArMjQ4Nyw3IEBAIFJJ WAogUklfQ29tcGFyZUhhc2hFbnRyeQogUklfQ29tcGFyZUtleQogUklfQ29uc3RyYWludEluZm8K K1JJX0Zhc3RQYXRoRW50cnkKIFJJX1F1ZXJ5SGFzaEVudHJ5CiBSSV9RdWVyeUtleQogUlRFS2lu ZAotLSAKMi40Ny4zCgo= --0000000000002a63ee064e7555a8--