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.94.2) (envelope-from ) id 1tmXrT-007Wpe-P9 for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 12:47:04 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1tmXrS-002Rns-6s for pgsql-hackers@arkaria.postgresql.org; Mon, 24 Feb 2025 12:47:02 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1tmXrR-002Rnk-O7 for pgsql-hackers@lists.postgresql.org; Mon, 24 Feb 2025 12:47:01 +0000 Received: from mail-lj1-x22a.google.com ([2a00:1450:4864:20::22a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tmXrO-000X8E-2a for pgsql-hackers@postgresql.org; Mon, 24 Feb 2025 12:47:01 +0000 Received: by mail-lj1-x22a.google.com with SMTP id 38308e7fff4ca-30762598511so39358981fa.0 for ; Mon, 24 Feb 2025 04:46:58 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1740401217; x=1741006017; 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=DN1ygV+1bLHnzy6WBaeFGfu+vDnC3qR+pH19RpGlnfg=; b=XSFBrGWkVSIZAS9nkcr4PN7RqXwlTo+JNkPwQZUhG4NrVIEE2ZKKM+d0OO8KMlegQi l32Apma1+1Rc5QDSLEk11f8aXZTcLjyCJrQj/q0+h7TFcLNqmmyzQs3X2YVjxdHj55Oc PPWGLOhONdu+whXSSmgKWcR6nmO/Bf6E8kDnTgFPL8UCquJ7VtrLjYUAHRMzEy9ugawc lbHcLBm19/XsMn9Mi7+B9dBc7BWu4Nd9Z3W8pdHt22XRfAcBWP0oAsFV0l3a4BRRpBMd JrYGoEjnaH2OsW/Xijb4YaZL/dRpJkLeETaBv6sdqr/NgvR+1kpSLUGJmtq/RCDw2bCP 2Rhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1740401217; x=1741006017; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=DN1ygV+1bLHnzy6WBaeFGfu+vDnC3qR+pH19RpGlnfg=; b=KGTxFSkNZlg5sLgRF8avSxfrgzZDJYSUm9HCiQkGLSRhAvwKjA77eFF6nvHjShNwI+ l6n1mWqn8INmqxlUnC0uuNs9LiAm4Bx6qxsS8Nmh0sdSprG2uucSfoFbdWbYFS6ezkxk ILfuaVAILAbc6BQb69bD3V9WanbNB7NxKue4fmKE+pRKytXFxbXKggpA8EBFMgzhEoCZ VsATFuI+iAlUgYcXWt4iH96eJYyPXdV9XDeJbfKYgsH45PtfIXaIot/hH5t45IYTY5GU osNmEgUnregj2SNGVvq5ukJgVtccUYnlKqnwAr7bMhKOy2FzavoTlUE5+lOS/GHD+DAV VXMw== X-Gm-Message-State: AOJu0YyOyXh2yf2h/X6nDFuSUbMwABgXbajc8VNLBfvyJI9sxhiQzFNg TLjy3uvkgA5HuYt7q9qOrNTJCJlifSWtX/7T+wfZPDeBA5GTtAbWxmk3uqBvpq5VkD6CPkxeW5d Qm6RkKpcpWU43BP4/RuLag2tbuCXlBOhX X-Gm-Gg: ASbGncuY5nd/65i8Ia1fL0Je1PmaNTJ5uh7JEYy7Lx7GXj5VavsriYzDmKDXFQg+V/P OnAnOUnGyY2pS9yZ55DwYMFY8BlX6GFZzrS0uk2Q9j0MnU0PNGOB9gk7aIw4mChA+JrgQ7wWrS6 4rBuehin2lfFnE2xy2zq+vwRnXPHJ4U9IHhqBVn106 X-Google-Smtp-Source: AGHT+IHyvyvdfJYH3MOv1sKT9faK2erIXRjuKg9u1uwtRg/z75eqNCzL4kRbE5vOxbWkWL7kvHTgseAosvfq0OG2sKE= X-Received: by 2002:a2e:8098:0:b0:300:7f87:a65 with SMTP id 38308e7fff4ca-30a599cec38mr44377171fa.35.1740401216900; Mon, 24 Feb 2025 04:46:56 -0800 (PST) MIME-Version: 1.0 References: <7d4db5cf-8d72-4ee1-8f2e-f88ef9615f27@vondra.me> <637b3ae3-b9eb-4d83-a942-5f7483911ea4@vondra.me> <29ced66e28ec696d1ac29747bd901df2@oss.nttdata.com> <5a899047-65fc-47c5-9c35-1035f44956c6@vondra.me> <70146bd0-da0f-48ee-bece-1e35536189e0@oss.nttdata.com> <2eb8fd76-89f0-42e8-bc79-152d50c63016@vondra.me> <81607c8c04a21b5cac87b21e46566074@oss.nttdata.com> <4c2b5401-41ad-43b9-9215-c7b2d901f8ed@vondra.me> In-Reply-To: <4c2b5401-41ad-43b9-9215-c7b2d901f8ed@vondra.me> From: Rahila Syed Date: Mon, 24 Feb 2025 18:16:45 +0530 X-Gm-Features: AWEUYZkvIc5APVZ7-mC1MSlB58AgTy_IG7_k4Jw75HzKbnXi-eGE9gw-yg_cR7o Message-ID: Subject: Re: Enhancing Memory Context Statistics Reporting To: Tomas Vondra Cc: PostgreSQL-development , Daniel Gustafsson Content-Type: multipart/mixed; boundary="0000000000004cf677062ee2bcb6" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000004cf677062ee2bcb6 Content-Type: multipart/alternative; boundary="0000000000004cf675062ee2bcb4" --0000000000004cf675062ee2bcb4 Content-Type: text/plain; charset="UTF-8" > I think something is not quite right, because if I try running a simple > pgbench script that does pg_get_process_memory_contexts() on PIDs of > random postgres process (just like in the past), I immediately get this: > > Thank you for testing. This issue occurs when a process that previously attached to a DSA area for publishing its own context statistics tries to attach to it again while querying statistics from another backend. Previously, I was not detaching at the end of publishing the statistics. I have now changed it to detach from the area after the statistics are published. The fix is included in the updated patch. > Perhaps the backends need to synchronize creation of the DSA? > This has been implemented in the patch. > Sounds good. Do you have any measurements how much this reduced the size > of the entries written to the DSA? How many entries will fit into 1MB of > shared memory? The size of the entries has approximately halved after dynamically allocating the strings and a datum array. Also, previously, I was allocating the entire memory for all contexts in one large chunk from DSA. I have now separated them into smaller allocations per context. The integer counters are still allocated at once for all contexts, but the size of an allocated chunk will not exceed approximately 128 bytes * total_num_of_contexts. Average total number of contexts is in the hundreds. PFA the updated and rebased patches. Thank you, Rahila Syed --0000000000004cf675062ee2bcb4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

=
I think something is not quite right, because if I try running a simple
pgbench script that does pg_get_process_memory_contexts() on PIDs of
random postgres process (just like in the past), I immediately get this:
Thank you for testing. This issue occurs when a proce= ss that previously attached
to a DSA area for publishing its own contex= t statistics tries to attach to it again while
querying statistics from= another backend. Previously, I was not detaching at the end
of publish= ing the statistics. I have now changed it to detach from the area after the=
statistics are published. The fix is included in the updated patch.
=C2=A0
Perhaps the backends need to synchronize creation of the DSA?

This has been implemented in the patch.
=C2=A0
Sounds good. Do you have any measurements how much this reduced the size of the entries written to the DSA? How many entries will fit into 1MB of shared memory?

The size of the entries has = approximately halved after dynamically allocating the=C2=A0
strin= gs and a datum array.
Also, previously, I was allocating the entire mem= ory for all contexts in one large chunk
from DSA. I have now separated = them into smaller allocations=C2=A0
per context. The integer coun= ters are still allocated at once for all contexts, but=C2=A0=C2=A0
the size of an allocated chunk will not exceed approximately 128 bytes * = total_num_of_contexts.
Average total number of contexts is in the hundre= ds.

PFA the updated and rebased patches.

Thank you,
Rahila Syed

--0000000000004cf675062ee2bcb4-- --0000000000004cf677062ee2bcb6 Content-Type: application/octet-stream; name="v15-0001-Preparatory-changes-for-reporting-memory-context-sta.patch" Content-Disposition: attachment; filename="v15-0001-Preparatory-changes-for-reporting-memory-context-sta.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7j1u1hx0 RnJvbSAzZThkOGVkYjEzODM5MWRkYjE4MzU0MGEwZjQzZjdhNDg0NTZhYzdhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IE1vbiwgMyBGZWIgMjAyNSAxNTozMzoxOSArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMS8y XSBQcmVwYXJhdG9yeSBjaGFuZ2VzIGZvciByZXBvcnRpbmcgbWVtb3J5IGNvbnRleHQKIHN0YXRp c3RpY3MKCkVuc3VyZSB0aGF0IE1lbW9yeUNvbnRleHRTdGF0c0ludGVybmFsIGNhbiByZXR1cm4g bnVtYmVyIG9mCmNvbnRleHRzLiBBbHNvLCBwcm92aWRlIGFuIG9wdGlvbiBpbiBNZW1vcnlDb250 ZXh0U3RhdHNJbnRlcm5hbAp0byByZXR1cm4gd2l0aG91dCBwcmludGluZyBzdGF0cyB0byBlaXRo ZXIgc3RkZXJyIG9yIGxvZ3MuCi0tLQogc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMgfCA2 NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDU1 IGluc2VydGlvbnMoKyksIDEwIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL21tZ3IvbWN4dC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMKaW5kZXgg YWE2ZGEwZDAzNS4uOTQ2YTM3MzFmZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1n ci9tY3h0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMKQEAgLTEzNSw2ICsx MzUsMTcgQEAgc3RhdGljIGNvbnN0IE1lbW9yeUNvbnRleHRNZXRob2RzIG1jeHRfbWV0aG9kc1td ID0gewogfTsKIAogI3VuZGVmIEJPR1VTX01DVFgKKy8qCisgKiBUaGlzIGlzIHBhc3NlZCB0byBN ZW1vcnlDb250ZXh0U3RhdHNJbnRlcm5hbCB0byBkZXRlcm1pbmUgd2hldGhlcgorICogdG8gcHJp bnQgY29udGV4dCBzdGF0aXN0aWNzIG9yIG5vdCBhbmQgd2hlcmUgdG8gcHJpbnQgdGhlbSBsb2dz IG9yCisgKiBzdGRlcnIuCisgKi8KK3R5cGVkZWYgZW51bSBQcmludERlc3RpbmF0aW9uCit7CisJ UFJJTlRfU1RBVFNfVE9fU1RERVJSID0gMCwKKwlQUklOVF9TVEFUU19UT19MT0dTLAorCVBSSU5U X1NUQVRTX05PTkUKK30JCQlQcmludERlc3RpbmF0aW9uOwogCiAvKgogICogQ3VycmVudE1lbW9y eUNvbnRleHQKQEAgLTE2Miw3ICsxNzMsNyBAQCBzdGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0Q2Fs bFJlc2V0Q2FsbGJhY2tzKE1lbW9yeUNvbnRleHQgY29udGV4dCk7CiBzdGF0aWMgdm9pZCBNZW1v cnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250ZXh0IGNvbnRleHQsIGludCBsZXZlbCwK IAkJCQkJCQkJCSAgIGludCBtYXhfbGV2ZWwsIGludCBtYXhfY2hpbGRyZW4sCiAJCQkJCQkJCQkg ICBNZW1vcnlDb250ZXh0Q291bnRlcnMgKnRvdGFscywKLQkJCQkJCQkJCSAgIGJvb2wgcHJpbnRf dG9fc3RkZXJyKTsKKwkJCQkJCQkJCSAgIFByaW50RGVzdGluYXRpb24gcHJpbnRfbG9jYXRpb24s IGludCAqbnVtX2NvbnRleHRzKTsKIHN0YXRpYyB2b2lkIE1lbW9yeUNvbnRleHRTdGF0c1ByaW50 KE1lbW9yeUNvbnRleHQgY29udGV4dCwgdm9pZCAqcGFzc3RocnUsCiAJCQkJCQkJCQljb25zdCBj aGFyICpzdGF0c19zdHJpbmcsCiAJCQkJCQkJCQlib29sIHByaW50X3RvX3N0ZGVycik7CkBAIC04 MzEsMTEgKzg0MiwxOSBAQCBNZW1vcnlDb250ZXh0U3RhdHNEZXRhaWwoTWVtb3J5Q29udGV4dCBj b250ZXh0LAogCQkJCQkJIGJvb2wgcHJpbnRfdG9fc3RkZXJyKQogewogCU1lbW9yeUNvbnRleHRD b3VudGVycyBncmFuZF90b3RhbHM7CisJaW50CQkJbnVtX2NvbnRleHRzOworCVByaW50RGVzdGlu YXRpb24gcHJpbnRfbG9jYXRpb247CiAKIAltZW1zZXQoJmdyYW5kX3RvdGFscywgMCwgc2l6ZW9m KGdyYW5kX3RvdGFscykpOwogCisJaWYgKHByaW50X3RvX3N0ZGVycikKKwkJcHJpbnRfbG9jYXRp b24gPSBQUklOVF9TVEFUU19UT19TVERFUlI7CisJZWxzZQorCQlwcmludF9sb2NhdGlvbiA9IFBS SU5UX1NUQVRTX1RPX0xPR1M7CisKKwkvKiBudW1fY29udGV4dHMgcmVwb3J0IG51bWJlciBvZiBj b250ZXh0cyBhZ2dyZWdhdGVkIGluIHRoZSBvdXRwdXQgKi8KIAlNZW1vcnlDb250ZXh0U3RhdHNJ bnRlcm5hbChjb250ZXh0LCAwLCBtYXhfbGV2ZWwsIG1heF9jaGlsZHJlbiwKLQkJCQkJCQkgICAm Z3JhbmRfdG90YWxzLCBwcmludF90b19zdGRlcnIpOworCQkJCQkJCSAgICZncmFuZF90b3RhbHMs IHByaW50X2xvY2F0aW9uLCAmbnVtX2NvbnRleHRzKTsKIAogCWlmIChwcmludF90b19zdGRlcnIp CiAJCWZwcmludGYoc3RkZXJyLApAQCAtODc2LDE4ICs4OTUsNDMgQEAgc3RhdGljIHZvaWQKIE1l bW9yeUNvbnRleHRTdGF0c0ludGVybmFsKE1lbW9yeUNvbnRleHQgY29udGV4dCwgaW50IGxldmVs LAogCQkJCQkJICAgaW50IG1heF9sZXZlbCwgaW50IG1heF9jaGlsZHJlbiwKIAkJCQkJCSAgIE1l bW9yeUNvbnRleHRDb3VudGVycyAqdG90YWxzLAotCQkJCQkJICAgYm9vbCBwcmludF90b19zdGRl cnIpCisJCQkJCQkgICBQcmludERlc3RpbmF0aW9uIHByaW50X2xvY2F0aW9uLCBpbnQgKm51bV9j b250ZXh0cykKIHsKIAlNZW1vcnlDb250ZXh0IGNoaWxkOwogCWludAkJCWljaGlsZDsKKwlib29s CQlwcmludF90b19zdGRlcnIgPSB0cnVlOwogCisJY2hlY2tfc3RhY2tfZGVwdGgoKTsKIAlBc3Nl cnQoTWVtb3J5Q29udGV4dElzVmFsaWQoY29udGV4dCkpOwogCi0JLyogRXhhbWluZSB0aGUgY29u dGV4dCBpdHNlbGYgKi8KLQljb250ZXh0LT5tZXRob2RzLT5zdGF0cyhjb250ZXh0LAotCQkJCQkJ CU1lbW9yeUNvbnRleHRTdGF0c1ByaW50LAotCQkJCQkJCSZsZXZlbCwKLQkJCQkJCQl0b3RhbHMs IHByaW50X3RvX3N0ZGVycik7CisJaWYgKHByaW50X2xvY2F0aW9uID09IFBSSU5UX1NUQVRTX1RP X1NUREVSUikKKwkJcHJpbnRfdG9fc3RkZXJyID0gdHJ1ZTsKKwllbHNlIGlmIChwcmludF9sb2Nh dGlvbiA9PSBQUklOVF9TVEFUU19UT19MT0dTKQorCQlwcmludF90b19zdGRlcnIgPSBmYWxzZTsK KworCWlmIChwcmludF9sb2NhdGlvbiAhPSBQUklOVF9TVEFUU19OT05FKQorCXsKKwkJLyogRXhh bWluZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KKwkJY29udGV4dC0+bWV0aG9kcy0+c3RhdHMoY29u dGV4dCwKKwkJCQkJCQkJTWVtb3J5Q29udGV4dFN0YXRzUHJpbnQsCisJCQkJCQkJCSZsZXZlbCwK KwkJCQkJCQkJdG90YWxzLCBwcmludF90b19zdGRlcnIpOworCX0KKworCS8qCisJICogRG8gbm90 IHByaW50IHRoZSBzdGF0aXN0aWNzIGlmIHByaW50X3RvX3N0ZGVyciBpcyBQUklOVF9TVEFUU19O T05FLAorCSAqIG9ubHkgY29tcHV0ZSB0b3RhbHMuCisJICovCisJZWxzZQorCXsKKwkJLyogRXhh bWluZSB0aGUgY29udGV4dCBpdHNlbGYgKi8KKwkJY29udGV4dC0+bWV0aG9kcy0+c3RhdHMoY29u dGV4dCwKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJTlVMTCwKKwkJCQkJCQkJdG90YWxzLCBwcmlu dF90b19zdGRlcnIpOworCX0KKwkvKiBJbmNyZW1lbnQgdGhlIGNvbnRleHQgY291bnQgKi8KKwkq bnVtX2NvbnRleHRzID0gKm51bV9jb250ZXh0cyArIDE7CiAKIAkvKgogCSAqIEV4YW1pbmUgY2hp bGRyZW4uCkBAIC05MDcsNyArOTUxLDcgQEAgTWVtb3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoTWVt b3J5Q29udGV4dCBjb250ZXh0LCBpbnQgbGV2ZWwsCiAJCQlNZW1vcnlDb250ZXh0U3RhdHNJbnRl cm5hbChjaGlsZCwgbGV2ZWwgKyAxLAogCQkJCQkJCQkJICAgbWF4X2xldmVsLCBtYXhfY2hpbGRy ZW4sCiAJCQkJCQkJCQkgICB0b3RhbHMsCi0JCQkJCQkJCQkgICBwcmludF90b19zdGRlcnIpOwor CQkJCQkJCQkJICAgcHJpbnRfbG9jYXRpb24sIG51bV9jb250ZXh0cyk7CiAJCX0KIAl9CiAKQEAg LTkyNSw2ICs5NjksNyBAQCBNZW1vcnlDb250ZXh0U3RhdHNJbnRlcm5hbChNZW1vcnlDb250ZXh0 IGNvbnRleHQsIGludCBsZXZlbCwKIAkJCWljaGlsZCsrOwogCQkJY2hpbGQgPSBNZW1vcnlDb250 ZXh0VHJhdmVyc2VOZXh0KGNoaWxkLCBjb250ZXh0KTsKIAkJfQorCQkqbnVtX2NvbnRleHRzID0g Km51bV9jb250ZXh0cyArIGljaGlsZDsKIAogCQlpZiAocHJpbnRfdG9fc3RkZXJyKQogCQl7CkBA IC05MzksNyArOTg0LDcgQEAgTWVtb3J5Q29udGV4dFN0YXRzSW50ZXJuYWwoTWVtb3J5Q29udGV4 dCBjb250ZXh0LCBpbnQgbGV2ZWwsCiAJCQkJCWxvY2FsX3RvdGFscy5mcmVlY2h1bmtzLAogCQkJ CQlsb2NhbF90b3RhbHMudG90YWxzcGFjZSAtIGxvY2FsX3RvdGFscy5mcmVlc3BhY2UpOwogCQl9 Ci0JCWVsc2UKKwkJZWxzZSBpZiAocHJpbnRfbG9jYXRpb24gIT0gUFJJTlRfU1RBVFNfTk9ORSkK IAkJCWVyZXBvcnQoTE9HX1NFUlZFUl9PTkxZLAogCQkJCQkoZXJyaGlkZXN0bXQodHJ1ZSksCiAJ CQkJCSBlcnJoaWRlY29udGV4dCh0cnVlKSwKLS0gCjIuMzQuMQoK --0000000000004cf677062ee2bcb6 Content-Type: application/octet-stream; name="v15-0002-Function-to-report-memory-context-statistics.patch" Content-Disposition: attachment; filename="v15-0002-Function-to-report-memory-context-statistics.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_m7j1u5d01 RnJvbSAzMWRmOTljNjllN2FlNjA3MDdiMzJjMzBiZDZhZDk4NmEzMGVhMzZhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBSYWhpbGEgU3llZCA8cmFoaWxhc3llZC45MEBnbWFpbC5jb20+ CkRhdGU6IE1vbiwgMyBGZWIgMjAyNSAxNTozNzoxNyArMDUzMApTdWJqZWN0OiBbUEFUQ0ggMi8y XSBGdW5jdGlvbiB0byByZXBvcnQgbWVtb3J5IGNvbnRleHQgc3RhdGlzdGljcwoKVGhpcyBmdW5j dGlvbiBzZW5kcyBhIHNpZ25hbCB0byBhIGJhY2tlbmQgdG8gcHVibGlzaApzdGF0aXN0aWNzIG9m IGFsbCBpdHMgbWVtb3J5IGNvbnRleHRzLiBTaWduYWwgaGFuZGxlcgpydW5uaW5nIGluIHRoZSBi YWNrZW5kIHByb2Nlc3MsIHNldHMgYSBmbGFnLCB3aGljaCBjYXVzZXMKaXQgdG8gY29weSBpdHMg TWVtb3J5Q29udGV4dFN0YXRzIHRvIGEgRFNBLCBkdXJpbmcgdGhlCm5leHQgY2FsbCB0byBDSEVD S19GT1JfSU5URVJSVVBUUygpLgpJZiB0aGVyZSBhcmUgbW9yZSBzdGF0aXN0aWNzIHRoYW4gdGhh dCBmaXQgaW4gMTZNQiwgdGhlCnJlbWFpbmluZyBzdGF0aXN0aWNzIGFyZSBjb3BpZWQgYXMgYSBj dW11bGF0aXZlCnRvdGFsIG9mIHRoZSByZW1haW5pbmcgY29udGV4dHMuCk9uY2UgaXRzIGRvbmUs IGl0IHNpZ25hbHMgdGhlIGNsaWVudCBiYWNrZW5kIHVzaW5nCmEgY29uZGl0aW9uIHZhcmlhYmxl LiBUaGUgY2xpZW50IGJhY2tlbmQgd2FrZXMgdXAsIHJlYWRzCnRoZSBzaGFyZWQgbWVtb3J5IGFu ZCByZXR1cm5zIHRoZXNlIHZhbHVlcyBpbiB0aGUgZm9ybQpvZiBzZXQgb2YgcmVjb3Jkcywgb25l IGZvciBlYWNoIG1lbW9yeSBjb250ZXh0LCB0byB0aGUKdXNlciwgZm9sbG93ZWQgYnkgYSBjdW11 bGF0aXZlIHRvdGFsIG9mIHRoZSByZW1haW5pbmcKY29udGV4dHMsIGlmIGFueS4KSWYgZ2V0X3N1 bW1hcnkgaXMgdHJ1ZSByZXR1cm4gc3RhdGlzdGljcyBvZiBhbGwgY2hpbGRyZW4Kb2YgVG9wTWVt b3J5Q29udGV4dCB3aXRoIGFnZ3JlZ2F0ZWQgc3RhdGlzdGljcyBvZiB0aGVpcgpjaGlsZHJlbi4K VXNlciBjYW4gcGFzcyBudW1fb2ZfdHJpZXMgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgdG90YWwKbnVt YmVyIG9mIHdhaXQgY3ljbGVzIGluIGEgY2xpZW50IGJhY2tlbmQgZm9yIGxhdGVzdApzdGF0aXN0 aWNzLgpFYWNoIGN5Y2xlIHdhaXQgdGltZW91dCBpcyBzZXQgdG8gMSBzZWNvbmRzLiBQb3N0IHRo aXMKdGhlIGNsaWVudCBkaXNwbGF5cyBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzdGF0aXN0aWNzIG9y CnJldHVybnMgd2l0aG91dCByZXN1bHRzLgpFYWNoIGJhY2tlbmQgYW5kIGF1eGlsaWFyeSBwcm9j ZXNzIGhhcyBpdHMgb3duIHNsb3QgZm9yCnJlcG9ydGluZyB0aGUgc3RhdHMuIFRoZXJlIGlzIGFu IGFycmF5IG9mIHN1Y2ggbWVtb3J5IHNsb3RzCm9mIHNpemUgTWF4QmFja2VuZHMrTnVtb2ZBdXhp bGlhcnkKcHJvY2Vzc2VzIGluIGZpeGVkIHNoYXJlZCBtZW1vcnkuIEVhY2ggb2YgdGhlc2Ugc2xv dHMgcG9pbnQKdG8gYSBzbWFsbGVyIGRzYSBhbGxvY2F0aW9ucyB3aXRoaW4gYSBzaW5nbGUgRFNB LAp3aGljaCBjb250YWlucyB0aGUgc3RhdHMgdG8gYmUgc2hhcmVkIGJ5IHRoZSBjb3JyZXNwb25k aW5nCnByb2Nlc3MuCkVhY2ggc2xvdCBoYXMgaXRzIG93biBMVyBsb2NrIGFuZCBjb25kaXRpb24g dmFyaWFibGUgZm9yCnN5bmNocm9uaXphdGlvbiBhbmQgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRo ZSBwdWJsaXNoaW5nCnByb2Nlc3MgYW5kIHRoZSBjbGllbnQgYmFja2VuZC4KLS0tCiBkb2Mvc3Jj L3NnbWwvZnVuYy5zZ21sICAgICAgICAgICAgICAgICAgICAgICAgfCAgNDEgKysKIHNyYy9iYWNr ZW5kL3Bvc3RtYXN0ZXIvYXV0b3ZhY3V1bS5jICAgICAgICAgICB8ICAgNCArCiBzcmMvYmFja2Vu ZC9wb3N0bWFzdGVyL2NoZWNrcG9pbnRlci5jICAgICAgICAgfCAgIDQgKwogc3JjL2JhY2tlbmQv cG9zdG1hc3Rlci9pbnRlcnJ1cHQuYyAgICAgICAgICAgIHwgICA0ICsKIHNyYy9iYWNrZW5kL3Bv c3RtYXN0ZXIvcGdhcmNoLmMgICAgICAgICAgICAgICB8ICAgNCArCiBzcmMvYmFja2VuZC9wb3N0 bWFzdGVyL3N0YXJ0dXAuYyAgICAgICAgICAgICAgfCAgIDQgKwogc3JjL2JhY2tlbmQvcG9zdG1h c3Rlci93YWxzdW1tYXJpemVyLmMgICAgICAgIHwgICA0ICsKIHNyYy9iYWNrZW5kL3N0b3JhZ2Uv aXBjL2lwY2kuYyAgICAgICAgICAgICAgICB8ICAgMyArCiBzcmMvYmFja2VuZC9zdG9yYWdlL2lw Yy9wcm9jc2lnbmFsLmMgICAgICAgICAgfCAgIDMgKwogc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jl cy5jICAgICAgICAgICAgICAgICAgIHwgICAzICsKIC4uLi91dGlscy9hY3Rpdml0eS93YWl0X2V2 ZW50X25hbWVzLnR4dCAgICAgICB8ICAgMSArCiBzcmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1 bmNzLmMgICAgICAgICAgICAgfCA0MjggKysrKysrKysrKysrKysrLQogc3JjL2JhY2tlbmQvdXRp bHMvaW5pdC9nbG9iYWxzLmMgICAgICAgICAgICAgIHwgICAxICsKIHNyYy9iYWNrZW5kL3V0aWxz L21tZ3IvbWN4dC5jICAgICAgICAgICAgICAgICB8IDQ4NCArKysrKysrKysrKysrKysrKy0KIHNy Yy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgICAgICAgICAgICAgICB8ICAxMCArCiBzcmMv aW5jbHVkZS9taXNjYWRtaW4uaCAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEgKwogc3JjL2lu Y2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFsLmggICAgICAgICAgICAgIHwgICAxICsKIHNyYy9pbmNs dWRlL3V0aWxzL21lbXV0aWxzLmggICAgICAgICAgICAgICAgICB8ICA3MSArKysKIHNyYy90ZXN0 L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgICAgICB8ICAxNCArCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC9zeXN2aWV3cy5zcWwgICAgICAgICAgICAgfCAgMTQgKwogc3JjL3Rvb2xzL3Bn aW5kZW50L3R5cGVkZWZzLmxpc3QgICAgICAgICAgICAgIHwgICAyICsKIDIxIGZpbGVzIGNoYW5n ZWQsIDEwNzIgaW5zZXJ0aW9ucygrKSwgMjkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZG9j L3NyYy9zZ21sL2Z1bmMuc2dtbCBiL2RvYy9zcmMvc2dtbC9mdW5jLnNnbWwKaW5kZXggOWY2MGE0 NzZlYi4uOWJmMDE5YzJlNSAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2Z1bmMuc2dtbAorKysg Yi9kb2Mvc3JjL3NnbWwvZnVuYy5zZ21sCkBAIC0yODQxOSw2ICsyODQxOSw0NyBAQCBhY2wgICAg ICB8IHtwb3N0Z3Jlcz1hcndkRHh0bS9wb3N0Z3Jlcyxmb289ci9wb3N0Z3Jlc30KICAgICAgICA8 L3BhcmE+PC9lbnRyeT4KICAgICAgIDwvcm93PgogCisgICAgICA8cm93PgorICAgICAgIDxlbnRy eSByb2xlPSJmdW5jX3RhYmxlX2VudHJ5Ij48cGFyYSByb2xlPSJmdW5jX3NpZ25hdHVyZSI+Cisg ICAgICAgIDxpbmRleHRlcm0+CisgICAgICAgICA8cHJpbWFyeT5wZ19nZXRfcHJvY2Vzc19tZW1v cnlfY29udGV4dHM8L3ByaW1hcnk+CisgICAgICAgIDwvaW5kZXh0ZXJtPgorICAgICAgICA8ZnVu Y3Rpb24+cGdfZ2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRzPC9mdW5jdGlvbj4gKCA8cGFyYW1l dGVyPnBpZDwvcGFyYW1ldGVyPiA8dHlwZT5pbnRlZ2VyPC90eXBlPiwgPHBhcmFtZXRlcj5nZXRf c3VtbWFyeTwvcGFyYW1ldGVyPiA8dHlwZT5ib29sZWFuPC90eXBlPiwgPHBhcmFtZXRlcj5udW1f b2ZfdHJpZXM8L3BhcmFtZXRlcj4gPHR5cGU+aW50ZWdlcjwvdHlwZT4gKQorICAgICAgICA8cmV0 dXJudmFsdWU+c2V0b2YgcmVjb3JkPC9yZXR1cm52YWx1ZT4KKyAgICAgICA8L3BhcmE+CisgICAg ICAgPHBhcmE+CisgICAgICAgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyByZXF1ZXN0cyB0byBkaXNw bGF5IHRoZSBtZW1vcnkgY29udGV4dHMgb2YgYQorICAgICAgICBQb3N0Z3JlU1FMIHByb2Nlc3Mg d2l0aCB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgSUQgKFBJRCkuIEl0IHRha2VzIHRocmVlCisgICAg ICAgIGFyZ3VtZW50czogPHBhcmFtZXRlcj5QSUQ8L3BhcmFtZXRlcj4sIDxwYXJhbWV0ZXI+Z2V0 X3N1bW1hcnk8L3BhcmFtZXRlcj4KKyAgICAgICAgYW5kIDxwYXJhbWV0ZXI+bnVtX29mX3RyaWVz PC9wYXJhbWV0ZXI+LiBUaGUgZnVuY3Rpb24gY2FuIHNlbmQgcmVxdWVzdHMKKyAgICAgICAgdG8g Ym90aCBiYWNrZW5kIGFuZCBhdXhpbGlhcnkgcHJvY2Vzc2VzLgorCisgICAgICAgIEFmdGVyIHJl Y2VpdmluZyBtZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzIGZyb20gdGhlIHRhcmdldCBwcm9jZXNz LCBpdAorICAgICAgICByZXR1cm5zIHRoZSByZXN1bHRzIGFzIG9uZSByb3cgcGVyIGNvbnRleHQu IFRoZSBudW1fYWdnX2NvbnRleHRzCisgICAgICAgIGNvbHVtbiBpbmRpY2F0ZXMgdGhlIG51bWJl ciBvZiBjb250ZXh0cyBhZ2dyZWdhdGVkIGluIHRoZSBkaXNwbGF5ZWQKKyAgICAgICAgc3RhdGlz dGljcy4KKworICAgICAgICBXaGVuIDxwYXJhbWV0ZXI+Z2V0X3N1bW1hcnk8L3BhcmFtZXRlcj4g aXMgc2V0IHRvIHRydWUsIHN0YXRpc3RpY3MKKyAgICAgICAgZm9yIG1lbW9yeSBjb250ZXh0cyBh dCBsZXZlbHMgMSBhbmQgMiBhcmUgZGlzcGxheWVkLCB3aXRoIGxldmVsIDEKKyAgICAgICAgcmVw cmVzZW50aW5nIHRoZSByb290IG5vZGUgKGkuZS4sIFRvcE1lbW9yeUNvbnRleHQpLgorICAgICAg ICBFYWNoIGxldmVsIDIgY29udGV4dCdzIHN0YXRpc3RpY3MgcmVwcmVzZW50IGFuIGFnZ3JlZ2F0 ZSBvZiBhbGwgaXRzCisgICAgICAgIGNoaWxkIGNvbnRleHRzJyBzdGF0aXN0aWNzLCB3aXRoIG51 bV9hZ2dfY29udGV4dHMgaW5kaWNhdGluZyB0aGUgbnVtYmVyCisgICAgICAgIG9mIHRoZXNlIGFn Z3JlZ2F0ZWQgY2hpbGQgY29udGV4dHMuCisKKyAgICAgICAgV2hlbiA8cGFyYW1ldGVyPmdldF9z dW1tYXJ5PC9wYXJhbWV0ZXI+IGlzIHNldCB0byBmYWxzZSwgdGhlCisgICAgICAgIG51bV9hZ2df Y29udGV4dHMgdmFsdWUgaXMgMSwgaW5kaWNhdGluZyB0aGF0IGluZGl2aWR1YWwgc3RhdGlzdGlj cyBhcmUKKyAgICAgICAgYmVpbmcgZGlzcGxheWVkLgorCisgICAgICAgIDxwYXJhbWV0ZXI+bnVt X29mX3RyaWVzPC9wYXJhbWV0ZXI+IGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIHRpbWVzCisgICAg ICAgIHRoZSBjbGllbnQgd2lsbCB3YWl0IGZvciB0aGUgbGF0ZXN0IHN0YXRpc3RpY3MuIFRoZSB3 YWl0IHBlciB0cnkgaXMgMQorICAgICAgICBzZWNvbmQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBp bmNyZWFzZWQgaWYgdGhlIHVzZXIgYW50aWNpcGF0ZXMgYSBkZWxheQorICAgICAgICBpbiB0aGUg cmVzcG9uc2UgZnJvbSB0aGUgcmVwb3J0aW5nIHByb2Nlc3MuIENvbnZlcnNlbHksIGlmIHVzZXJz IGFyZQorICAgICAgICBmcmVxdWVudGx5IGFuZCBwZXJpb2RpY2FsbHkgcXVlcnlpbmcgdGhlIHBy b2Nlc3MgZm9yIHN0YXRpc3RpY3MsIG9yIGlmCisgICAgICAgIHRoZXJlIGFyZSBjb25jdXJyZW50 IHJlcXVlc3RzIGZvciBzdGF0aXN0aWNzIG9mIHRoZSBzYW1lIHByb2Nlc3MsCisgICAgICAgIGxv d2VyaW5nIHRoZSBwYXJhbWV0ZXIgbWlnaHQgaGVscCBhY2hpZXZlIGEgZmFzdGVyIHJlc3BvbnNl LgorICAgICAgIDwvcGFyYT48L2VudHJ5PgorICAgICAgPC9yb3c+CisKICAgICAgIDxyb3c+CiAg ICAgICAgPGVudHJ5IHJvbGU9ImZ1bmNfdGFibGVfZW50cnkiPjxwYXJhIHJvbGU9ImZ1bmNfc2ln bmF0dXJlIj4KICAgICAgICAgPGluZGV4dGVybT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Bv c3RtYXN0ZXIvYXV0b3ZhY3V1bS5jIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRvdmFjdXVt LmMKaW5kZXggZGRiMzAzZjUyMC4uZjVlODA1MGE3NSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv cG9zdG1hc3Rlci9hdXRvdmFjdXVtLmMKKysrIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9hdXRv dmFjdXVtLmMKQEAgLTc3OSw2ICs3NzksMTAgQEAgSGFuZGxlQXV0b1ZhY0xhdW5jaGVySW50ZXJy dXB0cyh2b2lkKQogCWlmIChMb2dNZW1vcnlDb250ZXh0UGVuZGluZykKIAkJUHJvY2Vzc0xvZ01l bW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKIAorCS8qIFB1Ymxpc2ggbWVtb3J5IGNvbnRleHRzIG9m IHRoaXMgcHJvY2VzcyAqLworCWlmIChQdWJsaXNoTWVtb3J5Q29udGV4dFBlbmRpbmcpCisJCVBy b2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CisKIAkvKiBQcm9jZXNzIHNpbnZhbCBj YXRjaHVwIGludGVycnVwdHMgdGhhdCBoYXBwZW5lZCB3aGlsZSBzbGVlcGluZyAqLwogCVByb2Nl c3NDYXRjaHVwSW50ZXJydXB0KCk7CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFz dGVyL2NoZWNrcG9pbnRlci5jIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9jaGVja3BvaW50ZXIu YwppbmRleCA3YWNiYmQzZTI2Li5mMGY3NDNjZTdlIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9w b3N0bWFzdGVyL2NoZWNrcG9pbnRlci5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hl Y2twb2ludGVyLmMKQEAgLTY2MSw2ICs2NjEsMTAgQEAgSGFuZGxlQ2hlY2twb2ludGVySW50ZXJy dXB0cyh2b2lkKQogCS8qIFBlcmZvcm0gbG9nZ2luZyBvZiBtZW1vcnkgY29udGV4dHMgb2YgdGhp cyBwcm9jZXNzICovCiAJaWYgKExvZ01lbW9yeUNvbnRleHRQZW5kaW5nKQogCQlQcm9jZXNzTG9n TWVtb3J5Q29udGV4dEludGVycnVwdCgpOworCisJLyogUHVibGlzaCBtZW1vcnkgY29udGV4dHMg b2YgdGhpcyBwcm9jZXNzICovCisJaWYgKFB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZykKKwkJ UHJvY2Vzc0dldE1lbW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvaW50ZXJydXB0LmMgYi9zcmMvYmFja2VuZC9wb3N0bWFz dGVyL2ludGVycnVwdC5jCmluZGV4IGJlNjllNGM3MTMuLjk0ODFhNWNkMjQgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvaW50ZXJydXB0LmMKKysrIGIvc3JjL2JhY2tlbmQvcG9z dG1hc3Rlci9pbnRlcnJ1cHQuYwpAQCAtNDgsNiArNDgsMTAgQEAgSGFuZGxlTWFpbkxvb3BJbnRl cnJ1cHRzKHZvaWQpCiAJLyogUGVyZm9ybSBsb2dnaW5nIG9mIG1lbW9yeSBjb250ZXh0cyBvZiB0 aGlzIHByb2Nlc3MgKi8KIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBlbmRpbmcpCiAJCVByb2Nlc3NM b2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CisKKwkvKiBQdWJsaXNoIG1lbW9yeSBjb250ZXh0 cyBvZiB0aGlzIHByb2Nlc3MgKi8KKwlpZiAoUHVibGlzaE1lbW9yeUNvbnRleHRQZW5kaW5nKQor CQlQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCgpOwogfQogCiAvKgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9wZ2FyY2guYyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0 ZXIvcGdhcmNoLmMKaW5kZXggZTZjZDc4Njc5Yy4uYmNhNzY3NWNjZCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvcG9zdG1hc3Rlci9wZ2FyY2guYworKysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVy L3BnYXJjaC5jCkBAIC04NjUsNiArODY1LDEwIEBAIEhhbmRsZVBnQXJjaEludGVycnVwdHModm9p ZCkKIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBlbmRpbmcpCiAJCVByb2Nlc3NMb2dNZW1vcnlDb250 ZXh0SW50ZXJydXB0KCk7CiAKKwkvKiBQdWJsaXNoIG1lbW9yeSBjb250ZXh0cyBvZiB0aGlzIHBy b2Nlc3MgKi8KKwlpZiAoUHVibGlzaE1lbW9yeUNvbnRleHRQZW5kaW5nKQorCQlQcm9jZXNzR2V0 TWVtb3J5Q29udGV4dEludGVycnVwdCgpOworCiAJaWYgKENvbmZpZ1JlbG9hZFBlbmRpbmcpCiAJ ewogCQljaGFyCSAgICphcmNoaXZlTGliID0gcHN0cmR1cChYTG9nQXJjaGl2ZUxpYnJhcnkpOwpk aWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9zdGFydHVwLmMgYi9zcmMvYmFja2Vu ZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYwppbmRleCA4OGVhYjNkMGJhLi4zYmU2MjA4NGZkIDEwMDY0 NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYworKysgYi9zcmMvYmFja2Vu ZC9wb3N0bWFzdGVyL3N0YXJ0dXAuYwpAQCAtMTkyLDYgKzE5MiwxMCBAQCBIYW5kbGVTdGFydHVw UHJvY0ludGVycnVwdHModm9pZCkKIAkvKiBQZXJmb3JtIGxvZ2dpbmcgb2YgbWVtb3J5IGNvbnRl eHRzIG9mIHRoaXMgcHJvY2VzcyAqLwogCWlmIChMb2dNZW1vcnlDb250ZXh0UGVuZGluZykKIAkJ UHJvY2Vzc0xvZ01lbW9yeUNvbnRleHRJbnRlcnJ1cHQoKTsKKworCS8qIFB1Ymxpc2ggbWVtb3J5 IGNvbnRleHRzIG9mIHRoaXMgcHJvY2VzcyAqLworCWlmIChQdWJsaXNoTWVtb3J5Q29udGV4dFBl bmRpbmcpCisJCVByb2Nlc3NHZXRNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiB9CiAKIApkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci93YWxzdW1tYXJpemVyLmMgYi9zcmMvYmFj a2VuZC9wb3N0bWFzdGVyL3dhbHN1bW1hcml6ZXIuYwppbmRleCBmNGQ2MWMxZjNiLi5hZWJmM2Y5 NmY1IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3dhbHN1bW1hcml6ZXIuYwor KysgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL3dhbHN1bW1hcml6ZXIuYwpAQCAtODc2LDYgKzg3 NiwxMCBAQCBIYW5kbGVXYWxTdW1tYXJpemVySW50ZXJydXB0cyh2b2lkKQogCS8qIFBlcmZvcm0g bG9nZ2luZyBvZiBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBwcm9jZXNzICovCiAJaWYgKExvZ01l bW9yeUNvbnRleHRQZW5kaW5nKQogCQlQcm9jZXNzTG9nTWVtb3J5Q29udGV4dEludGVycnVwdCgp OworCisJLyogUHVibGlzaCBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBwcm9jZXNzICovCisJaWYg KFB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZykKKwkJUHJvY2Vzc0dldE1lbW9yeUNvbnRleHRJ bnRlcnJ1cHQoKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBj L2lwY2kuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvaXBjL2lwY2kuYwppbmRleCAxNzRlZWQ3MDM2 Li41ZWVlMDRkNTJhIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9pcGNpLmMK KysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9pcGMvaXBjaS5jCkBAIC01MCw2ICs1MCw3IEBACiAj aW5jbHVkZSAic3RvcmFnZS9zaW52YWxhZHQuaCIKICNpbmNsdWRlICJ1dGlscy9ndWMuaCIKICNp bmNsdWRlICJ1dGlscy9pbmplY3Rpb25fcG9pbnQuaCIKKyNpbmNsdWRlICJ1dGlscy9tZW11dGls cy5oIgogCiAvKiBHVUNzICovCiBpbnQJCQlzaGFyZWRfbWVtb3J5X3R5cGUgPSBERUZBVUxUX1NI QVJFRF9NRU1PUllfVFlQRTsKQEAgLTM0MCw2ICszNDEsOCBAQCBDcmVhdGVPckF0dGFjaFNobWVt U3RydWN0cyh2b2lkKQogCVN0YXRzU2htZW1Jbml0KCk7CiAJV2FpdEV2ZW50Q3VzdG9tU2htZW1J bml0KCk7CiAJSW5qZWN0aW9uUG9pbnRTaG1lbUluaXQoKTsKKwlNZW1DdHhTaG1lbUluaXQoKTsK KwlNZW1DdHhCYWNrZW5kU2htZW1Jbml0KCk7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2lwYy9wcm9jc2lnbmFsLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2lwYy9w cm9jc2lnbmFsLmMKaW5kZXggNzQwMWI2ZTYyNS4uZTQyNWI5ZWViMCAxMDA2NDQKLS0tIGEvc3Jj L2JhY2tlbmQvc3RvcmFnZS9pcGMvcHJvY3NpZ25hbC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvaXBjL3Byb2NzaWduYWwuYwpAQCAtNjg4LDYgKzY4OCw5IEBAIHByb2NzaWduYWxfc2lndXNy MV9oYW5kbGVyKFNJR05BTF9BUkdTKQogCWlmIChDaGVja1Byb2NTaWduYWwoUFJPQ1NJR19MT0df TUVNT1JZX0NPTlRFWFQpKQogCQlIYW5kbGVMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiAK KwlpZiAoQ2hlY2tQcm9jU2lnbmFsKFBST0NTSUdfR0VUX01FTU9SWV9DT05URVhUKSkKKwkJSGFu ZGxlR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCgpOworCiAJaWYgKENoZWNrUHJvY1NpZ25hbChQ Uk9DU0lHX1BBUkFMTEVMX0FQUExZX01FU1NBR0UpKQogCQlIYW5kbGVQYXJhbGxlbEFwcGx5TWVz c2FnZUludGVycnVwdCgpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC90Y29wL3Bvc3RncmVz LmMgYi9zcmMvYmFja2VuZC90Y29wL3Bvc3RncmVzLmMKaW5kZXggZjJmNzVhYTBmOC4uOGFlODkw ZTMyMCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdGNvcC9wb3N0Z3Jlcy5jCisrKyBiL3NyYy9i YWNrZW5kL3Rjb3AvcG9zdGdyZXMuYwpAQCAtMzQ5OSw2ICszNDk5LDkgQEAgUHJvY2Vzc0ludGVy cnVwdHModm9pZCkKIAlpZiAoTG9nTWVtb3J5Q29udGV4dFBlbmRpbmcpCiAJCVByb2Nlc3NMb2dN ZW1vcnlDb250ZXh0SW50ZXJydXB0KCk7CiAKKwlpZiAoUHVibGlzaE1lbW9yeUNvbnRleHRQZW5k aW5nKQorCQlQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCgpOworCiAJaWYgKFBhcmFs bGVsQXBwbHlNZXNzYWdlUGVuZGluZykKIAkJSGFuZGxlUGFyYWxsZWxBcHBseU1lc3NhZ2VzKCk7 CiB9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS93YWl0X2V2ZW50X25h bWVzLnR4dCBiL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0 CmluZGV4IGUxOTlmMDcxNjIuLjM2NzRiNWI3YjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0 aWxzL2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0CisrKyBiL3NyYy9iYWNrZW5kL3V0aWxz L2FjdGl2aXR5L3dhaXRfZXZlbnRfbmFtZXMudHh0CkBAIC0xNTksNiArMTU5LDcgQEAgV0FMX1JF Q0VJVkVSX0VYSVQJIldhaXRpbmcgZm9yIHRoZSBXQUwgcmVjZWl2ZXIgdG8gZXhpdC4iCiBXQUxf UkVDRUlWRVJfV0FJVF9TVEFSVAkiV2FpdGluZyBmb3Igc3RhcnR1cCBwcm9jZXNzIHRvIHNlbmQg aW5pdGlhbCBkYXRhIGZvciBzdHJlYW1pbmcgcmVwbGljYXRpb24uIgogV0FMX1NVTU1BUllfUkVB RFkJIldhaXRpbmcgZm9yIGEgbmV3IFdBTCBzdW1tYXJ5IHRvIGJlIGdlbmVyYXRlZC4iCiBYQUNU X0dST1VQX1VQREFURQkiV2FpdGluZyBmb3IgdGhlIGdyb3VwIGxlYWRlciB0byB1cGRhdGUgdHJh bnNhY3Rpb24gc3RhdHVzIGF0IHRyYW5zYWN0aW9uIGVuZC4iCitNRU1fQ1RYX1BVQkxJU0gJIldh aXRpbmcgZm9yIGJhY2tlbmQgdG8gcHVibGlzaCBtZW1vcnkgaW5mb3JtYXRpb24uIgogCiBBQklf Y29tcGF0aWJpbGl0eToKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRm dW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L21jeHRmdW5jcy5jCmluZGV4IDM5NmMyZjIy M2IuLmYzMDY0N2I0YmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9tY3h0ZnVu Y3MuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvbWN4dGZ1bmNzLmMKQEAgLTE3LDExICsx NywxOCBAQAogCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgi CisjaW5jbHVkZSAibWlzY2FkbWluLmgiCisjaW5jbHVkZSAiYWNjZXNzL3R3b3BoYXNlLmgiCisj aW5jbHVkZSAiY2F0YWxvZy9wZ19hdXRoaWRfZC5oIgorI2luY2x1ZGUgIm5vZGVzL3BnX2xpc3Qu aCIKICNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKICNpbmNsdWRlICJzdG9yYWdlL3Byb2NhcnJh eS5oIgorI2luY2x1ZGUgInV0aWxzL2FjbC5oIgogI2luY2x1ZGUgInV0aWxzL2FycmF5LmgiCiAj aW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9oc2VhcmNoLmgiCisj aW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIKKyNpbmNsdWRlICJ1dGlscy93YWl0X2V2ZW50X3R5 cGVzLmgiCiAKIC8qIC0tLS0tLS0tLS0KICAqIFRoZSBtYXggYnl0ZXMgZm9yIHNob3dpbmcgaWRl bnRpZmllcnMgb2YgTWVtb3J5Q29udGV4dC4KQEAgLTI5LDE2ICszNiw4IEBACiAgKi8KICNkZWZp bmUgTUVNT1JZX0NPTlRFWFRfSURFTlRfRElTUExBWV9TSVpFCTEwMjQKIAotLyoKLSAqIE1lbW9y eUNvbnRleHRJZAotICoJCVVzZWQgZm9yIHN0b3JhZ2Ugb2YgdHJhbnNpZW50IGlkZW50aWZpZXJz IGZvcgotICoJCXBnX2dldF9iYWNrZW5kX21lbW9yeV9jb250ZXh0cy4KLSAqLwotdHlwZWRlZiBz dHJ1Y3QgTWVtb3J5Q29udGV4dElkCi17Ci0JTWVtb3J5Q29udGV4dCBjb250ZXh0OwotCWludAkJ CWNvbnRleHRfaWQ7Ci19CQkJTWVtb3J5Q29udGV4dElkOworc3RydWN0IE1lbW9yeUNvbnRleHRC YWNrZW5kU3RhdGUgKm1lbUN0eFN0YXRlID0gTlVMTDsKK3N0cnVjdCBNZW1vcnlDb250ZXh0U3Rh dGUgKm1lbUN0eEFyZWEgPSBOVUxMOwogCiAvKgogICogaW50X2xpc3RfdG9fYXJyYXkKQEAgLTE0 MywyNCArMTQyLDcgQEAgUHV0TWVtb3J5Q29udGV4dHNTdGF0c1R1cGxlU3RvcmUoVHVwbGVzdG9y ZXN0YXRlICp0dXBzdG9yZSwKIAllbHNlCiAJCW51bGxzWzFdID0gdHJ1ZTsKIAotCXN3aXRjaCAo Y29udGV4dC0+dHlwZSkKLQl7Ci0JCWNhc2UgVF9BbGxvY1NldENvbnRleHQ6Ci0JCQl0eXBlID0g IkFsbG9jU2V0IjsKLQkJCWJyZWFrOwotCQljYXNlIFRfR2VuZXJhdGlvbkNvbnRleHQ6Ci0JCQl0 eXBlID0gIkdlbmVyYXRpb24iOwotCQkJYnJlYWs7Ci0JCWNhc2UgVF9TbGFiQ29udGV4dDoKLQkJ CXR5cGUgPSAiU2xhYiI7Ci0JCQlicmVhazsKLQkJY2FzZSBUX0J1bXBDb250ZXh0OgotCQkJdHlw ZSA9ICJCdW1wIjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJdHlwZSA9ICI/Pz8iOwotCQkJ YnJlYWs7Ci0JfQorCXR5cGUgPSBBc3NpZ25Db250ZXh0VHlwZShjb250ZXh0LT50eXBlKTsKIAog CXZhbHVlc1syXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0odHlwZSk7CiAJdmFsdWVzWzNdID0gSW50 MzJHZXREYXR1bShsaXN0X2xlbmd0aChwYXRoKSk7CS8qIGxldmVsICovCkBAIC0xNzUsNiArMTU3 LDMyIEBAIFB1dE1lbW9yeUNvbnRleHRzU3RhdHNUdXBsZVN0b3JlKFR1cGxlc3RvcmVzdGF0ZSAq dHVwc3RvcmUsCiAJbGlzdF9mcmVlKHBhdGgpOwogfQogCitjb25zdCBjaGFyICoKK0Fzc2lnbkNv bnRleHRUeXBlKE5vZGVUYWcgdHlwZSkKK3sKKwljb25zdCBjaGFyICpjb250ZXh0X3R5cGU7CisK Kwlzd2l0Y2ggKHR5cGUpCisJeworCQljYXNlIFRfQWxsb2NTZXRDb250ZXh0OgorCQkJY29udGV4 dF90eXBlID0gIkFsbG9jU2V0IjsKKwkJCWJyZWFrOworCQljYXNlIFRfR2VuZXJhdGlvbkNvbnRl eHQ6CisJCQljb250ZXh0X3R5cGUgPSAiR2VuZXJhdGlvbiI7CisJCQlicmVhazsKKwkJY2FzZSBU X1NsYWJDb250ZXh0OgorCQkJY29udGV4dF90eXBlID0gIlNsYWIiOworCQkJYnJlYWs7CisJCWNh c2UgVF9CdW1wQ29udGV4dDoKKwkJCWNvbnRleHRfdHlwZSA9ICJCdW1wIjsKKwkJCWJyZWFrOwor CQlkZWZhdWx0OgorCQkJY29udGV4dF90eXBlID0gIj8/PyI7CisJCQlicmVhazsKKwl9CisJcmV0 dXJuIChjb250ZXh0X3R5cGUpOworfQorCiAvKgogICogcGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2Nv bnRleHRzCiAgKgkJU1FMIFNSRiBzaG93aW5nIGJhY2tlbmQgbWVtb3J5IGNvbnRleHQuCkBAIC0z MDUsMyArMzEzLDM2NyBAQCBwZ19sb2dfYmFja2VuZF9tZW1vcnlfY29udGV4dHMoUEdfRlVOQ1RJ T05fQVJHUykKIAogCVBHX1JFVFVSTl9CT09MKHRydWUpOwogfQorCisvKgorICogcGdfZ2V0X3By b2Nlc3NfbWVtb3J5X2NvbnRleHRzCisgKgkJU2lnbmFsIGEgYmFja2VuZCBvciBhbiBhdXhpbGlh cnkgcHJvY2VzcyB0byBzZW5kIGl0cyBtZW1vcnkgY29udGV4dHMsCisgKgkJd2FpdCBmb3IgdGhl IHJlc3VsdHMgYW5kIGRpc3BsYXkgdGhlbS4KKyAqCisgKiBCeSBkZWZhdWx0LCBvbmx5IHN1cGVy dXNlcnMgb3IgdXNlcnMgd2l0aCBQR19SRUFEX0FMTF9TVEFUUyBhcmUgYWxsb3dlZCB0bworICog c2lnbmFsIHRvIHJldHVybiB0aGUgbWVtb3J5IGNvbnRleHRzIGJlY2F1c2UgYWxsb3dpbmcgYW55 IHVzZXJzIHRvIGlzc3VlCisgKiB0aGlzIHJlcXVlc3QgYXQgYW4gdW5ib3VuZGVkIHJhdGUgd291 bGQgY2F1c2UgbG90cyBvZiByZXF1ZXN0cyB0byBiZSBzZW50CisgKiBhbmQgd2hpY2ggY2FuIGxl YWQgdG8gZGVuaWFsIG9mIHNlcnZpY2UuIEFkZGl0aW9uYWwgcm9sZXMgY2FuIGJlIHBlcm1pdHRl ZAorICogd2l0aCBHUkFOVC4KKyAqCisgKiBPbiByZWNlaXB0IG9mIHRoaXMgc2lnbmFsLCBhIGJh Y2tlbmQgb3IgYW4gYXV4aWxpYXJ5IHByb2Nlc3Mgc2V0cyB0aGUgZmxhZworICogaW4gdGhlIHNp Z25hbCBoYW5kbGVyLCB3aGljaCBjYXVzZXMgdGhlIG5leHQgQ0hFQ0tfRk9SX0lOVEVSUlVQVFMo KQorICogb3IgcHJvY2Vzcy1zcGVjaWZpYyBpbnRlcnJ1cHQgaGFuZGxlciB0byBjb3B5IHRoZSBt ZW1vcnkgY29udGV4dCBkZXRhaWxzCisgKiB0byBhIGR5bmFtaWMgc2hhcmVkIG1lbW9yeSBzcGFj ZS4KKyAqCisgKiBUaGUgc2hhcmVkIG1lbW9yeSBidWZmZXIgaGFzIGEgbGltaXRlZCBzaXplIC0g aXQgdGhlIHByb2Nlc3MgaGFzIHRvbyBtYW55CisgKiBtZW1vcnkgY29udGV4dHMsIHRoZSBtZW1v cnkgY29udGV4dHMgaW50byB0aGF0IGRvIG5vdCBmaXQgYXJlIHN1bW1hcml6ZWQKKyAqIGFuZCBy ZXByZXNlbnRlZCBhcyBjdW11bGF0aXZlIHRvdGFsIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4K KyAqCisgKiBBZnRlciBzZW5kaW5nIHRoZSBzaWduYWwsIHdhaXQgb24gYSBjb25kaXRpb24gdmFy aWFibGUuIFRoZSBwdWJsaXNoaW5nCisgKiBiYWNrZW5kLCBhZnRlciBjb3B5aW5nIHRoZSBkYXRh IHRvIHNoYXJlZCBtZW1vcnksIHNlbmRzIHNpZ25hbCBvbiB0aGF0CisgKiBjb25kaXRpb24gdmFy aWFibGUuCisgKiBPbmNlIGNvbmRpdGlvbiB2YXJpYWJsZSBjb21lcyBvdXQgb2Ygc2xlZXAsIGNo ZWNrIGlmIHRoZSBtZW1vcnkgY29udGV4dAorICogaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZv ciByZWFkIGFuZCBkaXNwbGF5LgorICoKKyAqIElmIHRoZSBwdWJsaXNoaW5nIGJhY2tlbmQgZG9l cyBub3QgcmVzcG9uZCBiZWZvcmUgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQorICogdGltZXMgb3V0 LCB3aGljaCBpcyBzZXQgdG8gTUVNU1RBVFNfV0FJVF9USU1FT1VULCByZXRyeSBmb3IgbWF4X3Ry aWVzCisgKiBudW1iZXIgb2YgdGltZXMsIHdoaWNoIGlzIGRlZmluZWQgYnkgdXNlciwgYmVmb3Jl IGdpdmluZyB1cCBhbmQKKyAqIHJldHVybmluZyBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzdGF0aXN0 aWNzLCBpZiBhbnkuCisgKi8KK0RhdHVtCitwZ19nZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMo UEdfRlVOQ1RJT05fQVJHUykKK3sKKwlpbnQJCQlwaWQgPSBQR19HRVRBUkdfSU5UMzIoMCk7CisJ Ym9vbAkJZ2V0X3N1bW1hcnkgPSBQR19HRVRBUkdfQk9PTCgxKTsKKwlQR1BST0MJICAgKnByb2M7 CisJUHJvY051bWJlcglwcm9jTnVtYmVyID0gSU5WQUxJRF9QUk9DX05VTUJFUjsKKwlpbnQJCQlp OworCVJldHVyblNldEluZm8gKnJzaW5mbyA9IChSZXR1cm5TZXRJbmZvICopIGZjaW5mby0+cmVz dWx0aW5mbzsKKwlkc2FfYXJlYSAgICphcmVhOworCU1lbW9yeUNvbnRleHRFbnRyeSAqbWVtY3R4 X2luZm87CisJaW50CQkJbnVtX3JldHJpZXMgPSAwOworCVRpbWVzdGFtcFR6IGN1cnJfdGltZXN0 YW1wOworCWludAkJCW1heF90cmllcyA9IFBHX0dFVEFSR19JTlQzMigyKTsKKworCS8qCisJICog T25seSBzdXBlcnVzZXJzIG9yIHVzZXJzIHdpdGggcGdfcmVhZF9hbGxfc3RhdHMgcHJpdmlsZWdl cyBjYW4gdmlldyB0aGUKKwkgKiBtZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzIG9mIGFub3RoZXIg cHJvY2VzcworCSAqLworCWlmICghaGFzX3ByaXZzX29mX3JvbGUoR2V0VXNlcklkKCksIFJPTEVf UEdfUkVBRF9BTExfU1RBVFMpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNP REVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coIm1lbW9y eSBjb250ZXh0IHN0YXRpc3RpY3MgcHJpdmlsZWdlIGVycm9yIikpKTsKKworCUluaXRNYXRlcmlh bGl6ZWRTUkYoZmNpbmZvLCAwKTsKKworCS8qCisJICogU2VlIGlmIHRoZSBwcm9jZXNzIHdpdGgg Z2l2ZW4gcGlkIGlzIGEgYmFja2VuZCBvciBhbiBhdXhpbGlhcnkgcHJvY2Vzcy4KKwkgKi8KKwlw cm9jID0gQmFja2VuZFBpZEdldFByb2MocGlkKTsKKwlpZiAocHJvYyA9PSBOVUxMKQorCQlwcm9j ID0gQXV4aWxpYXJ5UGlkR2V0UHJvYyhwaWQpOworCisJLyoKKwkgKiBCYWNrZW5kUGlkR2V0UHJv YygpIGFuZCBBdXhpbGlhcnlQaWRHZXRQcm9jKCkgcmV0dXJuIE5VTEwgaWYgdGhlIHBpZAorCSAq IGlzbid0IHZhbGlkOyBidXQgYnkgdGhlIHRpbWUgd2UgcmVhY2gga2lsbCgpLCBhIHByb2Nlc3Mg Zm9yIHdoaWNoIHdlCisJICogZ2V0IGEgdmFsaWQgcHJvYyBoZXJlIG1pZ2h0IGhhdmUgdGVybWlu YXRlZCBvbiBpdHMgb3duLiAgVGhlcmUncyBubyB3YXkKKwkgKiB0byBhY3F1aXJlIGEgbG9jayBv biBhbiBhcmJpdHJhcnkgcHJvY2VzcyB0byBwcmV2ZW50IHRoYXQuIEJ1dCBzaW5jZQorCSAqIHRo aXMgbWVjaGFuaXNtIGlzIHVzdWFsbHkgdXNlZCB0byBkZWJ1ZyBhIGJhY2tlbmQgb3IgYW4gYXV4 aWxpYXJ5CisJICogcHJvY2VzcyBydW5uaW5nIGFuZCBjb25zdW1pbmcgbG90cyBvZiBtZW1vcnks IHRoYXQgaXQgbWlnaHQgZW5kIG9uIGl0cworCSAqIG93biBmaXJzdCBhbmQgaXRzIG1lbW9yeSBj b250ZXh0cyBhcmUgbm90IGxvZ2dlZCBpcyBub3QgYSBwcm9ibGVtLgorCSAqLworCWlmIChwcm9j ID09IE5VTEwpCisJeworCQkvKgorCQkgKiBUaGlzIGlzIGp1c3QgYSB3YXJuaW5nIHNvIGEgbG9v cC10aHJvdWdoLXJlc3VsdHNldCB3aWxsIG5vdCBhYm9ydAorCQkgKiBpZiBvbmUgYmFja2VuZCB0 ZXJtaW5hdGVkIG9uIGl0cyBvd24gZHVyaW5nIHRoZSBydW4uCisJCSAqLworCQllcmVwb3J0KFdB Uk5JTkcsCisJCQkJKGVycm1zZygiUElEICVkIGlzIG5vdCBhIFBvc3RncmVTUUwgc2VydmVyIHBy b2Nlc3MiLAorCQkJCQkJcGlkKSkpOworCQlQR19SRVRVUk5fTlVMTCgpOworCX0KKworCXByb2NO dW1iZXIgPSBHZXROdW1iZXJGcm9tUEdQcm9jKHByb2MpOworCWlmIChwcm9jTnVtYmVyID09IE15 UHJvY051bWJlcikKKwl7CisJCWVyZXBvcnQoV0FSTklORywKKwkJCQkoZXJybXNnKCJjYW5ub3Qg cmV0dXJuIHN0YXRpc3RpY3MgZm9yIGxvY2FsIGJhY2tlbmQiKSwKKwkJCQkgZXJyaGludCgiVXNl IHBnX2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzIHZpZXcgaW5zdGVhZCIpKSk7CisJCVBHX1JFVFVS Tl9OVUxMKCk7CisJfQorCisJTFdMb2NrQWNxdWlyZSgmbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0u bHdfbG9jaywgTFdfRVhDTFVTSVZFKTsKKwltZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS5nZXRfc3Vt bWFyeSA9IGdldF9zdW1tYXJ5OworCUxXTG9ja1JlbGVhc2UoJm1lbUN0eFN0YXRlW3Byb2NOdW1i ZXJdLmx3X2xvY2spOworCisJY3Vycl90aW1lc3RhbXAgPSBHZXRDdXJyZW50VGltZXN0YW1wKCk7 CisKKwkvKgorCSAqIFNlbmQgYSBzaWduYWwgdG8gYSBwb3N0Z3Jlc3FsIHByb2Nlc3MsIGluZm9y bWluZyBpdCB3ZSB3YW50IGl0IHRvCisJICogcHJvZHVjZSBpbmZvcm1hdGlvbiBhYm91dCBtZW1v cnkgY29udGV4dHMuCisJICovCisJaWYgKFNlbmRQcm9jU2lnbmFsKHBpZCwgUFJPQ1NJR19HRVRf TUVNT1JZX0NPTlRFWFQsIHByb2NOdW1iZXIpIDwgMCkKKwl7CisJCWVyZXBvcnQoV0FSTklORywK KwkJCQkoZXJybXNnKCJjb3VsZCBub3Qgc2VuZCBzaWduYWwgdG8gcHJvY2VzcyAlZDogJW0iLCBw aWQpKSk7CisJCVBHX1JFVFVSTl9OVUxMKCk7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciBhIHBv c3RncmVzcWwgcHJvY2VzcyB0byBwdWJsaXNoIHN0YXRzLCBpbmRpY2F0ZWQgYnkgYSB2YWxpZAor CSAqIGRzYSBwb2ludGVyIHNldCBieSB0aGUgYmFja2VuZC4gQSBkc2EgcG9pbnRlciBjb3VsZCBi ZSB2YWxpZCBpZgorCSAqIHN0YXRpdGljcyBoYXZlIHByZXZpb3VzbHkgYmVlbiBwdWJsaXNoZWQg YnkgdGhlIGJhY2tlbmQuIEluIHdoaWNoIGNhc2UsCisJICogY2hlY2sgaWYgc3RhdGlzdGljcyBh cmUgbm90IG9sZGVyIHRoYW4gY3Vycl90aW1lc3RhbXAsIGlmIHRoZXkgYXJlIHdhaXQKKwkgKiBm b3IgbmV3ZXIgc3RhdGlzdGljcy4gV2FpdCBmb3IgbWF4X3RyaWVzICogTUVNU1RBVFNfV0FJVF9U SU1FT1VULAorCSAqIGZvbGxvd2luZyB3aGljaCBkaXNwbGF5IG9sZGVyIHN0YXRpc3RpY3MgaWYg YXZhaWxhYmxlLgorCSAqLworCXdoaWxlICgxKQorCXsKKwkJbG9uZwkJbXNlY3M7CisKKwkJLyoK KwkJICogV2UgZXhwZWN0IHRvIGNvbWUgb3V0IG9mIHNsZWVwIHdoZW4gdGhlIHJlcXVlc3RlZCBw cm9jZXNzIGhhcworCQkgKiBmaW5pc2hlZCBwdWJsaXNoaW5nIHRoZSBzdGF0aXN0aWNzLCB2ZXJp ZmllZCB1c2luZyB0aGUgdmFsaWQgZHNhCisJCSAqIHBvaW50ZXIuCisJCSAqCisJCSAqIE1ha2Ug c3VyZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBiZWxvbmdzIHRvIHBpZCB3ZSByZXF1ZXN0ZWQKKwkJ ICogaW5mb3JtYXRpb24gZm9yLCBPdGhlcndpc2UgbG9vcCBiYWNrIGFuZCB3YWl0IGZvciB0aGUg c2VydmVyCisJCSAqIHByb2Nlc3MgdG8gZmluaXNoIHB1Ymxpc2hpbmcgc3RhdGlzdGljcy4KKwkJ ICovCisJCUxXTG9ja0FjcXVpcmUoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2ssIExX X0VYQ0xVU0lWRSk7CisJCW1zZWNzID0KKwkJCVRpbWVzdGFtcERpZmZlcmVuY2VNaWxsaXNlY29u ZHMoY3Vycl90aW1lc3RhbXAsCisJCQkJCQkJCQkJCW1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLnN0 YXRzX3RpbWVzdGFtcCk7CisKKwkJLyoKKwkJICogTm90ZSBpbiBwcm9jbnVtYmVyLmggZmlsZSBz YXlzIHRoYXQgYSBwcm9jTnVtYmVyIGNhbiBiZSByZS11c2VkIGZvcgorCQkgKiBhIGRpZmZlcmVu dCBiYWNrZW5kIGltbWVkaWF0ZWx5IGFmdGVyIGEgYmFja2VuZCBleGl0cy4gSW4gY2FzZSBhbgor CQkgKiBvbGQgcHJvY2VzcycgZGF0YSB3YXMgdGhlcmUgYW5kIG5vdCB1cGRhdGVkIGJ5IHRoZSBj dXJyZW50IHByb2Nlc3MKKwkJICogaW4gdGhlIHNsb3QgaWRlbnRpZmllZCBieSB0aGUgcHJvY051 bWJlciwgdGhlIHBpZCBvZiB0aGUgcmVxdWVzdGVkCisJCSAqIHByb2Nlc3MgYW5kIHRoZSBwcm9j X2lkIG1pZ2h0IG5vdCBtYXRjaC4KKwkJICovCisJCWlmIChtZW1DdHhTdGF0ZVtwcm9jTnVtYmVy XS5wcm9jX2lkID09IHBpZCkKKwkJeworCQkJLyoKKwkJCSAqIEJyZWFrIGlmIHRoZSBsYXRlc3Qg c3RhdHMgaGF2ZSBiZWVuIHJlYWQsIGluZGljYXRlZCBieQorCQkJICogc3RhdGlzdGljcyB0aW1l c3RhbXAgYmVpbmcgbmV3ZXIgdGhhbiB0aGUgY3VycmVudCByZXF1ZXN0CisJCQkgKiB0aW1lc3Rh bXAuCisJCQkgKi8KKwkJCWlmIChEc2FQb2ludGVySXNWYWxpZChtZW1DdHhTdGF0ZVtwcm9jTnVt YmVyXS5tZW1zdGF0c19kc2FfcG9pbnRlcikKKwkJCQkmJiBtc2VjcyA+IDApCisJCQl7CisJCQkJ TFdMb2NrUmVsZWFzZSgmbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0ubHdfbG9jayk7CisJCQkJYnJl YWs7CisJCQl9CisKKwkJfQorCQlMV0xvY2tSZWxlYXNlKCZtZW1DdHhTdGF0ZVtwcm9jTnVtYmVy XS5sd19sb2NrKTsKKworCQkvKgorCQkgKiBSZWNoZWNrIHRoZSBzdGF0ZSBvZiB0aGUgYmFja2Vu ZCBiZWZvcmUgc2xlZXBpbmcgb24gdGhlIGNvbmRpdGlvbgorCQkgKiB2YXJpYWJsZQorCQkgKi8K KwkJcHJvYyA9IEJhY2tlbmRQaWRHZXRQcm9jKHBpZCk7CisKKyNkZWZpbmUgTUVNU1RBVFNfV0FJ VF9USU1FT1VUIDEwMDAKKwkJaWYgKHByb2MgPT0gTlVMTCkKKwkJCXByb2MgPSBBdXhpbGlhcnlQ aWRHZXRQcm9jKHBpZCk7CisJCWlmIChwcm9jID09IE5VTEwpCisJCXsKKwkJCWVyZXBvcnQoV0FS TklORywKKwkJCQkJKGVycm1zZygiUElEICVkIGlzIG5vdCBhIFBvc3RncmVTUUwgc2VydmVyIHBy b2Nlc3MiLAorCQkJCQkJCXBpZCkpKTsKKwkJCVBHX1JFVFVSTl9OVUxMKCk7CisJCX0KKwkJaWYg KENvbmRpdGlvblZhcmlhYmxlVGltZWRTbGVlcCgmbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0ubWVt Y3R4X2N2LAorCQkJCQkJCQkJCU1FTVNUQVRTX1dBSVRfVElNRU9VVCwKKwkJCQkJCQkJCQlXQUlU X0VWRU5UX01FTV9DVFhfUFVCTElTSCkpCisJCXsKKwkJCWVyZXBvcnQoTE9HLAorCQkJCQkoZXJy bXNnKCJXYWl0IGZvciAlZCBwcm9jZXNzIHRvIHB1Ymxpc2ggc3RhdHMgdGltZWQgb3V0LCB0cnlp bmcgYWdhaW4iLAorCQkJCQkJCXBpZCkpKTsKKworCQkJLyoKKwkJCSAqIFdhaXQgZm9yIG1heF90 cmllcyBkZWZpbmVkIGJ5IHVzZXIsIGRpc3BsYXkgcHJldmlvdXNseQorCQkJICogcHVibGlzaGVk IHN0YXRpc3RpY3MgaWYgYW55LCB3aGVuIG1heF90cmllcyBhcmUgb3Zlci4KKwkJCSAqLworCQkJ aWYgKG51bV9yZXRyaWVzID4gbWF4X3RyaWVzKQorCQkJeworCQkJCUxXTG9ja0FjcXVpcmUoJm1l bUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2ssIExXX0VYQ0xVU0lWRSk7CisJCQkJaWYgKERz YVBvaW50ZXJJc1ZhbGlkKG1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLm1lbXN0YXRzX2RzYV9wb2lu dGVyKSkKKwkJCQl7CisJCQkJCUxXTG9ja1JlbGVhc2UoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJd Lmx3X2xvY2spOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJTFdM b2NrUmVsZWFzZSgmbWVtQ3R4U3RhdGVbcHJvY051bWJlcl0ubHdfbG9jayk7CisJCQkJCVBHX1JF VFVSTl9OVUxMKCk7CisJCQkJfQorCQkJfQorCQkJbnVtX3JldHJpZXMgPSBudW1fcmV0cmllcyAr IDE7CisJCX0KKworCX0KKworCUxXTG9ja0FjcXVpcmUoJm1lbUN0eEFyZWEtPmx3X2xvY2ssIExX X0VYQ0xVU0lWRSk7CisJLyogQXNzZXJ0IGZvciBkc2FfaGFuZGxlIHRvIGJlIHZhbGlkICovCisJ YXJlYSA9IGRzYV9hdHRhY2gobWVtQ3R4QXJlYS0+bWVtc3RhdHNfZHNhX2hhbmRsZSk7CisJLyog V2Ugc2hvdWxkIGxhbmQgaGVyZSBvbmx5IHdpdGggYSB2YWxpZCBtZW1zdGF0c19kc2FfcG9pbnRl ciAqLworCisJTFdMb2NrUmVsZWFzZSgmbWVtQ3R4QXJlYS0+bHdfbG9jayk7CisKKwkvKgorCSAq IEJhY2tlbmQgaGFzIGZpbmlzaGVkIHB1Ymxpc2hpbmcgdGhlIHN0YXRzLCByZWFkIHRoZW0KKwkg KgorCSAqIFJlYWQgc3RhdGlzdGljcyBvZiB0b3AgbGV2ZWwgMSBhbmQgMiBjb250ZXh0cywgaWYg Z2V0X3N1bW1hcnkgaXMgdHJ1ZS4KKwkgKi8KKwlMV0xvY2tBY3F1aXJlKCZtZW1DdHhTdGF0ZVtw cm9jTnVtYmVyXS5sd19sb2NrLCBMV19FWENMVVNJVkUpOworCW1lbWN0eF9pbmZvID0gKE1lbW9y eUNvbnRleHRFbnRyeSAqKSBkc2FfZ2V0X2FkZHJlc3MoYXJlYSwKKwkJCQkJCQkJCQkJCQkJIG1l bUN0eFN0YXRlW3Byb2NOdW1iZXJdLm1lbXN0YXRzX2RzYV9wb2ludGVyKTsKKworI2RlZmluZSBQ R19HRVRfUFJPQ0VTU19NRU1PUllfQ09OVEVYVFNfQ09MUwkxMQorCWZvciAoaSA9IDA7IGkgPCBt ZW1DdHhTdGF0ZVtwcm9jTnVtYmVyXS50b3RhbF9zdGF0czsgaSsrKQorCXsKKwkJQXJyYXlUeXBl ICAqcGF0aF9hcnJheTsKKwkJaW50CQkJcGF0aF9sZW5ndGg7CisJCURhdHVtCQl2YWx1ZXNbUEdf R0VUX1BST0NFU1NfTUVNT1JZX0NPTlRFWFRTX0NPTFNdOworCQlib29sCQludWxsc1tQR19HRVRf UFJPQ0VTU19NRU1PUllfQ09OVEVYVFNfQ09MU107CisJCWNoYXIJICAgKm5hbWU7CisJCWNoYXIJ ICAgKmlkZW50OworCQlEYXR1bQkgICAqcGF0aF9kYXR1bV9hcnJheTsKKworCQltZW1zZXQodmFs dWVzLCAwLCBzaXplb2YodmFsdWVzKSk7CisJCW1lbXNldChudWxscywgMCwgc2l6ZW9mKG51bGxz KSk7CisKKwkJaWYgKERzYVBvaW50ZXJJc1ZhbGlkKG1lbWN0eF9pbmZvW2ldLm5hbWUpKQorCQl7 CisJCQluYW1lID0gKGNoYXIgKikgZHNhX2dldF9hZGRyZXNzKGFyZWEsIG1lbWN0eF9pbmZvW2ld Lm5hbWUpOworCQkJdmFsdWVzWzBdID0gQ1N0cmluZ0dldFRleHREYXR1bShuYW1lKTsKKwkJfQor CQllbHNlCisJCQludWxsc1swXSA9IHRydWU7CisJCWlmIChEc2FQb2ludGVySXNWYWxpZChtZW1j dHhfaW5mb1tpXS5pZGVudCkpCisJCXsKKwkJCWlkZW50ID0gKGNoYXIgKikgZHNhX2dldF9hZGRy ZXNzKGFyZWEsIG1lbWN0eF9pbmZvW2ldLmlkZW50KTsKKwkJCXZhbHVlc1sxXSA9IENTdHJpbmdH ZXRUZXh0RGF0dW0oaWRlbnQpOworCQl9CisJCWVsc2UKKwkJCW51bGxzWzFdID0gdHJ1ZTsKKwor CQlpZiAobWVtY3R4X2luZm9baV0udHlwZSAhPSBOVUxMKQorCQkJdmFsdWVzWzJdID0gQ1N0cmlu Z0dldFRleHREYXR1bShtZW1jdHhfaW5mb1tpXS50eXBlKTsKKwkJZWxzZQorCQkJbnVsbHNbMl0g PSB0cnVlOworCisJCXBhdGhfbGVuZ3RoID0gbWVtY3R4X2luZm9baV0ucGF0aF9sZW5ndGg7CisK KwkJaWYgKERzYVBvaW50ZXJJc1ZhbGlkKG1lbWN0eF9pbmZvW2ldLnBhdGgpKQorCQl7CisJCQlw YXRoX2RhdHVtX2FycmF5ID0gKERhdHVtICopIGRzYV9nZXRfYWRkcmVzcyhhcmVhLCBtZW1jdHhf aW5mb1tpXS5wYXRoKTsKKwkJCXBhdGhfYXJyYXkgPSBjb25zdHJ1Y3RfYXJyYXlfYnVpbHRpbihw YXRoX2RhdHVtX2FycmF5LAorCQkJCQkJCQkJCQkJIHBhdGhfbGVuZ3RoLCBJTlQ0T0lEKTsKKwor CQkJdmFsdWVzWzNdID0gUG9pbnRlckdldERhdHVtKHBhdGhfYXJyYXkpOworCQl9CisJCWVsc2UK KwkJCW51bGxzWzNdID0gdHJ1ZTsKKwkJdmFsdWVzWzRdID0gSW50NjRHZXREYXR1bShtZW1jdHhf aW5mb1tpXS50b3RhbHNwYWNlKTsKKwkJdmFsdWVzWzVdID0gSW50NjRHZXREYXR1bShtZW1jdHhf aW5mb1tpXS5uYmxvY2tzKTsKKwkJdmFsdWVzWzZdID0gSW50NjRHZXREYXR1bShtZW1jdHhfaW5m b1tpXS5mcmVlc3BhY2UpOworCQl2YWx1ZXNbN10gPSBJbnQ2NEdldERhdHVtKG1lbWN0eF9pbmZv W2ldLmZyZWVjaHVua3MpOworCQl2YWx1ZXNbOF0gPSBJbnQ2NEdldERhdHVtKG1lbWN0eF9pbmZv W2ldLnRvdGFsc3BhY2UgLQorCQkJCQkJCQkgIG1lbWN0eF9pbmZvW2ldLmZyZWVzcGFjZSk7CisJ CXZhbHVlc1s5XSA9IEludDMyR2V0RGF0dW0obWVtY3R4X2luZm9baV0ubnVtX2FnZ19zdGF0cyk7 CisJCXZhbHVlc1sxMF0gPSBUaW1lc3RhbXBUekdldERhdHVtKG1lbUN0eFN0YXRlW3Byb2NOdW1i ZXJdLnN0YXRzX3RpbWVzdGFtcCk7CisKKwkJdHVwbGVzdG9yZV9wdXR2YWx1ZXMocnNpbmZvLT5z ZXRSZXN1bHQsIHJzaW5mby0+c2V0RGVzYywKKwkJCQkJCQkgdmFsdWVzLCBudWxscyk7CisJfQor CUxXTG9ja1JlbGVhc2UoJm1lbUN0eFN0YXRlW3Byb2NOdW1iZXJdLmx3X2xvY2spOworCisJQ29u ZGl0aW9uVmFyaWFibGVDYW5jZWxTbGVlcCgpOworCWRzYV9kZXRhY2goYXJlYSk7CisKKwlQR19S RVRVUk5fTlVMTCgpOworfQorCisvKgorICogU2hhcmVkIG1lbW9yeSBzaXppbmcgZm9yIHJlcG9y dGluZyBtZW1vcnkgY29udGV4dCBpbmZvcm1hdGlvbi4KKyAqLworc3RhdGljIFNpemUKK01lbUN0 eFNobWVtU2l6ZSh2b2lkKQoreworCVNpemUJCVRvdGFsUHJvY3MgPQorCQlhZGRfc2l6ZShNYXhC YWNrZW5kcywgYWRkX3NpemUoTlVNX0FVWElMSUFSWV9QUk9DUywgbWF4X3ByZXBhcmVkX3hhY3Rz KSk7CisKKwlyZXR1cm4gbXVsX3NpemUoVG90YWxQcm9jcywgc2l6ZW9mKE1lbW9yeUNvbnRleHRC YWNrZW5kU3RhdGUpKTsKK30KKworLyoKKyAqIEluaXQgc2hhcmVkIG1lbW9yeSBmb3IgcmVwb3J0 aW5nIG1lbW9yeSBjb250ZXh0IGluZm9ybWF0aW9uLgorICovCit2b2lkCitNZW1DdHhCYWNrZW5k U2htZW1Jbml0KHZvaWQpCit7CisJYm9vbAkJZm91bmQ7CisJU2l6ZQkJVG90YWxQcm9jcyA9CisJ CWFkZF9zaXplKE1heEJhY2tlbmRzLCBhZGRfc2l6ZShOVU1fQVVYSUxJQVJZX1BST0NTLCBtYXhf cHJlcGFyZWRfeGFjdHMpKTsKKworCW1lbUN0eFN0YXRlID0gKE1lbW9yeUNvbnRleHRCYWNrZW5k U3RhdGUgKikgU2htZW1Jbml0U3RydWN0KCJNZW1vcnlDb250ZXh0QmFja2VuZFN0YXRlIiwKKwkJ CQkJCQkJCQkJCQkJCQlNZW1DdHhTaG1lbVNpemUoKSwKKwkJCQkJCQkJCQkJCQkJCQkmZm91bmQp OworCWlmICghSXNVbmRlclBvc3RtYXN0ZXIpCisJeworCQlBc3NlcnQoIWZvdW5kKTsKKworCQlm b3IgKGludCBpID0gMDsgaSA8IFRvdGFsUHJvY3M7IGkrKykKKwkJeworCQkJQ29uZGl0aW9uVmFy aWFibGVJbml0KCZtZW1DdHhTdGF0ZVtpXS5tZW1jdHhfY3YpOworCisJCQlMV0xvY2tJbml0aWFs aXplKCZtZW1DdHhTdGF0ZVtpXS5sd19sb2NrLAorCQkJCQkJCSBMV0xvY2tOZXdUcmFuY2hlSWQo KSk7CisJCQlMV0xvY2tSZWdpc3RlclRyYW5jaGUobWVtQ3R4U3RhdGVbaV0ubHdfbG9jay50cmFu Y2hlLAorCQkJCQkJCQkgICJtZW1fY29udGV4dF9iYWNrZW5kX3N0YXRzX3JlcG9ydGluZyIpOwor CisJCQltZW1DdHhTdGF0ZVtpXS5tZW1zdGF0c19kc2FfcG9pbnRlciA9IEludmFsaWREc2FQb2lu dGVyOworCQl9CisJfQorCWVsc2UKKwl7CisJCUFzc2VydChmb3VuZCk7CisJfQorfQorCisvKgor ICogSW5pdGlhbGl6ZSBzaGFyZWQgbWVtb3J5IGZvciBkaXNwbGF5aW5nIG1lbW9yeQorICogY29u dGV4dCBzdGF0aXN0aWNzCisgKi8KK3ZvaWQKK01lbUN0eFNobWVtSW5pdCh2b2lkKQoreworCWJv b2wJCWZvdW5kOworCisJbWVtQ3R4QXJlYSA9IChNZW1vcnlDb250ZXh0U3RhdGUgKikgU2htZW1J bml0U3RydWN0KCJNZW1vcnlDb250ZXh0U3RhdGUiLCBzaXplb2YoTWVtb3J5Q29udGV4dFN0YXRl KSwKKwkJCQkJCQkJCQkJCQkJJmZvdW5kKTsKKwlpZiAoIUlzVW5kZXJQb3N0bWFzdGVyKQorCXsK KwkJQXNzZXJ0KCFmb3VuZCk7CisKKwkJTFdMb2NrSW5pdGlhbGl6ZSgmbWVtQ3R4QXJlYS0+bHdf bG9jaywKKwkJCQkJCSBMV0xvY2tOZXdUcmFuY2hlSWQoKSk7CisJCUxXTG9ja1JlZ2lzdGVyVHJh bmNoZShtZW1DdHhBcmVhLT5sd19sb2NrLnRyYW5jaGUsCisJCQkJCQkJICAibWVtX2NvbnRleHRf c3RhdHNfcmVwb3J0aW5nIik7CisJCW1lbUN0eEFyZWEtPm1lbXN0YXRzX2RzYV9oYW5kbGUgPSBE U0FfSEFORExFX0lOVkFMSUQ7CisJfQorCWVsc2UKKwl7CisJCUFzc2VydChmb3VuZCk7CisJfQor fQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9iYWxzLmMgYi9zcmMvYmFj a2VuZC91dGlscy9pbml0L2dsb2JhbHMuYwppbmRleCBiODQ0ZjlmZGFlLi4xMzkzOGNjYjBmIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMuYworKysgYi9zcmMvYmFj a2VuZC91dGlscy9pbml0L2dsb2JhbHMuYwpAQCAtMzgsNiArMzgsNyBAQCB2b2xhdGlsZSBzaWdf YXRvbWljX3QgVHJhbnNhY3Rpb25UaW1lb3V0UGVuZGluZyA9IGZhbHNlOwogdm9sYXRpbGUgc2ln X2F0b21pY190IElkbGVTZXNzaW9uVGltZW91dFBlbmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNp Z19hdG9taWNfdCBQcm9jU2lnbmFsQmFycmllclBlbmRpbmcgPSBmYWxzZTsKIHZvbGF0aWxlIHNp Z19hdG9taWNfdCBMb2dNZW1vcnlDb250ZXh0UGVuZGluZyA9IGZhbHNlOwordm9sYXRpbGUgc2ln X2F0b21pY190IFB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZyA9IGZhbHNlOwogdm9sYXRpbGUg c2lnX2F0b21pY190IElkbGVTdGF0c1VwZGF0ZVRpbWVvdXRQZW5kaW5nID0gZmFsc2U7CiB2b2xh dGlsZSB1aW50MzIgSW50ZXJydXB0SG9sZG9mZkNvdW50ID0gMDsKIHZvbGF0aWxlIHVpbnQzMiBR dWVyeUNhbmNlbEhvbGRvZmZDb3VudCA9IDA7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9tbWdyL21jeHQuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4dC5jCmluZGV4IDk0NmEz NzMxZmQuLjQ0ZmJkNDBhZjYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4 dC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4dC5jCkBAIC0xOSwxNiArMTksMjIg QEAKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICovCiAKKyNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVk ZSAicG9zdGdyZXMuaCIKIAogI2luY2x1ZGUgIm1iL3BnX3djaGFyLmgiCiAjaW5jbHVkZSAibWlz Y2FkbWluLmgiCisjaW5jbHVkZSAibm9kZXMvcGdfbGlzdC5oIgorI2luY2x1ZGUgInN0b3JhZ2Uv ZmQuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2x3bG9jay5oIgorI2luY2x1ZGUgInN0b3JhZ2UvZHNt LmgiCisjaW5jbHVkZSAidXRpbHMvZHNhLmgiCisjaW5jbHVkZSAidXRpbHMvaHNlYXJjaC5oIgog I2luY2x1ZGUgInV0aWxzL21lbWRlYnVnLmgiCiAjaW5jbHVkZSAidXRpbHMvbWVtdXRpbHMuaCIK ICNpbmNsdWRlICJ1dGlscy9tZW11dGlsc19pbnRlcm5hbC5oIgogI2luY2x1ZGUgInV0aWxzL21l bXV0aWxzX21lbW9yeWNodW5rLmgiCiAKLQogc3RhdGljIHZvaWQgQm9ndXNGcmVlKHZvaWQgKnBv aW50ZXIpOwogc3RhdGljIHZvaWQgKkJvZ3VzUmVhbGxvYyh2b2lkICpwb2ludGVyLCBTaXplIHNp emUsIGludCBmbGFncyk7CiBzdGF0aWMgTWVtb3J5Q29udGV4dCBCb2d1c0dldENodW5rQ29udGV4 dCh2b2lkICpwb2ludGVyKTsKQEAgLTE3Nyw2ICsxODMsMTcgQEAgc3RhdGljIHZvaWQgTWVtb3J5 Q29udGV4dFN0YXRzSW50ZXJuYWwoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBpbnQgbGV2ZWwsCiBz dGF0aWMgdm9pZCBNZW1vcnlDb250ZXh0U3RhdHNQcmludChNZW1vcnlDb250ZXh0IGNvbnRleHQs IHZvaWQgKnBhc3N0aHJ1LAogCQkJCQkJCQkJY29uc3QgY2hhciAqc3RhdHNfc3RyaW5nLAogCQkJ CQkJCQkJYm9vbCBwcmludF90b19zdGRlcnIpOworc3RhdGljIHZvaWQgUHVibGlzaE1lbW9yeUNv bnRleHQoTWVtb3J5Q29udGV4dEVudHJ5ICptZW1jdHhfaW5mb3MsCisJCQkJCQkJCSBpbnQgY3Vy cl9pZCwgTWVtb3J5Q29udGV4dCBjb250ZXh0LAorCQkJCQkJCQkgTGlzdCAqcGF0aCwKKwkJCQkJ CQkJIE1lbW9yeUNvbnRleHRDb3VudGVycyBzdGF0LAorCQkJCQkJCQkgaW50IG51bV9jb250ZXh0 cywgZHNhX2FyZWEgKmFyZWEpOworc3RhdGljIHZvaWQgY29tcHV0ZV9udW1fb2ZfY29udGV4dHMo TGlzdCAqY29udGV4dHMsIEhUQUIgKmNvbnRleHRfaWRfbG9va3VwLAorCQkJCQkJCQkJaW50ICpz dGF0c19jb3VudCwKKwkJCQkJCQkJCWJvb2wgZ2V0X3N1bW1hcnkpOworc3RhdGljIExpc3QgKmNv bXB1dGVfY29udGV4dF9wYXRoKE1lbW9yeUNvbnRleHQgYywgSFRBQiAqY29udGV4dF9pZF9sb29r dXApOworc3RhdGljIHZvaWQgZHNhX2ZyZWVfcHJldmlvdXNfc3RhdHMoZHNhX2FyZWEgKmFyZWEs IGludCB0b3RhbF9zdGF0cywgZHNhX3BvaW50ZXIgcHJldl9kc2FfcG9pbnRlcik7CisKIAogLyoK ICAqIFlvdSBzaG91bGQgbm90IGRvIG1lbW9yeSBhbGxvY2F0aW9ucyB3aXRoaW4gYSBjcml0aWNh bCBzZWN0aW9uLCBiZWNhdXNlCkBAIC0xMzIxLDYgKzEzMzgsMjEgQEAgSGFuZGxlTG9nTWVtb3J5 Q29udGV4dEludGVycnVwdCh2b2lkKQogCS8qIGxhdGNoIHdpbGwgYmUgc2V0IGJ5IHByb2NzaWdu YWxfc2lndXNyMV9oYW5kbGVyICovCiB9CiAKKy8qCisgKiBIYW5kbGVHZXRNZW1vcnlDb250ZXh0 SW50ZXJydXB0CisgKgkJSGFuZGxlIHJlY2VpcHQgb2YgYW4gaW50ZXJydXB0IGluZGljYXRpbmcg cHVibGlzaGluZyBvZiBtZW1vcnkKKyAqCQljb250ZXh0cy4KKyAqCisgKiBBbGwgdGhlIGFjdHVh bCB3b3JrIGlzIGRlZmVycmVkIHRvIFByb2Nlc3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0KCkK KyAqLwordm9pZAorSGFuZGxlR2V0TWVtb3J5Q29udGV4dEludGVycnVwdCh2b2lkKQoreworCUlu dGVycnVwdFBlbmRpbmcgPSB0cnVlOworCVB1Ymxpc2hNZW1vcnlDb250ZXh0UGVuZGluZyA9IHRy dWU7CisJLyogbGF0Y2ggd2lsbCBiZSBzZXQgYnkgcHJvY3NpZ25hbF9zaWd1c3IxX2hhbmRsZXIg Ki8KK30KKwogLyoKICAqIFByb2Nlc3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0CiAgKiAJCVBl cmZvcm0gbG9nZ2luZyBvZiBtZW1vcnkgY29udGV4dHMgb2YgdGhpcyBiYWNrZW5kIHByb2Nlc3Mu CkBAIC0xMzU4LDYgKzEzOTAsNDU2IEBAIFByb2Nlc3NMb2dNZW1vcnlDb250ZXh0SW50ZXJydXB0 KHZvaWQpCiAJTWVtb3J5Q29udGV4dFN0YXRzRGV0YWlsKFRvcE1lbW9yeUNvbnRleHQsIDEwMCwg MTAwLCBmYWxzZSk7CiB9CiAKKy8qCisgKiBQcm9jZXNzR2V0TWVtb3J5Q29udGV4dEludGVycnVw dAorICoJCUdlbmVyYXRlIGluZm9ybWF0aW9uIGFib3V0IG1lbW9yeSBjb250ZXh0cyB1c2VkIGJ5 IHRoZSBwcm9jZXNzLgorICoKKyAqIFBlcmZvcm1zIGEgYnJlYWR0aCBmaXJzdCBzZWFyY2ggb24g dGhlIG1lbW9yeSBjb250ZXh0IHRyZWUsIHRodXMgcGFyZW50cworICogc3RhdGlzdGljcyBhcmUg cmVwb3J0ZWQgYmVmb3JlIGNoaWxkcmVuIGluIHRoZSBtb25pdG9yaW5nIGZ1bmN0aW9uIG91dHB1 dC4KKyAqCisgKiBTdGF0aXN0aWNzIHBlciBjb250ZXh0IGZvciBhbGwgdGhlIHByb2Nlc3NlcyBh cmUgc2hhcmVkIHZpYSB0aGUgc2FtZSBkeW5hbWljCisgKiBzaGFyZWQgYXJlYS4gVGhlIHN0YXRp c3RpY3MgZm9yIGNvbnRleHRzIHRoYXQgZXhjZWVkIHRoZSBwcmUtZGV0ZXJtaW5lZCBzaXplCisg KiBsaW1pdCwgYXJlIGNhcHR1cmVkIGFzIGEgY3VtdWxhdGl2ZSB0b3RhbCBhdCB0aGUgZW5kIG9m IGluZGl2aWR1YWwgc3RhdGlzdGljcy4KKyAqCisgKiBJZiBnZXRfc3VtbWFyeSBpcyB0cnVlLCB3 ZSB0cmF2ZXJzZSB0aGUgbWVtb3J5IGNvbnRleHQgdHJlZSByZWN1cnNpdmVseSBpbgorICogZGVw dGggZmlyc3Qgc2VhcmNoIG1hbm5lciB0byBjb3ZlciBhbGwgdGhlIGNoaWxkcmVuIG9mIGEgcGFy ZW50IGNvbnRleHQsIHRvIGJlCisgKiBhYmxlIHRvIGRpc3BsYXkgYSBjdW11bGF0aXZlIHRvdGFs IG9mIG1lbW9yeSBjb25zdW1wdGlvbiBieSBhIHBhcmVudC4KKyAqLwordm9pZAorUHJvY2Vzc0dl dE1lbW9yeUNvbnRleHRJbnRlcnJ1cHQodm9pZCkKK3sKKwlMaXN0CSAgICpjb250ZXh0czsKKwor CUhBU0hDVEwJCWN0bDsKKwlIVEFCCSAgICpjb250ZXh0X2lkX2xvb2t1cDsKKwlpbnQJCQljb250 ZXh0X2lkID0gMDsKKwlNZW1vcnlDb250ZXh0IHN0YXRfY3h0OworCU1lbW9yeUNvbnRleHRFbnRy eSAqbWVtaW5mbzsKKwlib29sCQlnZXRfc3VtbWFyeSA9IGZhbHNlOworCisJZHNhX2FyZWEgICAq YXJlYSA9IE5VTEw7CisJaW50CQkJbWF4X3N0YXRzOworCWludAkJCWlkeCA9IE15UHJvY051bWJl cjsKKwlpbnQJCQlzdGF0c19jb3VudCA9IDA7CisJTWVtb3J5Q29udGV4dENvdW50ZXJzIHN0YXQ7 CisJaW50CQkJbnVtX2luZGl2aWR1YWxfc3RhdHMgPSAwOworCisJUHVibGlzaE1lbW9yeUNvbnRl eHRQZW5kaW5nID0gZmFsc2U7CisKKwkvKgorCSAqIE1ha2UgYSBuZXcgY29udGV4dCB0aGF0IHdp bGwgY29udGFpbiB0aGUgaGFzaCB0YWJsZSwgdG8gZWFzZSB0aGUKKwkgKiBjbGVhbnVwLgorCSAq LworCXN0YXRfY3h0ID0gQWxsb2NTZXRDb250ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0 LAorCQkJCQkJCQkJICJNZW1vcnkgY29udGV4dCBzdGF0aXN0aWNzIiwKKwkJCQkJCQkJCSBBTExP Q1NFVF9ERUZBVUxUX1NJWkVTKTsKKworCS8qCisJICogVGhlIGhhc2ggdGFibGUgdXNlZCBmb3Ig Y29uc3RydWN0aW5nICJwYXRoIiBjb2x1bW4gb2YgdGhlIHZpZXcsIHNpbWlsYXIKKwkgKiB0byBp dHMgbG9jYWwgYmFja2VuZCBjb3VudGVycGFydC4KKwkgKi8KKwljdGwua2V5c2l6ZSA9IHNpemVv ZihNZW1vcnlDb250ZXh0KTsKKwljdGwuZW50cnlzaXplID0gc2l6ZW9mKE1lbW9yeUNvbnRleHRJ ZCk7CisJY3RsLmhjeHQgPSBzdGF0X2N4dDsKKworCWNvbnRleHRfaWRfbG9va3VwID0gaGFzaF9j cmVhdGUoInBnX2dldF9yZW1vdGVfYmFja2VuZF9tZW1vcnlfY29udGV4dHMiLAorCQkJCQkJCQkJ MjU2LAorCQkJCQkJCQkJJmN0bCwKKwkJCQkJCQkJCUhBU0hfRUxFTSB8IEhBU0hfQkxPQlMgfCBI QVNIX0NPTlRFWFQpOworCisJLyogTGlzdCBvZiBjb250ZXh0cyB0byBwcm9jZXNzIGluIHRoZSBu ZXh0IHJvdW5kIC0gc3RhcnQgYXQgdGhlIHRvcC4gKi8KKwljb250ZXh0cyA9IGxpc3RfbWFrZTEo VG9wTWVtb3J5Q29udGV4dCk7CisKKwkvKiBDb21wdXRlIHRoZSBudW1iZXIgb2Ygc3RhdHMgdGhh dCBjYW4gZml0IGluIHRoZSBkZWZpbmVkIGxpbWl0ICovCisJbWF4X3N0YXRzID0gKE1BWF9OVU1f REVGQVVMVF9TRUdNRU5UUyAqIERTQV9ERUZBVUxUX0lOSVRfU0VHTUVOVF9TSVpFKQorCQkvIChz aXplb2YoTWVtb3J5Q29udGV4dEVudHJ5KSArIChNRU1fQ09OVEVYVF9NQVhfTEVWRUwKKwkJCQkJ CQkJCQkgKiBzaXplb2YoRGF0dW0pKSArICgyICogTUVNT1JZX0NPTlRFWFRfSURFTlRfU0hNRU1f U0laRSkpOworCisJTFdMb2NrQWNxdWlyZSgmbWVtQ3R4U3RhdGVbaWR4XS5sd19sb2NrLCBMV19F WENMVVNJVkUpOworCWdldF9zdW1tYXJ5ID0gbWVtQ3R4U3RhdGVbaWR4XS5nZXRfc3VtbWFyeTsK KwlMV0xvY2tSZWxlYXNlKCZtZW1DdHhTdGF0ZVtpZHhdLmx3X2xvY2spOworCisJLyoKKwkgKiBU cmF2ZXJzZSB0aGUgbWVtb3J5IGNvbnRleHQgdHJlZSB0byBmaW5kIHRvdGFsIG51bWJlciBvZiBj b250ZXh0cy4gSWYKKwkgKiBzdW1tYXJ5IGlzIHJlcXVlc3RlZCByZXBvcnQgdGhlIHRvdGFsIG51 bWJlciBvZiBjb250ZXh0cyBhdCBsZXZlbCAxIGFuZAorCSAqIDIgZnJvbSB0aGUgdG9wLiBBbHNv LCBwb3B1bGF0ZSB0aGUgaGFzaCB0YWJsZSBvZiBjb250ZXh0IGlkcy4KKwkgKi8KKwljb21wdXRl X251bV9vZl9jb250ZXh0cyhjb250ZXh0cywgY29udGV4dF9pZF9sb29rdXAsICZzdGF0c19jb3Vu dCwKKwkJCQkJCQlnZXRfc3VtbWFyeSk7CisKKwkvKgorCSAqIEFsbG9jYXRlIG1lbW9yeSBpbiB0 aGlzIHByb2Nlc3MncyBkc2EgZm9yIHN0b3Jpbmcgc3RhdGlzdGljcyBvZiB0aGUgdGhlCisJICog bWVtb3J5IGNvbnRleHRzIHVwdG8gbWF4X3N0YXRzLCBmb3IgY29udGV4dHMgdGhhdCBkb24ndCBm aXQgd2l0aGluIGEKKwkgKiBsaW1pdCwgYSBjdW11bGF0aXZlIHRvdGFsIGlzIHdyaXR0ZW4gYXMg dGhlIGxhc3QgcmVjb3JkIGluIHRoZSBEU0EKKwkgKiBzZWdtZW50LgorCSAqLworCXN0YXRzX2Nv dW50ID0gKHN0YXRzX2NvdW50ID4gbWF4X3N0YXRzKSA/IG1heF9zdGF0cyA6IHN0YXRzX2NvdW50 OworCisJTFdMb2NrQWNxdWlyZSgmbWVtQ3R4QXJlYS0+bHdfbG9jaywgTFdfRVhDTFVTSVZFKTsK KworCS8qCisJICogQ3JlYXRlIGEgRFNBIGFuZCBzZW5kIGhhbmRsZSB0byB0aGUgdGhlIGNsaWVu dCBwcm9jZXNzIGFmdGVyIHN0b3JpbmcKKwkgKiB0aGUgc3RhdGlzdGljcy4gSWYgbnVtYmVyIG9m IGNvbnRleHRzIGV4Y2VlZCBhIHByZWRlZmluZWQgbGltaXQoOE1CKSwgYQorCSAqIGN1bXVsYXRp dmUgdG90YWwgaXMgc3RvcmVkIGZvciBzdWNoIGNvbnRleHRzLgorCSAqLworCWlmIChtZW1DdHhB cmVhLT5tZW1zdGF0c19kc2FfaGFuZGxlID09IERTQV9IQU5ETEVfSU5WQUxJRCkKKwl7CisJCU1l bW9yeUNvbnRleHQgb2xkY29udGV4dCA9IEN1cnJlbnRNZW1vcnlDb250ZXh0OworCQlkc2FfaGFu ZGxlCWhhbmRsZTsKKworCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8oVG9wTWVtb3J5Q29udGV4dCk7 CisKKwkJYXJlYSA9IGRzYV9jcmVhdGUobWVtQ3R4QXJlYS0+bHdfbG9jay50cmFuY2hlKTsKKwor CQloYW5kbGUgPSBkc2FfZ2V0X2hhbmRsZShhcmVhKTsKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRv KG9sZGNvbnRleHQpOworCisJCWRzYV9waW5fbWFwcGluZyhhcmVhKTsKKworCQkvKgorCQkgKiBQ aW4gdGhlIGRzYSBhcmVhLCB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGUgYXJlYSByZW1haW5zIGF0 dGFjaGFibGUKKwkJICogZXZlbiBpZiBjdXJyZW50IGJhY2tlbmQgZXhpdHMuIFRoaXMgaXMgZG9u ZSBzbyB0aGF0IGEgd2FpdGluZworCQkgKiBjbGllbnQgZ2V0cyB0aGUgc3RhdHMgZXZlbiBhZnRl ciBhIHByb2Nlc3MgZXhpdHMuCisJCSAqLworCQlkc2FfcGluKGFyZWEpOworCisJCS8qIFNldCB0 aGUgaGFuZGxlIGluIHNoYXJlZCBtZW1vcnkgKi8KKwkJbWVtQ3R4QXJlYS0+bWVtc3RhdHNfZHNh X2hhbmRsZSA9IGhhbmRsZTsKKwl9CisKKwkvKgorCSAqIElmIERTQSBleGlzdHMsIGNyZWF0ZWQg YnkgYW5vdGhlciBwcm9jZXNzIHB1Ymxpc2hpbmcgc3RhdGlzdGljcywgYXR0YWNoCisJICogdG8g aXQuCisJICovCisJZWxzZSBpZiAoYXJlYSA9PSBOVUxMKQorCXsKKwkJTWVtb3J5Q29udGV4dCBv bGRjb250ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRj aFRvKFRvcE1lbW9yeUNvbnRleHQpOworCQlhcmVhID0gZHNhX2F0dGFjaChtZW1DdHhBcmVhLT5t ZW1zdGF0c19kc2FfaGFuZGxlKTsKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGNvbnRleHQp OworCQlkc2FfcGluX21hcHBpbmcoYXJlYSk7CisJfQorCUxXTG9ja1JlbGVhc2UoJm1lbUN0eEFy ZWEtPmx3X2xvY2spOworCisJLyoKKwkgKiBIb2xkIHRoZSBwcm9jZXNzIHNwZWNpZmljIGxvY2sg dG8gcHJvdGVjdCB3cml0ZXMgdG8gcHJvY2VzcyBzcGVjaWZpYworCSAqIG1lbW9yeS4gVGhpcyB3 YXkgdHdvIHByb2Nlc3NlcyBwdWJsaXNoaW5nIHN0YXRpc3RpY3MgZG8gbm90IGJsb2NrIGVhY2gK KwkgKiBvdGhlci4KKwkgKi8KKwlMV0xvY2tBY3F1aXJlKCZtZW1DdHhTdGF0ZVtpZHhdLmx3X2xv Y2ssIExXX0VYQ0xVU0lWRSk7CisJbWVtQ3R4U3RhdGVbaWR4XS5wcm9jX2lkID0gTXlQcm9jUGlk OworCisJaWYgKERzYVBvaW50ZXJJc1ZhbGlkKG1lbUN0eFN0YXRlW2lkeF0ubWVtc3RhdHNfZHNh X3BvaW50ZXIpKQorCXsKKwkJLyoKKwkJICogRnJlZSBhbnkgcHJldmlvdXMgYWxsb2NhdGlvbnMs IGZyZWUgdGhlIG5hbWUsIGlkZW50IGFuZCBwYXRoCisJCSAqIHBvaW50ZXJzIGJlZm9yZSBmcmVl aW5nIHRoZSBwb2ludGVyIHRoYXQgY29udGFpbnMgdGhlbS4KKwkJICovCisJCWRzYV9mcmVlX3By ZXZpb3VzX3N0YXRzKGFyZWEsIG1lbUN0eFN0YXRlW2lkeF0udG90YWxfc3RhdHMsCisJCQkJCQkJ CW1lbUN0eFN0YXRlW2lkeF0ubWVtc3RhdHNfZHNhX3BvaW50ZXIpOworCQlkc2FfZnJlZShhcmVh LCBtZW1DdHhTdGF0ZVtpZHhdLm1lbXN0YXRzX2RzYV9wb2ludGVyKTsKKwkJbWVtQ3R4U3RhdGVb aWR4XS5tZW1zdGF0c19kc2FfcG9pbnRlciA9IEludmFsaWREc2FQb2ludGVyOworCX0KKwltZW1D dHhTdGF0ZVtpZHhdLm1lbXN0YXRzX2RzYV9wb2ludGVyID0gZHNhX2FsbG9jYXRlMChhcmVhLAor CQkJCQkJCQkJCQkJCQkgIHN0YXRzX2NvdW50ICogc2l6ZW9mKE1lbW9yeUNvbnRleHRFbnRyeSkp OworCisJbWVtaW5mbyA9IChNZW1vcnlDb250ZXh0RW50cnkgKikgZHNhX2dldF9hZGRyZXNzKGFy ZWEsCisJCQkJCQkJCQkJCQkJIG1lbUN0eFN0YXRlW2lkeF0ubWVtc3RhdHNfZHNhX3BvaW50ZXIp OworCisJaWYgKGdldF9zdW1tYXJ5KQorCXsKKwkJaW50CQkJY3R4X2lkID0gMDsKKwkJTGlzdAkg ICAqcGF0aCA9IE5JTDsKKworCQkvKiBDb3B5IFRvcE1lbW9yeUNvbnRleHQgc3RhdGlzdGljcyB0 byBEU0EgKi8KKwkJbWVtc2V0KCZzdGF0LCAwLCBzaXplb2Yoc3RhdCkpOworCQkoKlRvcE1lbW9y eUNvbnRleHQtPm1ldGhvZHMtPnN0YXRzKSAoVG9wTWVtb3J5Q29udGV4dCwgTlVMTCwgTlVMTCwK KwkJCQkJCQkJCQkJICZzdGF0LCB0cnVlKTsKKwkJcGF0aCA9IGxjb25zX2ludCgxLCBwYXRoKTsK KwkJUHVibGlzaE1lbW9yeUNvbnRleHQobWVtaW5mbywgY3R4X2lkLCBUb3BNZW1vcnlDb250ZXh0 LCBwYXRoLCBzdGF0LAorCQkJCQkJCSAxLCBhcmVhKTsKKwkJY3R4X2lkID0gY3R4X2lkICsgMTsK KworCQkvKgorCQkgKiBDb3B5IHN0YXRpc3RpY3MgZm9yIGVhY2ggb2YgVG9wTWVtb3J5Q29udGV4 dHMgY2hpbGRyZW4oWFhYLiBNYWtlIGl0CisJCSAqIGNhcHBlZCBhdCAxMDApLiBUaGlzIGluY2x1 ZGVzIHN0YXRpc3RpY3Mgb2YgYWxsIG9mIHRoZWlyIGNoaWxkcmVuCisJCSAqIHVwdG8gbGV2ZWwg MTAwLgorCQkgKi8KKworCQlmb3IgKE1lbW9yeUNvbnRleHQgYyA9IFRvcE1lbW9yeUNvbnRleHQt PmZpcnN0Y2hpbGQ7IGMgIT0gTlVMTDsKKwkJCSBjID0gYy0+bmV4dGNoaWxkKQorCQl7CisJCQlN ZW1vcnlDb250ZXh0Q291bnRlcnMgZ3JhbmRfdG90YWxzOworCQkJaW50CQkJbnVtX2NvbnRleHRz ID0gMDsKKworCQkJcGF0aCA9IE5JTDsKKwkJCW1lbXNldCgmZ3JhbmRfdG90YWxzLCAwLCBzaXpl b2YoZ3JhbmRfdG90YWxzKSk7CisKKwkJCU1lbW9yeUNvbnRleHRTdGF0c0ludGVybmFsKGMsIDAs IDEwMCwgMTAwLCAmZ3JhbmRfdG90YWxzLAorCQkJCQkJCQkJICAgUFJJTlRfU1RBVFNfTk9ORSwg Jm51bV9jb250ZXh0cyk7CisKKwkJCXBhdGggPSBjb21wdXRlX2NvbnRleHRfcGF0aChjLCBjb250 ZXh0X2lkX2xvb2t1cCk7CisKKwkJCVB1Ymxpc2hNZW1vcnlDb250ZXh0KG1lbWluZm8sIGN0eF9p ZCwgYywgcGF0aCwKKwkJCQkJCQkJIGdyYW5kX3RvdGFscywgbnVtX2NvbnRleHRzLCBhcmVhKTsK KwkJCWN0eF9pZCA9IGN0eF9pZCArIDE7CisJCX0KKwkJbWVtQ3R4U3RhdGVbaWR4XS50b3RhbF9z dGF0cyA9IGN0eF9pZDsKKwkJZ290byBjbGVhbnVwOworCX0KKwlmb3JlYWNoX3B0cihNZW1vcnlD b250ZXh0RGF0YSwgY3VyLCBjb250ZXh0cykKKwl7CisJCUxpc3QJICAgKnBhdGggPSBOSUw7CisJ CWNoYXIJICAgKm5hbWU7CisKKwkJLyoKKwkJICogRmlndXJlIG91dCB0aGUgdHJhbnNpZW50IGNv bnRleHRfaWQgb2YgdGhpcyBjb250ZXh0IGFuZCBlYWNoIG9mIGl0cworCQkgKiBhbmNlc3RvcnMu CisJCSAqLworCQlwYXRoID0gY29tcHV0ZV9jb250ZXh0X3BhdGgoY3VyLCBjb250ZXh0X2lkX2xv b2t1cCk7CisKKwkJaWYgKGNvbnRleHRfaWQgPD0gKG1heF9zdGF0cyAtIDIpKQorCQl7CisJCQkv KiBFeGFtaW5lIHRoZSBjb250ZXh0IHN0YXRzICovCisJCQltZW1zZXQoJnN0YXQsIDAsIHNpemVv ZihzdGF0KSk7CisJCQkoKmN1ci0+bWV0aG9kcy0+c3RhdHMpIChjdXIsIE5VTEwsIE5VTEwsICZz dGF0LCB0cnVlKTsKKwkJCS8qIENvcHkgc3RhdGlzdGljcyB0byBEU0EgbWVtb3J5ICovCisJCQlQ dWJsaXNoTWVtb3J5Q29udGV4dChtZW1pbmZvLCBjb250ZXh0X2lkLCBjdXIsIHBhdGgsIHN0YXQs IDEsIGFyZWEpOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogRXhhbWluZSB0aGUgY29udGV4dCBz dGF0cyAqLworCQkJbWVtc2V0KCZzdGF0LCAwLCBzaXplb2Yoc3RhdCkpOworCQkJKCpjdXItPm1l dGhvZHMtPnN0YXRzKSAoY3VyLCBOVUxMLCBOVUxMLCAmc3RhdCwgdHJ1ZSk7CisKKwkJCW1lbWlu Zm9bbWF4X3N0YXRzIC0gMV0udG90YWxzcGFjZSArPSBzdGF0LnRvdGFsc3BhY2U7CisJCQltZW1p bmZvW21heF9zdGF0cyAtIDFdLm5ibG9ja3MgKz0gc3RhdC5uYmxvY2tzOworCQkJbWVtaW5mb1tt YXhfc3RhdHMgLSAxXS5mcmVlc3BhY2UgKz0gc3RhdC5mcmVlc3BhY2U7CisJCQltZW1pbmZvW21h eF9zdGF0cyAtIDFdLmZyZWVjaHVua3MgKz0gc3RhdC5mcmVlY2h1bmtzOworCQl9CisKKwkJLyoK KwkJICogRFNBIG1heCBsaW1pdCBpcyByZWFjaGVkLCB3cml0ZSBhZ2dyZWdhdGUgb2YgdGhlIHJl bWFpbmluZworCQkgKiBzdGF0aXN0aWNzLgorCQkgKi8KKwkJaWYgKGNvbnRleHRfaWQgPT0gKG1h eF9zdGF0cyAtIDIpICYmIGNvbnRleHRfaWQgPCAoc3RhdHNfY291bnQgLSAxKSkKKwkJeworCQkJ bnVtX2luZGl2aWR1YWxfc3RhdHMgPSBjb250ZXh0X2lkICsgMTsKKwkJCW1lbWluZm9bbWF4X3N0 YXRzIC0gMV0ubmFtZSA9IGRzYV9hbGxvY2F0ZTAoYXJlYSwgMTcpOworCQkJbmFtZSA9IGRzYV9n ZXRfYWRkcmVzcyhhcmVhLCBtZW1pbmZvW21heF9zdGF0cyAtIDFdLm5hbWUpOworCQkJc3RybmNw eShuYW1lLCAiUmVtYWluaW5nIFRvdGFscyIsIDE2KTsKKwkJCW1lbWluZm9bbWF4X3N0YXRzIC0g MV0uaWRlbnQgPSBJbnZhbGlkRHNhUG9pbnRlcjsKKwkJCW1lbWluZm9bbWF4X3N0YXRzIC0gMV0u cGF0aCA9IEludmFsaWREc2FQb2ludGVyOworCQkJbWVtaW5mb1ttYXhfc3RhdHMgLSAxXS50eXBl ID0gTlVMTDsKKwkJfQorCQljb250ZXh0X2lkKys7CisJfQorCS8qIE5vIGFnZ3JlZ2F0ZWQgY29u dGV4dHMsIGluZGl2aWR1YWwgc3RhdGlzdGljcyByZXBvcnRlZCAqLworCWlmIChjb250ZXh0X2lk IDwgKG1heF9zdGF0cyAtIDIpKQorCXsKKwkJbWVtQ3R4U3RhdGVbaWR4XS50b3RhbF9zdGF0cyA9 IGNvbnRleHRfaWQ7CisJfQorCS8qIFJlcG9ydCBudW1iZXIgb2YgYWdncmVnYXRlZCBtZW1vcnkg Y29udGV4dHMgKi8KKwllbHNlCisJeworCQltZW1pbmZvW21heF9zdGF0cyAtIDFdLm51bV9hZ2df c3RhdHMgPSBjb250ZXh0X2lkIC0KKwkJCW51bV9pbmRpdmlkdWFsX3N0YXRzOworCisJCS8qCisJ CSAqIFRvdGFsIHN0YXRzIGVxdWFscyBudW1faW5kaXZpZHVhbF9zdGF0cyArIDEgcmVjb3JkIGZv ciBjdW11bGF0aXZlCisJCSAqIHN0YXRpc3RpY3MuCisJCSAqLworCQltZW1DdHhTdGF0ZVtpZHhd LnRvdGFsX3N0YXRzID0gbnVtX2luZGl2aWR1YWxfc3RhdHMgKyAxOworCX0KK2NsZWFudXA6CisK KwkvKgorCSAqIFNpZ25hbCBhbGwgdGhlIHdhaXRpbmcgY2xpZW50IGJhY2tlbmRzIGFmdGVyIHNl dHRpbmcgdGhlIGV4aXQgY29uZGl0aW9uCisJICogZmxhZworCSAqLworCW1lbUN0eFN0YXRlW2lk eF0uc3RhdHNfdGltZXN0YW1wID0gR2V0Q3VycmVudFRpbWVzdGFtcCgpOworCUxXTG9ja1JlbGVh c2UoJm1lbUN0eFN0YXRlW2lkeF0ubHdfbG9jayk7CisJQ29uZGl0aW9uVmFyaWFibGVCcm9hZGNh c3QoJm1lbUN0eFN0YXRlW2lkeF0ubWVtY3R4X2N2KTsKKwkvKiBEZWxldGUgdGhlIGhhc2ggdGFi bGUgbWVtb3J5IGNvbnRleHQgKi8KKwlNZW1vcnlDb250ZXh0RGVsZXRlKHN0YXRfY3h0KTsKKwor CWRzYV9kZXRhY2goYXJlYSk7Cit9CisKKy8qCisgKiBBcHBlbmQgdGhlIHRyYW5zaWVudCBjb250 ZXh0X2lkIG9mIHRoaXMgY29udGV4dCBhbmQgZWFjaCBvZgorICogaXRzIGFuY2VzdG9ycyB0byBh IGxpc3QsIGlub3JkZXIgdG8gY29tcHV0ZSBhIHBhdGguCisgKi8KK3N0YXRpYyBMaXN0ICoKK2Nv bXB1dGVfY29udGV4dF9wYXRoKE1lbW9yeUNvbnRleHQgYywgSFRBQiAqY29udGV4dF9pZF9sb29r dXApCit7CisJYm9vbAkJZm91bmQ7CisJTGlzdAkgICAqcGF0aCA9IE5JTDsKKworCWZvciAoTWVt b3J5Q29udGV4dCBjdXJfY29udGV4dCA9IGM7IGN1cl9jb250ZXh0ICE9IE5VTEw7IGN1cl9jb250 ZXh0ID0gY3VyX2NvbnRleHQtPnBhcmVudCkKKwl7CisJCU1lbW9yeUNvbnRleHRJZCAqY3VyX2Vu dHJ5OworCisJCWN1cl9lbnRyeSA9IGhhc2hfc2VhcmNoKGNvbnRleHRfaWRfbG9va3VwLCAmY3Vy X2NvbnRleHQsIEhBU0hfRklORCwgJmZvdW5kKTsKKworCQlpZiAoIWZvdW5kKQorCQl7CisJCQll bG9nKExPRywgImhhc2ggdGFibGUgY29ycnVwdGVkLCBjYW4ndCBjb25zdHJ1Y3QgcGF0aCB2YWx1 ZSIpOworCQkJYnJlYWs7CisJCX0KKwkJcGF0aCA9IGxjb25zX2ludChjdXJfZW50cnktPmNvbnRl eHRfaWQsIHBhdGgpOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworLyoKKyAqIFJldHVybiB0aGUg bnVtYmVyIG9mIGNvbnRleHRzIGFsbG9jYXRlZCBjdXJyZW50bHkgYnkgdGhlIGJhY2tlbmQKKyAq IEFzc2lnbiBjb250ZXh0IGlkcyB0byBlYWNoIG9mIHRoZSBjb250ZXh0cy4KKyAqLworc3RhdGlj IHZvaWQKK2NvbXB1dGVfbnVtX29mX2NvbnRleHRzKExpc3QgKmNvbnRleHRzLCBIVEFCICpjb250 ZXh0X2lkX2xvb2t1cCwKKwkJCQkJCWludCAqc3RhdHNfY291bnQsIGJvb2wgZ2V0X3N1bW1hcnkp Cit7CisJZm9yZWFjaF9wdHIoTWVtb3J5Q29udGV4dERhdGEsIGN1ciwgY29udGV4dHMpCisJewor CQlNZW1vcnlDb250ZXh0SWQgKmVudHJ5OworCQlib29sCQlmb3VuZDsKKworCQllbnRyeSA9IChN ZW1vcnlDb250ZXh0SWQgKikgaGFzaF9zZWFyY2goY29udGV4dF9pZF9sb29rdXAsICZjdXIsCisJ CQkJCQkJCQkJCQlIQVNIX0VOVEVSLCAmZm91bmQpOworCQlBc3NlcnQoIWZvdW5kKTsKKworCQkv KiBjb250ZXh0IGlkIHN0YXJ0cyB3aXRoIDEgKi8KKwkJZW50cnktPmNvbnRleHRfaWQgPSAoKyso KnN0YXRzX2NvdW50KSk7CisKKwkJLyogQXBwZW5kIHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVu dCBjb250ZXh0IHRvIHRoZSBtYWluIGxpc3QuICovCisJCWZvciAoTWVtb3J5Q29udGV4dCBjID0g Y3VyLT5maXJzdGNoaWxkOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0Y2hpbGQpCisJCXsKKwkJCWlm IChnZXRfc3VtbWFyeSkKKwkJCXsKKwkJCQllbnRyeSA9IChNZW1vcnlDb250ZXh0SWQgKikgaGFz aF9zZWFyY2goY29udGV4dF9pZF9sb29rdXAsICZjLAorCQkJCQkJCQkJCQkJCQlIQVNIX0VOVEVS LCAmZm91bmQpOworCQkJCUFzc2VydCghZm91bmQpOworCisJCQkJZW50cnktPmNvbnRleHRfaWQg PSAoKysoKnN0YXRzX2NvdW50KSk7CisJCQl9CisKKwkJCWNvbnRleHRzID0gbGFwcGVuZChjb250 ZXh0cywgYyk7CisJCX0KKworCQkvKgorCQkgKiBJbiBzdW1tYXJ5IG9ubHkgdGhlIGZpcnN0IHR3 byBsZXZlbChmcm9tIHRvcCkgY29udGV4dHMgYXJlCisJCSAqIGRpc3BsYXllZAorCQkgKi8KKwkJ aWYgKGdldF9zdW1tYXJ5KQorCQkJYnJlYWs7CisJfQorCit9CisKKy8qIENvcHkgdGhlIG1lbW9y eSBjb250ZXh0IHN0YXRpc3RpY3Mgb2YgYSBzaW5nbGUgY29udGV4dCB0byBhIGRzYSBtZW1vcnkg Ki8KK3N0YXRpYyB2b2lkCitQdWJsaXNoTWVtb3J5Q29udGV4dChNZW1vcnlDb250ZXh0RW50cnkg Km1lbWN0eF9pbmZvLCBpbnQgY3Vycl9pZCwKKwkJCQkJIE1lbW9yeUNvbnRleHQgY29udGV4dCwg TGlzdCAqcGF0aCwKKwkJCQkJIE1lbW9yeUNvbnRleHRDb3VudGVycyBzdGF0LCBpbnQgbnVtX2Nv bnRleHRzLAorCQkJCQkgZHNhX2FyZWEgKmFyZWEpCit7CisJY2hhcgkJY2xpcHBlZF9pZGVudFtN RU1PUllfQ09OVEVYVF9JREVOVF9TSE1FTV9TSVpFXTsKKwljaGFyCSAgICpuYW1lOworCWNoYXIJ ICAgKmlkZW50OworCURhdHVtCSAgICpwYXRoX2FycmF5OworCisJaWYgKGNvbnRleHQtPm5hbWUg IT0gTlVMTCkKKwl7CisJCUFzc2VydChzdHJsZW4oY29udGV4dC0+bmFtZSkgPCBNRU1PUllfQ09O VEVYVF9JREVOVF9TSE1FTV9TSVpFKTsKKwkJbWVtY3R4X2luZm9bY3Vycl9pZF0ubmFtZSA9IGRz YV9hbGxvY2F0ZTAoYXJlYSwgc3RybGVuKGNvbnRleHQtPm5hbWUpICsgMSk7CisJCW5hbWUgPSAo Y2hhciAqKSBkc2FfZ2V0X2FkZHJlc3MoYXJlYSwgbWVtY3R4X2luZm9bY3Vycl9pZF0ubmFtZSk7 CisJCXN0cm5jcHkobmFtZSwgY29udGV4dC0+bmFtZSwgc3RybGVuKGNvbnRleHQtPm5hbWUpKTsK Kwl9CisJZWxzZQorCQltZW1jdHhfaW5mb1tjdXJyX2lkXS5uYW1lID0gSW52YWxpZERzYVBvaW50 ZXI7CisKKwkvKiBUcmltIGFuZCBjb3B5IHRoZSBpZGVudGlmaWVyIGlmIGl0IGlzIG5vdCBzZXQg dG8gTlVMTCAqLworCWlmIChjb250ZXh0LT5pZGVudCAhPSBOVUxMKQorCXsKKwkJaW50CQkJaWRs ZW4gPSBzdHJsZW4oY29udGV4dC0+aWRlbnQpOworCisJCS8qCisJCSAqIFNvbWUgaWRlbnRpZmll cnMgc3VjaCBhcyBTUUwgcXVlcnkgc3RyaW5nIGNhbiBiZSB2ZXJ5IGxvbmcsCisJCSAqIHRydW5j YXRlIG92ZXJzaXplIGlkZW50aWZpZXJzLgorCQkgKi8KKwkJaWYgKGlkbGVuID49IE1FTU9SWV9D T05URVhUX0lERU5UX1NITUVNX1NJWkUpCisJCQlpZGxlbiA9IHBnX21iY2xpcGxlbihjb250ZXh0 LT5pZGVudCwgaWRsZW4sCisJCQkJCQkJCSBNRU1PUllfQ09OVEVYVF9JREVOVF9TSE1FTV9TSVpF IC0gMSk7CisKKwkJbWVtY3B5KGNsaXBwZWRfaWRlbnQsIGNvbnRleHQtPmlkZW50LCBpZGxlbik7 CisJCWNsaXBwZWRfaWRlbnRbaWRsZW5dID0gJ1wwJzsKKworCQkvKgorCQkgKiBUbyBiZSBjb25z aXN0ZW50IHdpdGggbG9nZ2luZyBvdXRwdXQsIHdlIGxhYmVsIGR5bmFoYXNoIGNvbnRleHRzCisJ CSAqIHdpdGgganVzdCB0aGUgaGFzaCB0YWJsZSBuYW1lIGFzIHdpdGggTWVtb3J5Q29udGV4dFN0 YXRzUHJpbnQoKS4KKwkJICovCisJCWlmICghc3RybmNtcChjb250ZXh0LT5uYW1lLCAiZHluYWhh c2giLCA4KSkKKwkJeworCQkJZHNhX2ZyZWUoYXJlYSwgbWVtY3R4X2luZm9bY3Vycl9pZF0ubmFt ZSk7CisJCQltZW1jdHhfaW5mb1tjdXJyX2lkXS5uYW1lID0gZHNhX2FsbG9jYXRlMChhcmVhLAor CQkJCQkJCQkJCQkJCSAgc3RybGVuKGNsaXBwZWRfaWRlbnQpICsgMSk7CisJCQluYW1lID0gKGNo YXIgKikgZHNhX2dldF9hZGRyZXNzKGFyZWEsCisJCQkJCQkJCQkJCW1lbWN0eF9pbmZvW2N1cnJf aWRdLm5hbWUpOworCQkJc3RybmNweShuYW1lLAorCQkJCQljbGlwcGVkX2lkZW50LCBzdHJsZW4o Y2xpcHBlZF9pZGVudCkpOworCQkJbWVtY3R4X2luZm9bY3Vycl9pZF0uaWRlbnQgPSBJbnZhbGlk RHNhUG9pbnRlcjsKKwkJfQorCQllbHNlCisJCXsKKworCQkJbWVtY3R4X2luZm9bY3Vycl9pZF0u aWRlbnQgPSBkc2FfYWxsb2NhdGUwKGFyZWEsCisJCQkJCQkJCQkJCQkJICAgc3RybGVuKGNsaXBw ZWRfaWRlbnQpICsgMSk7CisJCQlpZGVudCA9IChjaGFyICopIGRzYV9nZXRfYWRkcmVzcyhhcmVh LAorCQkJCQkJCQkJCQkgbWVtY3R4X2luZm9bY3Vycl9pZF0uaWRlbnQpOworCQkJc3RybmNweShp ZGVudCwKKwkJCQkJY2xpcHBlZF9pZGVudCwgc3RybGVuKGNsaXBwZWRfaWRlbnQpKTsKKwkJfQor CX0KKwllbHNlCisJCW1lbWN0eF9pbmZvW2N1cnJfaWRdLmlkZW50ID0gSW52YWxpZERzYVBvaW50 ZXI7CisJLyogQWxsb2NhdGUgZHNhIG1lbW9yeSBmb3Igc3RvcmluZyBwYXRoIGluZm9ybWF0aW9u ICovCisJbWVtY3R4X2luZm9bY3Vycl9pZF0ucGF0aF9sZW5ndGggPSBsaXN0X2xlbmd0aChwYXRo KTsKKwltZW1jdHhfaW5mb1tjdXJyX2lkXS5wYXRoID0gZHNhX2FsbG9jYXRlMChhcmVhLAorCQkJ CQkJCQkJCQkgIG1lbWN0eF9pbmZvW2N1cnJfaWRdLnBhdGhfbGVuZ3RoCisJCQkJCQkJCQkJCSAg KiBzaXplb2YoRGF0dW0pKTsKKwlwYXRoX2FycmF5ID0gKERhdHVtICopIGRzYV9nZXRfYWRkcmVz cyhhcmVhLCBtZW1jdHhfaW5mb1tjdXJyX2lkXS5wYXRoKTsKKwlmb3JlYWNoX2ludChpLCBwYXRo KQorCQlwYXRoX2FycmF5W2ZvcmVhY2hfY3VycmVudF9pbmRleChpKV0gPSBJbnQzMkdldERhdHVt KGkpOworCisJbWVtY3R4X2luZm9bY3Vycl9pZF0udHlwZSA9IEFzc2lnbkNvbnRleHRUeXBlKGNv bnRleHQtPnR5cGUpOworCW1lbWN0eF9pbmZvW2N1cnJfaWRdLnRvdGFsc3BhY2UgPSBzdGF0LnRv dGFsc3BhY2U7CisJbWVtY3R4X2luZm9bY3Vycl9pZF0ubmJsb2NrcyA9IHN0YXQubmJsb2NrczsK KwltZW1jdHhfaW5mb1tjdXJyX2lkXS5mcmVlc3BhY2UgPSBzdGF0LmZyZWVzcGFjZTsKKwltZW1j dHhfaW5mb1tjdXJyX2lkXS5mcmVlY2h1bmtzID0gc3RhdC5mcmVlY2h1bmtzOworCW1lbWN0eF9p bmZvW2N1cnJfaWRdLm51bV9hZ2dfc3RhdHMgPSBudW1fY29udGV4dHM7Cit9CisKK3N0YXRpYyB2 b2lkCitkc2FfZnJlZV9wcmV2aW91c19zdGF0cyhkc2FfYXJlYSAqYXJlYSwgaW50IHRvdGFsX3N0 YXRzLAorCQkJCQkJZHNhX3BvaW50ZXIgcHJldl9kc2FfcG9pbnRlcikKK3sKKwlNZW1vcnlDb250 ZXh0RW50cnkgKm1lbWluZm87CisKKwltZW1pbmZvID0gKE1lbW9yeUNvbnRleHRFbnRyeSAqKSBk c2FfZ2V0X2FkZHJlc3MoYXJlYSwgcHJldl9kc2FfcG9pbnRlcik7CisJZm9yIChpbnQgaSA9IDA7 IGkgPCB0b3RhbF9zdGF0czsgaSsrKQorCXsKKwkJaWYgKERzYVBvaW50ZXJJc1ZhbGlkKG1lbWlu Zm9baV0ubmFtZSkpCisJCQlkc2FfZnJlZShhcmVhLCBtZW1pbmZvW2ldLm5hbWUpOworCisJCWlm IChEc2FQb2ludGVySXNWYWxpZChtZW1pbmZvW2ldLmlkZW50KSkKKwkJCWRzYV9mcmVlKGFyZWEs IG1lbWluZm9baV0uaWRlbnQpOworCisJCWlmIChEc2FQb2ludGVySXNWYWxpZChtZW1pbmZvW2ld LnBhdGgpKQorCQkJZHNhX2ZyZWUoYXJlYSwgbWVtaW5mb1tpXS5wYXRoKTsKKwl9Cit9CiB2b2lk ICoKIHBhbGxvYyhTaXplIHNpemUpCiB7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9jYXRhbG9n L3BnX3Byb2MuZGF0IGIvc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAppbmRleCBhZjk1 NDZkZTIzLi5jZDcxYjk2ZWRkIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3By b2MuZGF0CisrKyBiL3NyYy9pbmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQKQEAgLTg0ODAsNiAr ODQ4MCwxNiBAQAogICBwcm9yZXR0eXBlID0+ICdib29sJywgcHJvYXJndHlwZXMgPT4gJ2ludDQn LAogICBwcm9zcmMgPT4gJ3BnX2xvZ19iYWNrZW5kX21lbW9yeV9jb250ZXh0cycgfSwKIAorIyBw dWJsaXNoaW5nIG1lbW9yeSBjb250ZXh0cyBvZiB0aGUgc3BlY2lmaWVkIHBvc3RncmVzIHByb2Nl c3MKK3sgb2lkID0+ICcyMTczJywgZGVzY3IgPT4gJ3B1Ymxpc2ggbWVtb3J5IGNvbnRleHRzIG9m IHRoZSBzcGVjaWZpZWQgYmFja2VuZCcsCisgIHByb25hbWUgPT4gJ3BnX2dldF9wcm9jZXNzX21l bW9yeV9jb250ZXh0cycsIHByb3ZvbGF0aWxlID0+ICd2JywKKyAgcHJvcm93cyA9PiAnMTAwJywg cHJvcmV0c2V0ID0+ICd0JywgcHJvcGFyYWxsZWwgPT4gJ3InLAorICBwcm9yZXR0eXBlID0+ICdy ZWNvcmQnLCBwcm9hcmd0eXBlcyA9PiAnaW50NCBib29sIGludDQnLAorICBwcm9hbGxhcmd0eXBl cyA9PiAne2ludDQsYm9vbCxpbnQ0LHRleHQsdGV4dCx0ZXh0LF9pbnQ0LGludDgsaW50OCxpbnQ4 LGludDgsaW50OCxpbnQ0LHRpbWVzdGFtcHR6fScsCisgIHByb2FyZ21vZGVzID0+ICd7aSxpLGks byxvLG8sbyxvLG8sbyxvLG8sbyxvfScsCisgIHByb2FyZ25hbWVzID0+ICd7b2lkLCBzdW1tYXJ5 LCBudW1fb2ZfdHJpZXMsIG5hbWUsIGlkZW50LCB0eXBlLCBwYXRoLCB0b3RhbF9ieXRlcywgdG90 YWxfbmJsb2NrcywgZnJlZV9ieXRlcywgZnJlZV9jaHVua3MsIHVzZWRfYnl0ZXMsIG51bV9hZ2df Y29udGV4dHMsIHN0YXRzX3RpbWVzdGFtcH0nLAorICBwcm9zcmMgPT4gJ3BnX2dldF9wcm9jZXNz X21lbW9yeV9jb250ZXh0cycgfSwKKwogIyBub24tcGVyc2lzdGVudCBzZXJpZXMgZ2VuZXJhdG9y CiB7IG9pZCA9PiAnMTA2NicsIGRlc2NyID0+ICdub24tcGVyc2lzdGVudCBzZXJpZXMgZ2VuZXJh dG9yJywKICAgcHJvbmFtZSA9PiAnZ2VuZXJhdGVfc2VyaWVzJywgcHJvcm93cyA9PiAnMTAwMCcs CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaCBiL3NyYy9pbmNsdWRlL21pc2Nh ZG1pbi5oCmluZGV4IGEyYjYzNDk1ZWUuLjNkYzNkY2ZiNmMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNs dWRlL21pc2NhZG1pbi5oCisrKyBiL3NyYy9pbmNsdWRlL21pc2NhZG1pbi5oCkBAIC05Niw2ICs5 Niw3IEBAIGV4dGVybiBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgSWRsZVNlc3Np b25UaW1lb3V0UGVuZGluZzsKIGV4dGVybiBQR0RMTElNUE9SVCB2b2xhdGlsZSBzaWdfYXRvbWlj X3QgUHJvY1NpZ25hbEJhcnJpZXJQZW5kaW5nOwogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxl IHNpZ19hdG9taWNfdCBMb2dNZW1vcnlDb250ZXh0UGVuZGluZzsKIGV4dGVybiBQR0RMTElNUE9S VCB2b2xhdGlsZSBzaWdfYXRvbWljX3QgSWRsZVN0YXRzVXBkYXRlVGltZW91dFBlbmRpbmc7Citl eHRlcm4gUEdETExJTVBPUlQgdm9sYXRpbGUgc2lnX2F0b21pY190IFB1Ymxpc2hNZW1vcnlDb250 ZXh0UGVuZGluZzsKIAogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxlIHNpZ19hdG9taWNfdCBD aGVja0NsaWVudENvbm5lY3Rpb25QZW5kaW5nOwogZXh0ZXJuIFBHRExMSU1QT1JUIHZvbGF0aWxl IHNpZ19hdG9taWNfdCBDbGllbnRDb25uZWN0aW9uTG9zdDsKZGlmZiAtLWdpdCBhL3NyYy9pbmNs dWRlL3N0b3JhZ2UvcHJvY3NpZ25hbC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFs LmgKaW5kZXggMDIyZmQ4ZWQ5My4uNDc3YWI5OTMzOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUv c3RvcmFnZS9wcm9jc2lnbmFsLmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9wcm9jc2lnbmFs LmgKQEAgLTM1LDYgKzM1LDcgQEAgdHlwZWRlZiBlbnVtCiAJUFJPQ1NJR19XQUxTTkRfSU5JVF9T VE9QUElORywJLyogYXNrIHdhbHNlbmRlcnMgdG8gcHJlcGFyZSBmb3Igc2h1dGRvd24gICovCiAJ UFJPQ1NJR19CQVJSSUVSLAkJCS8qIGdsb2JhbCBiYXJyaWVyIGludGVycnVwdCAgKi8KIAlQUk9D U0lHX0xPR19NRU1PUllfQ09OVEVYVCwgLyogYXNrIGJhY2tlbmQgdG8gbG9nIHRoZSBtZW1vcnkg Y29udGV4dHMgKi8KKwlQUk9DU0lHX0dFVF9NRU1PUllfQ09OVEVYVCwgLyogYXNrIGJhY2tlbmQg dG8gbG9nIHRoZSBtZW1vcnkgY29udGV4dHMgKi8KIAlQUk9DU0lHX1BBUkFMTEVMX0FQUExZX01F U1NBR0UsIC8qIE1lc3NhZ2UgZnJvbSBwYXJhbGxlbCBhcHBseSB3b3JrZXJzICovCiAKIAkvKiBS ZWNvdmVyeSBjb25mbGljdCByZWFzb25zICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGls cy9tZW11dGlscy5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvbWVtdXRpbHMuaAppbmRleCA4YWJjMjZh YmNlLi44ZTIyM2ExNTJjIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9tZW11dGlscy5o CisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL21lbXV0aWxzLmgKQEAgLTE4LDYgKzE4LDkgQEAKICNk ZWZpbmUgTUVNVVRJTFNfSAogCiAjaW5jbHVkZSAibm9kZXMvbWVtbm9kZXMuaCIKKyNpbmNsdWRl ICJzdG9yYWdlL2NvbmRpdGlvbl92YXJpYWJsZS5oIgorI2luY2x1ZGUgInN0b3JhZ2UvbG1nci5o IgorI2luY2x1ZGUgInV0aWxzL2RzYS5oIgogCiAKIC8qCkBAIC00OCw3ICs1MSwxMiBAQAogCiAj ZGVmaW5lIEFsbG9jSHVnZVNpemVJc1ZhbGlkKHNpemUpCSgoU2l6ZSkgKHNpemUpIDw9IE1heEFs bG9jSHVnZVNpemUpCiAKKyNkZWZpbmUgTUVNT1JZX0NPTlRFWFRfSURFTlRfU0hNRU1fU0laRSAx MjgKIAorI2RlZmluZSBNRU1fQ09OVEVYVF9TSE1FTV9TVEFUU19TSVpFCTMwCisjZGVmaW5lIE1F TV9DT05URVhUX01BWF9MRVZFTAk2NAorI2RlZmluZSBNQVhfVFlQRV9TVFJJTkdfTEVOR1RICTY0 CisjZGVmaW5lIE1BWF9OVU1fREVGQVVMVF9TRUdNRU5UUyA4CiAvKgogICogU3RhbmRhcmQgdG9w LWxldmVsIG1lbW9yeSBjb250ZXh0cy4KICAqCkBAIC0zMTksNCArMzI3LDY3IEBAIHBnX21lbW9y eV9pc19hbGxfemVyb3MoY29uc3Qgdm9pZCAqcHRyLCBzaXplX3QgbGVuKQogCXJldHVybiB0cnVl OwogfQogCisvKiBEeW5hbWljIHNoYXJlZCBtZW1vcnkgc3RhdGUgZm9yIHN0YXRpc3RpY3MgcGVy IGNvbnRleHQgKi8KK3R5cGVkZWYgc3RydWN0IE1lbW9yeUNvbnRleHRFbnRyeQoreworCWRzYV9w b2ludGVyIG5hbWU7CisJZHNhX3BvaW50ZXIgaWRlbnQ7CisJZHNhX3BvaW50ZXIgcGF0aDsKKwlj b25zdCBjaGFyICp0eXBlOworCWludAkJCXBhdGhfbGVuZ3RoOworCWludDY0CQl0b3RhbHNwYWNl OworCWludDY0CQluYmxvY2tzOworCWludDY0CQlmcmVlc3BhY2U7CisJaW50NjQJCWZyZWVjaHVu a3M7CisJaW50CQkJbnVtX2FnZ19zdGF0czsKK30gTWVtb3J5Q29udGV4dEVudHJ5OworCisvKgor ICogUGVyIGJhY2tlbmQgc3RhdGljIHNoYXJlZCBtZW1vcnkgc3RhdGUgZm9yIG1lbW9yeQorICog Y29udGV4dCBzdGF0aXN0aWNzIHJlcG9ydGluZy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVtb3J5 Q29udGV4dEJhY2tlbmRTdGF0ZQoreworCUNvbmRpdGlvblZhcmlhYmxlIG1lbWN0eF9jdjsKKwlM V0xvY2sJCWx3X2xvY2s7CisJaW50CQkJcHJvY19pZDsKKwlpbnQJCQl0b3RhbF9zdGF0czsKKwli b29sCQlnZXRfc3VtbWFyeTsKKwlkc2FfcG9pbnRlciBtZW1zdGF0c19kc2FfcG9pbnRlcjsKKwlU aW1lc3RhbXBUeiBzdGF0c190aW1lc3RhbXA7Cit9CQkJTWVtb3J5Q29udGV4dEJhY2tlbmRTdGF0 ZTsKKworLyoKKyAqIFN0YXRpYyBzaGFyZWQgbWVtb3J5IHN0YXRlIHJlcHJlc2VudGluZyB0aGUg RFNBIGFyZWEKKyAqIGNyZWF0ZWQgZm9yIG1lbW9yeSBjb250ZXh0IHN0YXRpc3RpY3MgcmVwb3J0 aW5nLgorICogU2luZ2UgRFNBIGFyZWEgaXMgY3JlYXRlZCBhbmQgdXNlZCBieSBhbGwgdGhlIHBy b2Nlc3NlcywKKyAqIGVhY2ggaGF2aW5nIGl0cyBzcGVjaWZpYyBhbGxvY2F0aW9ucyBmb3Igc2hh cmluZyBtZW1vcnkKKyAqIHN0YXRzLCB0cmFja2VkIGJ5IHBlciBiYWNrZW5kIHN0YXRpYyBzaGFy ZWQgbWVtb3J5IHN0YXRlCisgKiBhYm92ZS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgTWVtb3J5Q29u dGV4dFN0YXRlCit7CisJZHNhX2hhbmRsZQltZW1zdGF0c19kc2FfaGFuZGxlOworCUxXTG9jawkJ bHdfbG9jazsKK30gTWVtb3J5Q29udGV4dFN0YXRlOworCisvKgorICogTWVtb3J5Q29udGV4dElk CisgKgkJVXNlZCBmb3Igc3RvcmFnZSBvZiB0cmFuc2llbnQgaWRlbnRpZmllcnMgZm9yCisgKgkJ cGdfZ2V0X2JhY2tlbmRfbWVtb3J5X2NvbnRleHRzLgorICovCit0eXBlZGVmIHN0cnVjdCBNZW1v cnlDb250ZXh0SWQKK3sKKwlNZW1vcnlDb250ZXh0IGNvbnRleHQ7CisJaW50CQkJY29udGV4dF9p ZDsKK30JCQlNZW1vcnlDb250ZXh0SWQ7CisKK2V4dGVybiBQR0RMTElNUE9SVCBNZW1vcnlDb250 ZXh0QmFja2VuZFN0YXRlICogbWVtQ3R4U3RhdGU7CitleHRlcm4gUEdETExJTVBPUlQgTWVtb3J5 Q29udGV4dFN0YXRlICptZW1DdHhBcmVhOworZXh0ZXJuIHZvaWQgUHJvY2Vzc0dldE1lbW9yeUNv bnRleHRJbnRlcnJ1cHQodm9pZCk7CitleHRlcm4gY29uc3QgY2hhciAqQXNzaWduQ29udGV4dFR5 cGUoTm9kZVRhZyB0eXBlKTsKK2V4dGVybiB2b2lkIEhhbmRsZUdldE1lbW9yeUNvbnRleHRJbnRl cnJ1cHQodm9pZCk7CitleHRlcm4gdm9pZCBNZW1DdHhTaG1lbUluaXQodm9pZCk7CitleHRlcm4g dm9pZCBNZW1DdHhCYWNrZW5kU2htZW1Jbml0KHZvaWQpOworCiAjZW5kaWYJCQkJCQkJLyogTUVN VVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3 cy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91dAppbmRleCA4MzIy OGNmY2EyLi5kY2EyMGFlMWEyIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N5c3ZpZXdzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3ZpZXdzLm91 dApAQCAtMjMyLDMgKzIzMiwxNyBAQCBzZWxlY3QgKiBmcm9tIHBnX3RpbWV6b25lX2FiYnJldnMg d2hlcmUgYWJicmV2ID0gJ0xNVCc7CiAgTE1UICAgIHwgQCA3IGhvdXJzIDUyIG1pbnMgNTggc2Vj cyBhZ28gfCBmCiAoMSByb3cpCiAKK0RPICQkCitERUNMQVJFCisgICAgbGF1bmNoZXJfcGlkIGlu dDsKKyAgICByIFJFQ09SRDsKK0JFR0lOCisgICAgICAgIFNFTEVDVCBwaWQgZnJvbSBwZ19zdGF0 X2FjdGl2aXR5IHdoZXJlIGJhY2tlbmRfdHlwZT0nYXV0b3ZhY3V1bSBsYXVuY2hlcicKKwkgSU5U TyBsYXVuY2hlcl9waWQ7CisKKyAgICAgICAgc2VsZWN0IHR5cGUsIG5hbWUsIGlkZW50CisgICAg ICAgIGZyb20gcGdfZ2V0X3Byb2Nlc3NfbWVtb3J5X2NvbnRleHRzKGxhdW5jaGVyX3BpZCwgZmFs c2UsIDIwKQorCSB3aGVyZSBwYXRoID0gJ3sxfScgaW50byByOworCVJBSVNFIE5PVElDRSAnJScs IHI7CitFTkQgJCQ7CitOT1RJQ0U6ICAoQWxsb2NTZXQsVG9wTWVtb3J5Q29udGV4dCwpCmRpZmYg LS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zeXN2aWV3cy5zcWwgYi9zcmMvdGVzdC9yZWdy ZXNzL3NxbC9zeXN2aWV3cy5zcWwKaW5kZXggNjYxNzlmMDI2Yi4uNDc2NzM1MWQ0ZSAxMDA2NDQK LS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3lzdmlld3Muc3FsCisrKyBiL3NyYy90ZXN0L3Jl Z3Jlc3Mvc3FsL3N5c3ZpZXdzLnNxbApAQCAtMTAxLDMgKzEwMSwxNyBAQCBzZWxlY3QgY291bnQo ZGlzdGluY3QgdXRjX29mZnNldCkgPj0gMjQgYXMgb2sgZnJvbSBwZ190aW1lem9uZV9hYmJyZXZz OwogLS0gT25lIHNwZWNpZmljIGNhc2Ugd2UgY2FuIGNoZWNrIHdpdGhvdXQgbXVjaCBmZWFyIG9m IGJyZWFrYWdlCiAtLSBpcyB0aGUgaGlzdG9yaWNhbCBsb2NhbC1tZWFuLXRpbWUgdmFsdWUgdXNl ZCBmb3IgQW1lcmljYS9Mb3NfQW5nZWxlcy4KIHNlbGVjdCAqIGZyb20gcGdfdGltZXpvbmVfYWJi cmV2cyB3aGVyZSBhYmJyZXYgPSAnTE1UJzsKKworRE8gJCQKK0RFQ0xBUkUKKyAgICBsYXVuY2hl cl9waWQgaW50OworICAgIHIgUkVDT1JEOworQkVHSU4KKyAgICAgICAgU0VMRUNUIHBpZCBmcm9t IHBnX3N0YXRfYWN0aXZpdHkgd2hlcmUgYmFja2VuZF90eXBlPSdhdXRvdmFjdXVtIGxhdW5jaGVy JworCSBJTlRPIGxhdW5jaGVyX3BpZDsKKworICAgICAgICBzZWxlY3QgdHlwZSwgbmFtZSwgaWRl bnQKKyAgICAgICAgZnJvbSBwZ19nZXRfcHJvY2Vzc19tZW1vcnlfY29udGV4dHMobGF1bmNoZXJf cGlkLCBmYWxzZSwgMjApCisJIHdoZXJlIHBhdGggPSAnezF9JyBpbnRvIHI7CisJUkFJU0UgTk9U SUNFICclJywgcjsKK0VORCAkJDsKZGlmZiAtLWdpdCBhL3NyYy90b29scy9wZ2luZGVudC90eXBl ZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKaW5kZXggZTNlMDlh MjIwNy4uNDMyZTdmYTE2MSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKQEAgLTE2MzYsOCAr MTYzNiwxMCBAQCBNZW1vcnlDb250ZXh0Q2FsbGJhY2sKIE1lbW9yeUNvbnRleHRDYWxsYmFja0Z1 bmN0aW9uCiBNZW1vcnlDb250ZXh0Q291bnRlcnMKIE1lbW9yeUNvbnRleHREYXRhCitNZW1vcnlD b250ZXh0RW50cnkKIE1lbW9yeUNvbnRleHRNZXRob2RJRAogTWVtb3J5Q29udGV4dE1ldGhvZHMK K01lbW9yeUNvbnRleHRTdGF0ZQogTWVtb3J5U3RhdHNQcmludEZ1bmMKIE1lcmdlQWN0aW9uCiBN ZXJnZUFjdGlvblN0YXRlCi0tIAoyLjM0LjEKCg== --0000000000004cf677062ee2bcb6--