From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 31F74C02181 for ; Fri, 24 Jan 2025 11:11:29 +0000 (UTC) Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1tbHaU-000313-47; Fri, 24 Jan 2025 06:10:58 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tbHaR-0002zs-OC for grub-devel@gnu.org; Fri, 24 Jan 2025 06:10:55 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1tbHaM-00083W-OY for grub-devel@gnu.org; Fri, 24 Jan 2025 06:10:55 -0500 Received: from pps.filterd (m0353729.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 50O5Oh06013657; Fri, 24 Jan 2025 11:10:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=cc :content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=pp1; bh=sGKssj at3MiwZS5w1T7Le6fXtHsYlBRiu1LuQ6VLQNo=; b=WLaF/Tm+SpAY7c01dOrii5 c6bz64Xtv/e71QutmQPPHh0OEfq1kR2tLUFzGhEw/99YI2gKrshskC4xL3TlB6aV VD9qR7HeW4SZ+YQ+yZYeoA5doTThlKTQRHtXunRafYvlGJaDyitsX5OYNXF0zWRW V35RKj4hEsNauATUf5fXS/u1DA6cDaLnTw9HRlAm80SjWm/fuN3UyT2OamYUVdq3 1Hd60YEtxVTOL3JrEkw2QwYr5bBFHkTMz53wUgI6eTKVFet+NGALEmvjhye8ga1A ta5tN5rZeGW5HJ57I3F4FST0KwmkV8Ca8pV0onvZOJukQ+wPj3E+IqANtw6QkvPA == Received: from ppma21.wdc07v.mail.ibm.com (5b.69.3da9.ip4.static.sl-reverse.com [169.61.105.91]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 44c4p7t30q-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 24 Jan 2025 11:10:45 +0000 (GMT) Received: from pps.filterd (ppma21.wdc07v.mail.ibm.com [127.0.0.1]) by ppma21.wdc07v.mail.ibm.com (8.18.1.2/8.18.1.2) with ESMTP id 50O8XG4m029594; Fri, 24 Jan 2025 11:10:44 GMT Received: from smtprelay07.wdc07v.mail.ibm.com ([172.16.1.74]) by ppma21.wdc07v.mail.ibm.com (PPS) with ESMTPS id 448qmnu4yt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Fri, 24 Jan 2025 11:10:44 +0000 Received: from smtpav05.dal12v.mail.ibm.com (smtpav05.dal12v.mail.ibm.com [10.241.53.104]) by smtprelay07.wdc07v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 50OBAgXb19923678 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Fri, 24 Jan 2025 11:10:43 GMT Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id D065358069; Fri, 24 Jan 2025 11:10:42 +0000 (GMT) Received: from smtpav05.dal12v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 47F2558052; Fri, 24 Jan 2025 11:10:42 +0000 (GMT) Received: from ltc.linux.ibm.com (unknown [9.5.196.140]) by smtpav05.dal12v.mail.ibm.com (Postfix) with ESMTP; Fri, 24 Jan 2025 11:10:42 +0000 (GMT) MIME-Version: 1.0 Date: Fri, 24 Jan 2025 16:40:42 +0530 From: Avnish Chouhan To: Sudhakar Kuppusamy Cc: grub-devel@gnu.org, dja@axtens.net, jan.setjeeilers@oracle.com, julian.klode@canonical.com, mate.kukri@canonical.com, pjones@redhat.com, stefanb@linux.ibm.com, nayna@linux.ibm.com, ssrish@linux.ibm.com, Javier Martinez Canillas , Michal Suchanek , daniel.kiper@oracle.com Subject: Re: [PATCH v1 09/21] appended signatures: parse PKCS#7 signedData and X.509 certificates In-Reply-To: <20241218145647.1390837-10-sudhakar@linux.ibm.com> References: <20241218145647.1390837-1-sudhakar@linux.ibm.com> <20241218145647.1390837-10-sudhakar@linux.ibm.com> Message-ID: <61bd8fe408148aaceecb17b4ea6ddd45@linux.ibm.com> X-Sender: avnish@linux.ibm.com X-TM-AS-GCONF: 00 X-Proofpoint-GUID: 9WXxY7xKxh4G-1ZV14zYQjp96mqQSxl1 X-Proofpoint-ORIG-GUID: 9WXxY7xKxh4G-1ZV14zYQjp96mqQSxl1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-01-24_04,2025-01-23_01,2024-11-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 mlxscore=0 priorityscore=1501 adultscore=0 phishscore=0 clxscore=1011 lowpriorityscore=0 mlxlogscore=999 bulkscore=0 malwarescore=0 suspectscore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.19.0-2411120000 definitions=main-2501240080 Received-SPF: pass client-ip=148.163.156.1; envelope-from=avnish@linux.ibm.com; helo=mx0a-001b2d01.pphosted.com X-Spam_score_int: -26 X-Spam_score: -2.7 X-Spam_bar: -- X-Spam_report: (-2.7 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.043, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The development of GNU GRUB Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org Sender: grub-devel-bounces+grub-devel=archiver.kernel.org@gnu.org U3VnZ2VzdGlvbiA6IEl0IHdpbGwgYmUgZ29vZCBpZiB3ZSBjYW4gcmVtb3ZlIHRoZSBicmFja2V0 cyBpbiBvbmUgbGluZXIgCmlmIGNvbmRpdGlvbnMgYW5kIGxvb3BzIQoKUmV2aWV3ZWQtYnk6wqBB dm5pc2jCoENob3VoYW7CoDxhdm5pc2hAbGludXguaWJtLmNvbT4KCk9uIDIwMjQtMTItMTggMjA6 MjYsIFN1ZGhha2FyIEt1cHB1c2FteSB3cm90ZToKPiBGcm9tOiBEYW5pZWwgQXh0ZW5zIDxkamFA YXh0ZW5zLm5ldD4KPiAKPiBUaGlzIGNvZGUgYWxsb3dzIHVzIHRvIHBhcnNlOgo+IAo+ICAtIFBL Q1MjNyBzaWduZWREYXRhIG1lc3NhZ2VzLiBPbmx5IGEgc2luZ2xlIHNpZ25lckluZm8gaXMgc3Vw cG9ydGVkLAo+ICAgIHdoaWNoIGlzIGFsbCB0aGF0IHRoZSBMaW51eCBzaWduLWZpbGUgdXRpbGl0 eSBzdXBwb3J0cyBjcmVhdGluZwo+ICAgIG91dC1vZi10aGUtYm94LiBPbmx5IFJTQSwgU0hBLTI1 NiBhbmQgU0hBLTUxMiBhcmUgc3VwcG9ydGVkLgo+ICAgIEFueSBjZXJ0aWZpY2F0ZSBlbWJlZGRl ZCBpbiB0aGUgUEtDUyM3IG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLgo+IAo+ICAtIFguNTA5IGNl cnRpZmljYXRlczogYXQgbGVhc3QgZW5vdWdoIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlcyBvbiB0 aGUKPiAgICBQS0NTIzcgbWVzc2FnZXMuIFdlIGV4cGVjdCB0aGF0IHRoZSBjZXJ0aWZpY2F0ZXMg ZW1iZWRkZWQgaW4gZ3J1YiAKPiB3aWxsCj4gICAgYmUgbGVhZiBjZXJ0aWZpY2F0ZXMsIG5vdCBD QSBjZXJ0aWZpY2F0ZXMuIFRoZSBwYXJzZXIgZW5mb3JjZXMgdGhpcy4KPiAKPiAgLSBYLjUwOSBj ZXJ0aWZpY2F0ZXMgc3VwcG9ydCB0aGUgRXh0ZW5kZWQgS2V5IFVzYWdlIGV4dGVuc2lvbiBhbmQg Cj4gaGFuZGxlCj4gICAgaXQgYnkgdmVyaWZ5aW5nIHRoYXQgdGhlIGNlcnRpZmljYXRlIGhhcyBh IHNpbmdsZSBwdXJwb3NlLCB0aGF0IGlzIAo+IGNvZGUKPiAgICBzaWduaW5nLiBUaGlzIGlzIHJl cXVpcmVkIGJlY2F1c2UgUmVkIEhhdCBjZXJ0aWZpY2F0ZXMgaGF2ZSBib3RoIEtleQo+ICAgIFVz YWdlIGFuZCBFeHRlbmRlZCBLZXkgVXNhZ2UgZXh0ZW5zaW9ucyBwcmVzZW50Lgo+IAo+IFNpZ25l ZC1vZmYtYnk6IEphdmllciBNYXJ0aW5leiBDYW5pbGxhcyA8amF2aWVybUByZWRoYXQuY29tPiAj IEVLVSAKPiBzdXBwb3J0Cj4gUmVwb3J0ZWQtYnk6IE1pY2hhbCBTdWNoYW5layA8bXN1Y2hhbmVr QHN1c2UuY29tPiAjIGtleSB1c2FnZSBpc3N1ZQo+IFNpZ25lZC1vZmYtYnk6IERhbmllbCBBeHRl bnMgPGRqYUBheHRlbnMubmV0Pgo+IFNpZ25lZC1vZmYtYnk6IFN1ZGhha2FyIEt1cHB1c2FteSA8 c3VkaGFrYXJAbGludXguaWJtLmNvbT4KPiAtLS0KPiAgZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVu ZGVkc2lnL2FwcGVuZGVkc2lnLmggfCAxMTAgKysrCj4gIGdydWItY29yZS9jb21tYW5kcy9hcHBl bmRlZHNpZy9hc24xdXRpbC5jICAgIHwgIDk5ICsrCj4gIGdydWItY29yZS9jb21tYW5kcy9hcHBl bmRlZHNpZy9wa2NzNy5jICAgICAgIHwgNDczICsrKysrKysrKwo+ICBncnViLWNvcmUvY29tbWFu ZHMvYXBwZW5kZWRzaWcveDUwOS5jICAgICAgICB8IDk4MSArKysrKysrKysrKysrKysrKysrCj4g IDQgZmlsZXMgY2hhbmdlZCwgMTY2MyBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCBncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvYXBwZW5kZWRzaWcuaAo+ICBjcmVhdGUg bW9kZSAxMDA2NDQgZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL2FzbjF1dGlsLmMKPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IGdydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9wa2NzNy5j Cj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcveDUw OS5jCj4gCj4gZGlmZiAtLWdpdCBhL2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9hcHBl bmRlZHNpZy5oCj4gYi9ncnViLWNvcmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvYXBwZW5kZWRzaWcu aAo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwLi5mYTU5MzAyYzgKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL2FwcGVu ZGVkc2lnLmgKPiBAQCAtMCwwICsxLDExMCBAQAo+ICsvKgo+ICsgKiAgR1JVQiAgLS0gIEdSYW5k IFVuaWZpZWQgQm9vdGxvYWRlcgo+ICsgKiAgQ29weXJpZ2h0IChDKSAyMDIwLCAyMDIyIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgo+ICsgKiAgQ29weXJpZ2h0IChDKSAyMDIwLCAyMDIy IElCTSBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3Ug Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cj4gKyAqICBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCAKPiBieQo+ ICsgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0 aGUgTGljZW5zZSwgb3IKPiArICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u Cj4gKyAqCj4gKyAqICBHUlVCIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCj4gKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ICsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQo+ICsgKiAgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KPiArICoKPiArICogIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCj4g KyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCj4gKyAqLwo+ICsKPiArI2luY2x1ZGUgPGdydWIvY3J5cHRvLmg+Cj4gKyNpbmNs dWRlIDxncnViL2xpYnRhc24xLmg+Cj4gKwo+ICtleHRlcm4gYXNuMV9ub2RlIF9nbnV0bHNfZ251 dGxzX2FzbjsKPiArZXh0ZXJuIGFzbjFfbm9kZSBfZ251dGxzX3BraXhfYXNuOwo+ICsKPiArI2Rl ZmluZSBNQVhfT0lEX0xFTiAzMgo+ICsKPiArLyoKPiArICogT25lIG9yIG1vcmUgeDUwOSBjZXJ0 aWZpY2F0ZXMuCj4gKyAqIFdlIGRvIGxpbWl0ZWQgcGFyc2luZzogZXh0cmFjdGluZyBvbmx5IHRo ZSBzZXJpYWwsIENOIGFuZCBSU0EgCj4gcHVibGljIGtleS4KPiArICovCj4gK3N0cnVjdCB4NTA5 X2NlcnRpZmljYXRlCj4gK3sKPiArICBzdHJ1Y3QgeDUwOV9jZXJ0aWZpY2F0ZSAqbmV4dDsKPiAr ICBncnViX3VpbnQ4X3QgKnNlcmlhbDsKPiArICBncnViX3NpemVfdCBzZXJpYWxfbGVuOwo+ICsg IGNoYXIgKnN1YmplY3Q7Cj4gKyAgZ3J1Yl9zaXplX3Qgc3ViamVjdF9sZW47Cj4gKyAgLyogV2Ug b25seSBzdXBwb3J0IFJTQSBwdWJsaWMga2V5cy4gVGhpcyBlbmNvZGVzIFttb2R1bHVzLCAKPiBw dWJsaWNFeHBvbmVudF0gKi8KPiArICBnY3J5X21waV90IG1waXNbMl07Cj4gK307Cj4gKwo+ICsv Kgo+ICsgKiBBIFBLQ1MjNyBzaWduZWREYXRhIHNpZ25lckluZm8uCj4gKyAqLwo+ICtzdHJ1Y3Qg cGtjczdfc2lnbmVySW5mbwo+ICt7Cj4gKyAgY29uc3QgZ2NyeV9tZF9zcGVjX3QgKmhhc2g7Cj4g KyAgZ2NyeV9tcGlfdCBzaWdfbXBpOwo+ICt9Owo+ICsKPiArLyoKPiArICogQSBQS0NTIzcgc2ln bmVkRGF0YSBtZXNzYWdlLgo+ICsgKiBXZSBtYWtlIG5vIGF0dGVtcHQgdG8gbWF0Y2ggaW50ZWxs aWdlbnRseSwgc28gd2UgZG9uJ3Qgc2F2ZSBhbnkgCj4gaW5mbyBhYm91dAo+ICsgKiB0aGUgc2ln bmVyLgo+ICsgKi8KPiArc3RydWN0IHBrY3M3X3NpZ25lZERhdGEKPiArewo+ICsgIGludCBzaWdu ZXJJbmZvX2NvdW50Owo+ICsgIHN0cnVjdCBwa2NzN19zaWduZXJJbmZvICpzaWduZXJJbmZvczsK PiArfTsKPiArCj4gKy8qIERvIGxpYnRhc24xIGluaXQgKi8KPiAraW50Cj4gK2FzbjFfaW5pdCAo dm9pZCk7Cj4gKwo+ICsvKgo+ICsgKiBJbXBvcnQgYSBERVItZW5jb2RlZCBjZXJ0aWZpY2F0ZSBh dCAnZGF0YScsIG9mIHNpemUgJ3NpemUnLgo+ICsgKiBQbGFjZSB0aGUgcmVzdWx0cyBpbnRvICdy ZXN1bHRzJywgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZC4KPiArICovCj4gK2dydWJf ZXJyX3QKPiArcGFyc2VfeDUwOV9jZXJ0aWZpY2F0ZSAoY29uc3Qgdm9pZCAqZGF0YSwgZ3J1Yl9z aXplX3Qgc2l6ZSwgc3RydWN0Cj4geDUwOV9jZXJ0aWZpY2F0ZSAqcmVzdWx0cyk7Cj4gKwo+ICsv Kgo+ICsgKiBSZWxlYXNlIGFsbCB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggdGhlIHg1MDkg Y2VydGlmaWNhdGUuCj4gKyAqIElmIHRoZSBjYWxsZXIgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHRo ZSBjZXJ0aWZpY2F0ZSwgaXQgbXVzdCBmcmVlIAo+IGl0Lgo+ICsgKiBUaGUgY2FsbGVyIGlzIGFs c28gcmVzcG9uc2libGUgZm9yIG1haW50ZW5hbmNlIG9mIHRoZSBsaW5rZWQgbGlzdC4KPiArICov Cj4gK3ZvaWQKPiArY2VydGlmaWNhdGVfcmVsZWFzZSAoc3RydWN0IHg1MDlfY2VydGlmaWNhdGUg KmNlcnQpOwo+ICsKPiArLyoKPiArICogUGFyc2UgYSBQS0NTIzcgbWVzc2FnZSwgd2hpY2ggbXVz dCBiZSBhIHNpZ25lZERhdGEgbWVzc2FnZS4KPiArICogVGhlIG1lc3NhZ2UgbXVzdCBiZSBpbiAn c2lnYnVmJyBhbmQgb2Ygc2l6ZSAnZGF0YV9zaXplJy4gVGhlIHJlc3VsdCAKPiBpcwo+ICsgKiBw bGFjZWQgaW4gJ21zZycsIHdoaWNoIG11c3QgYWxyZWFkeSBiZSBhbGxvY2F0ZWQuCj4gKyAqLwo+ ICtncnViX2Vycl90Cj4gK3BhcnNlX3BrY3M3X3NpZ25lZERhdGEgKGNvbnN0IHZvaWQgKnNpZ2J1 ZiwgZ3J1Yl9zaXplX3QgZGF0YV9zaXplLAo+IHN0cnVjdCBwa2NzN19zaWduZWREYXRhICptc2cp Owo+ICsKPiArLyoKPiArICogUmVsZWFzZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRo IHRoZSBQS0NTIzcgbWVzc2FnZS4KPiArICogSWYgdGhlIGNhbGxlciBkeW5hbWljYWxseSBhbGxv Y2F0ZWQgdGhlIG1lc3NhZ2UsIGl0IG11c3QgZnJlZSBpdC4KPiArICovCj4gK3ZvaWQKPiArcGtj czdfc2lnbmVkRGF0YV9yZWxlYXNlIChzdHJ1Y3QgcGtjczdfc2lnbmVkRGF0YSAqbXNnKTsKPiAr Cj4gKy8qCj4gKyAqIFJlYWQgYSB2YWx1ZSBmcm9tIGFuIEFTTjEgbm9kZSwgYWxsb2NhdGluZyBt ZW1vcnkgdG8gc3RvcmUgaXQuCj4gKyAqIEl0IHdpbGwgd29yayBmb3IgYW55dGhpbmcgd2hlcmUg dGhlIHNpemUgbGlidGFzbjEgcmV0dXJucyBpcyByaWdodDoKPiArICogIC0gSW50ZWdlcnMKPiAr ICogIC0gT2N0ZXQgc3RyaW5ncwo+ICsgKiAgLSBERVIgZW5jb2Rpbmcgb2Ygb3RoZXIgc3RydWN0 dXJlcwo+ICsgKiBJdCB3aWxsIF9ub3RfIHdvcmsgZm9yIHRoaW5ncyB3aGVyZSBsaWJ0YXNuMSBz aXplIHJlcXVpcmVzIAo+IGFkanVzdG1lbnQ6Cj4gKyAqICAtIFN0cmluZ3MgdGhhdCByZXF1aXJl IGFuIGV4dHJhIE5VTEwgYnl0ZSBhdCB0aGUgZW5kCj4gKyAqICAtIEJpdCBzdHJpbmdzIGJlY2F1 c2UgbGlidGFzbjEgcmV0dXJucyB0aGUgbGVuZ3RoIGluIGJpdHMsIG5vdCAKPiBieXRlcy4KPiAr ICoKPiArICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBub24tTlVMTCB2YWx1ZSwgdGhlIGNh bGxlciBtdXN0IGZyZWUgaXQuCj4gKyAqLwo+ICt2b2lkICoKPiArZ3J1Yl9hc24xX2FsbG9jYXRl X2FuZF9yZWFkIChhc24xX25vZGUgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QKPiBjaGFy ICpmcmllbmRseV9uYW1lLCBpbnQgKmNvbnRlbnRfc2l6ZSk7Cj4gZGlmZiAtLWdpdCBhL2dydWIt Y29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9hc24xdXRpbC5jCj4gYi9ncnViLWNvcmUvY29tbWFu ZHMvYXBwZW5kZWRzaWcvYXNuMXV0aWwuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXgg MDAwMDAwMDAwLi42MDlkMGVjZjIKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZ3J1Yi1jb3JlL2Nv bW1hbmRzL2FwcGVuZGVkc2lnL2FzbjF1dGlsLmMKPiBAQCAtMCwwICsxLDk5IEBACj4gKy8qCj4g KyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCj4gKyAqICBDb3B5cmlnaHQg KEMpIDIwMjAsIDIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCj4gKyAqICBDb3B5 cmlnaHQgKEMpIDIwMjAsIDIwMjIgSUJNIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqICBHUlVCIGlz IGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKPiAr ICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIAo+IGJ5Cj4gKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBl aXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAgKGF0IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogIGJ1dCBXSVRIT1VUIEFOWSBX QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqICBNRVJD SEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhl Cj4gKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ICsg Kgo+ICsgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKPiArICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxo dHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPiArICovCj4gKwo+ICsjaW5jbHVkZSA8Z3J1 Yi9saWJ0YXNuMS5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi90eXBlcy5oPgo+ICsjaW5jbHVkZSA8Z3J1 Yi9lcnIuaD4KPiArI2luY2x1ZGUgPGdydWIvbW0uaD4KPiArI2luY2x1ZGUgPGdydWIvY3J5cHRv Lmg+Cj4gKyNpbmNsdWRlIDxncnViL21pc2MuaD4KPiArI2luY2x1ZGUgPGdydWIvZ2NyeXB0L2dj cnlwdC5oPgo+ICsKPiArI2luY2x1ZGUgImFwcGVuZGVkc2lnLmgiCj4gKwo+ICthc24xX25vZGUg X2dudXRsc19nbnV0bHNfYXNuID0gTlVMTDsKPiArYXNuMV9ub2RlIF9nbnV0bHNfcGtpeF9hc24g PSBOVUxMOwo+ICsKPiArZXh0ZXJuIGNvbnN0IGFzbjFfc3RhdGljX25vZGUgZ251dGxzX2FzbjFf dGFiW107Cj4gK2V4dGVybiBjb25zdCBhc24xX3N0YXRpY19ub2RlIHBraXhfYXNuMV90YWJbXTsK PiArCj4gKy8qCj4gKyAqIFJlYWQgYSB2YWx1ZSBmcm9tIGFuIEFTTjEgbm9kZSwgYWxsb2NhdGlu ZyBtZW1vcnkgdG8gc3RvcmUgaXQuCj4gKyAqIEl0IHdpbGwgd29yayBmb3IgYW55dGhpbmcgd2hl cmUgdGhlIHNpemUgbGlidGFzbjEgcmV0dXJucyBpcyByaWdodDoKPiArICogIC0gSW50ZWdlcnMK PiArICogIC0gT2N0ZXQgc3RyaW5ncwo+ICsgKiAgLSBERVIgZW5jb2Rpbmcgb2Ygb3RoZXIgc3Ry dWN0dXJlcwo+ICsgKiBJdCB3aWxsIF9ub3RfIHdvcmsgZm9yIHRoaW5ncyB3aGVyZSBsaWJ0YXNu MSBzaXplIHJlcXVpcmVzIAo+IGFkanVzdG1lbnQ6Cj4gKyAqICAtIFN0cmluZ3MgdGhhdCByZXF1 aXJlIGFuIGV4dHJhIE5VTEwgYnl0ZSBhdCB0aGUgZW5kCj4gKyAqICAtIEJpdCBzdHJpbmdzIGJl Y2F1c2UgbGlidGFzbjEgcmV0dXJucyB0aGUgbGVuZ3RoIGluIGJpdHMsIG5vdCAKPiBieXRlcy4K PiArICogSWYgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBub24tTlVMTCB2YWx1ZSwgdGhlIGNhbGxl ciBtdXN0IGZyZWUgaXQuCj4gKyAqLwo+ICt2b2lkICoKPiArZ3J1Yl9hc24xX2FsbG9jYXRlX2Fu ZF9yZWFkIChhc24xX25vZGUgbm9kZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QKPiBjaGFyICpm cmllbmRseV9uYW1lLCBpbnQgKmNvbnRlbnRfc2l6ZSkKPiArewo+ICsgIGludCByZXN1bHQ7Cj4g KyAgZ3J1Yl91aW50OF90ICp0bXBzdHIgPSBOVUxMOwo+ICsgIGludCB0bXBzdHJfc2l6ZSA9IDA7 Cj4gKwo+ICsgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAobm9kZSwgbmFtZSwgTlVMTCwgJnRt cHN0cl9zaXplKTsKPiArICBpZiAocmVzdWx0ICE9IEFTTjFfTUVNX0VSUk9SKQo+ICsgICAgewo+ ICsgICAgICBncnViX3NucHJpbnRmIChncnViX2Vycm1zZywgc2l6ZW9mIChncnViX2Vycm1zZyks Cj4gKyAgICAgICAgICAgICAgICAgICAgIF8oIlJlYWRpbmcgc2l6ZSBvZiAlcyBkaWQgbm90IHJl dHVybiBleHBlY3RlZAo+IHN0YXR1czogJXMiKSwKPiArICAgICAgICAgICAgICAgICAgICAgZnJp ZW5kbHlfbmFtZSwgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4gKyAgICAgIGdydWJfZXJybm8g PSBHUlVCX0VSUl9CQURfRklMRV9UWVBFOwo+ICsgICAgICByZXR1cm4gTlVMTDsKPiArICAgIH0K PiArCj4gKyAgdG1wc3RyID0gZ3J1Yl9tYWxsb2MgKHRtcHN0cl9zaXplKTsKPiArICBpZiAodG1w c3RyID09IE5VTEwpCj4gKyAgICB7Cj4gKyAgICAgIGdydWJfc25wcmludGYgKGdydWJfZXJybXNn LCBzaXplb2YgKGdydWJfZXJybXNnKSwKPiArICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5v dCBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgJXMiLCAKPiBmcmllbmRseV9uYW1lKTsKPiArICAg ICAgZ3J1Yl9lcnJubyA9IEdSVUJfRVJSX09VVF9PRl9NRU1PUlk7Cj4gKyAgICAgIHJldHVybiBO VUxMOwo+ICsgICAgfQo+ICsKPiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKG5vZGUsIG5h bWUsIHRtcHN0ciwgJnRtcHN0cl9zaXplKTsKPiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VT UykKPiArICAgIHsKPiArICAgICAgZ3J1Yl9mcmVlICh0bXBzdHIpOwo+ICsgICAgICBncnViX3Nu cHJpbnRmIChncnViX2Vycm1zZywgc2l6ZW9mIChncnViX2Vycm1zZyksICJFcnJvciByZWFkaW5n IAo+ICVzOiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgIGZyaWVuZGx5X25hbWUsIGFzbjFf c3RyZXJyb3IgKHJlc3VsdCkpOwo+ICsgICAgICBncnViX2Vycm5vID0gR1JVQl9FUlJfQkFEX0ZJ TEVfVFlQRTsKPiArICAgICAgcmV0dXJuIE5VTEw7Cj4gKyAgICB9Cj4gKwo+ICsgICpjb250ZW50 X3NpemUgPSB0bXBzdHJfc2l6ZTsKPiArCj4gKyAgcmV0dXJuIHRtcHN0cjsKPiArfQo+ICsKPiAr aW50Cj4gK2FzbjFfaW5pdCAodm9pZCkKPiArewo+ICsgIGludCByZXM7Cj4gKyAgcmVzID0gYXNu MV9hcnJheTJ0cmVlIChnbnV0bHNfYXNuMV90YWIsICZfZ251dGxzX2dudXRsc19hc24sIE5VTEwp Owo+ICsgIGlmIChyZXMgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4g cmVzOwo+ICsgICAgfQo+ICsgIHJlcyA9IGFzbjFfYXJyYXkydHJlZSAocGtpeF9hc24xX3RhYiwg Jl9nbnV0bHNfcGtpeF9hc24sIE5VTEwpOwo+ICsgIHJldHVybiByZXM7Cj4gK30KPiBkaWZmIC0t Z2l0IGEvZ3J1Yi1jb3JlL2NvbW1hbmRzL2FwcGVuZGVkc2lnL3BrY3M3LmMKPiBiL2dydWItY29y ZS9jb21tYW5kcy9hcHBlbmRlZHNpZy9wa2NzNy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBp bmRleCAwMDAwMDAwMDAuLjYxZTU2MDg1NAo+IC0tLSAvZGV2L251bGwKPiArKysgYi9ncnViLWNv cmUvY29tbWFuZHMvYXBwZW5kZWRzaWcvcGtjczcuYwo+IEBAIC0wLDAgKzEsNDczIEBACj4gKy8q Cj4gKyAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyCj4gKyAqICBDb3B5cmln aHQgKEMpIDIwMjAsIDIwMjIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCj4gKyAqICBD b3B5cmlnaHQgKEMpIDIwMjAsIDIwMjIgSUJNIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqICBHUlVC IGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkK PiArICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIAo+IGJ5Cj4gKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u LCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgo+ICsgKiAgKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KPiArICoKPiArICogIEdSVUIgaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKPiArICogIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCj4gKyAqICBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg dGhlCj4gKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgo+ ICsgKgo+ICsgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UKPiArICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2Vl IDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KPiArICovCj4gKwo+ICsjaW5jbHVkZSAi YXBwZW5kZWRzaWcuaCIKPiArI2luY2x1ZGUgPGdydWIvbWlzYy5oPgo+ICsjaW5jbHVkZSA8Z3J1 Yi9jcnlwdG8uaD4KPiArI2luY2x1ZGUgPGdydWIvZ2NyeXB0L2djcnlwdC5oPgo+ICsjaW5jbHVk ZSA8c3lzL3R5cGVzLmg+Cj4gKwo+ICtzdGF0aWMgY2hhciBhc24xX2Vycm9yW0FTTjFfTUFYX0VS Uk9SX0RFU0NSSVBUSU9OX1NJWkVdOwo+ICsKPiArLyoKPiArICogUkZDIDU2NTIgcyA1LjEKPiAr ICovCj4gK3N0YXRpYyBjb25zdCBjaGFyICpzaWduZWREYXRhX29pZCA9ICIxLjIuODQwLjExMzU0 OS4xLjcuMiI7Cj4gKwo+ICsvKgo+ICsgKiBSRkMgNDA1NSBzIDIuMQo+ICsgKi8KPiArc3RhdGlj IGNvbnN0IGNoYXIgKnNoYTI1Nl9vaWQgPSAiMi4xNi44NDAuMS4xMDEuMy40LjIuMSI7Cj4gK3N0 YXRpYyBjb25zdCBjaGFyICpzaGE1MTJfb2lkID0gIjIuMTYuODQwLjEuMTAxLjMuNC4yLjMiOwo+ ICsKPiArc3RhdGljIGdydWJfZXJyX3QKPiArcHJvY2Vzc19jb250ZW50IChncnViX3VpbnQ4X3Qg KmNvbnRlbnQsIGludCBzaXplLCBzdHJ1Y3QgCj4gcGtjczdfc2lnbmVkRGF0YSAqbXNnKQo+ICt7 Cj4gKyAgaW50IHJlczsKPiArICBhc24xX25vZGUgc2lnbmVkX3BhcnQ7Cj4gKyAgZ3J1Yl9lcnJf dCBlcnIgPSBHUlVCX0VSUl9OT05FOwo+ICsgIGNoYXIgYWxnb19vaWRbTUFYX09JRF9MRU5dOwo+ ICsgIGludCBhbGdvX29pZF9zaXplID0gc2l6ZW9mIChhbGdvX29pZCk7Cj4gKyAgaW50IGFsZ29f Y291bnQ7Cj4gKyAgaW50IHNpZ25lcl9jb3VudDsKPiArICBpbnQgaTsKPiArICBjaGFyIHZlcnNp b247Cj4gKyAgaW50IHZlcnNpb25fc2l6ZSA9IHNpemVvZiAodmVyc2lvbik7Cj4gKyAgZ3J1Yl91 aW50OF90ICpyZXN1bHRfYnVmOwo+ICsgIGludCByZXN1bHRfc2l6ZSA9IDA7Cj4gKyAgaW50IGNy bHNfc2l6ZSA9IDA7Cj4gKyAgZ2NyeV9lcnJvcl90IGdjcnlfZXJyOwo+ICsgIGJvb2wgc2hhMjU2 X2luX2RhLCBzaGEyNTZfaW5fc2ksIHNoYTUxMl9pbl9kYSwgc2hhNTEyX2luX3NpOwo+ICsgIGNo YXIgKmRhX3BhdGg7Cj4gKyAgY2hhciAqc2lfc2lnX3BhdGg7Cj4gKyAgY2hhciAqc2lfZGFfcGF0 aDsKPiArCj4gKyAgcmVzID0gYXNuMV9jcmVhdGVfZWxlbWVudCAoX2dudXRsc19wa2l4X2FzbiwK PiAiUEtJWDEucGtjcy03LVNpZ25lZERhdGEiLCAmc2lnbmVkX3BhcnQpOwo+ICsgIGlmIChyZXMg IT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JV Ql9FUlJfT1VUX09GX01FTU9SWSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBu b3QgY3JlYXRlIEFTTi4xIHN0cnVjdHVyZSBmb3IgUEtDUyM3IAo+IHNpZ25lZCAiCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAicGFydC4iKTsKPiArICAgIH0KPiArCj4gKyAgcmVzID0gYXNu MV9kZXJfZGVjb2RpbmcyICgmc2lnbmVkX3BhcnQsIGNvbnRlbnQsICZzaXplLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgQVNOMV9ERUNPREVfRkxBR19TVFJJQ1RfREVSLCBhc24xX2Vy cm9yKTsKPiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPiArICAgIHsKPiArICAgICAgZXJy ID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgIkVycm9yIHJlYWRpbmcgUEtDUyM3IHNpZ25lZCBkYXRhOiAlcyIsIAo+IGFzbjFf ZXJyb3IpOwo+ICsgICAgICBnb3RvIGNsZWFudXBfc2lnbmVkX3BhcnQ7Cj4gKyAgICB9Cj4gKwo+ ICsgIC8qCj4gKyAgICogU2lnbmVkRGF0YSA6Oj0gU0VRVUVOQ0Ugewo+ICsgICAqICAgICB2ZXJz aW9uIENNU1ZlcnNpb24sCj4gKyAgICogICAgIGRpZ2VzdEFsZ29yaXRobXMgRGlnZXN0QWxnb3Jp dGhtSWRlbnRpZmllcnMsCj4gKyAgICogICAgIGVuY2FwQ29udGVudEluZm8gRW5jYXBzdWxhdGVk Q29udGVudEluZm8sCj4gKyAgICogICAgIGNlcnRpZmljYXRlcyBbMF0gSU1QTElDSVQgQ2VydGlm aWNhdGVTZXQgT1BUSU9OQUwsCj4gKyAgICogICAgIGNybHMgWzFdIElNUExJQ0lUIFJldm9jYXRp b25JbmZvQ2hvaWNlcyBPUFRJT05BTCwKPiArICAgKiAgICAgc2lnbmVySW5mb3MgU2lnbmVySW5m b3MgfQo+ICsgICAqLwo+ICsKPiArICAvKiB2ZXJzaW9uIHBlciB0aGUgYWxnbyBpbiA1LjEsIG11 c3QgYmUgMSAqLwo+ICsgIHJlcyA9IGFzbjFfcmVhZF92YWx1ZSAoc2lnbmVkX3BhcnQsICJ2ZXJz aW9uIiwgJnZlcnNpb24sIAo+ICZ2ZXJzaW9uX3NpemUpOwo+ICsgIGlmIChyZXMgIT0gQVNOMV9T VUNDRVNTKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf U0lHTkFUVVJFLCAiRXJyb3IgcmVhZGluZwo+IHNpZ25lZERhdGEgdmVyc2lvbjogJXMiLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXMpKTsKPiArICAgICAgZ290 byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgfQo+ICsKPiArICBpZiAodmVyc2lvbiAhPSAx KQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFU VVJFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBzaWduYXR1cmUgdmVy c2lvbiB2JWQsIG9ubHkgdjEKPiBzdXBwb3J0ZWQiLCB2ZXJzaW9uKTsKPiArICAgICAgZ290byBj bGVhbnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgfQo+ICsKPiArICAvKgo+ICsgICAqIGRpZ2VzdEFs Z29yaXRobXMgRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmllcnMKPiArICAgKgo+ICsgICAqIERpZ2Vz dEFsZ29yaXRobUlkZW50aWZpZXJzIDo6PSBTRVQgT0YgRGlnZXN0QWxnb3JpdGhtSWRlbnRpZmll cgo+ICsgICAqIERpZ2VzdEFsZ29yaXRobUlkZW50aWZlciBpcyBhbiBYLjUwOSBBbGdvcml0aG1J ZGVudGlmaWVyICgxMC4xLjEpCj4gKyAgICoKPiArICAgKiBSRkMgNDA1NSBzIDIuMToKPiArICAg KiBzaGEyNTZJZGVudGlmaWVyICBBbGdvcml0aG1JZGVudGlmaWVyICA6Oj0gIHsgaWQtc2hhMjU2 LCBOVUxMIH0KPiArICAgKiBzaGE1MTJJZGVudGlmaWVyICBBbGdvcml0aG1JZGVudGlmaWVyICA6 Oj0gIHsgaWQtc2hhNTEyLCBOVUxMIH0KPiArICAgKgo+ICsgICAqIFdlIG9ubHkgc3VwcG9ydCAx IGVsZW1lbnQgaW4gdGhlIHNldCwgYW5kIHdlIGRvIG5vdCBjaGVjayAKPiBwYXJhbWV0ZXJzIGF0 bS4KPiArICAgKi8KPiArICByZXMgPSBhc24xX251bWJlcl9vZl9lbGVtZW50cyAoc2lnbmVkX3Bh cnQsICJkaWdlc3RBbGdvcml0aG1zIiwgCj4gJmFsZ29fY291bnQpOwo+ICsgIGlmIChyZXMgIT0g QVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VS Ul9CQURfU0lHTkFUVVJFLCAiRXJyb3IgY291bnRpbmcKPiBudW1iZXIgb2YgZGlnZXN0IGFsZ29y aXRobXM6ICVzIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVz KSk7Cj4gKyAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPiArICAgIH0KPiArCj4gKyAg aWYgKGFsZ29fY291bnQgPD0gMCkKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX1NJR05BVFVSRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIkEgbWlu aW11bSBvZiAxIGRpZ2VzdCBhbGdvcml0aG0gaXMgCj4gcmVxdWlyZWQiKTsKPiArICAgICAgZ290 byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgfQo+ICsKPiArICBpZiAoYWxnb19jb3VudCA+ IDIpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX05PVF9JTVBM RU1FTlRFRF9ZRVQsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJBIG1heGltdW0gb2YgMiBk aWdlc3QgYWxnb3JpdGhtcyBhcmUgCj4gc3VwcG9ydGVkIik7Cj4gKyAgICAgIGdvdG8gY2xlYW51 cF9zaWduZWRfcGFydDsKPiArICAgIH0KPiArCj4gKyAgc2hhMjU2X2luX2RhID0gZmFsc2U7Cj4g KyAgc2hhNTEyX2luX2RhID0gZmFsc2U7Cj4gKwo+ICsgIGZvciAoaSA9IDA7IGkgPCBhbGdvX2Nv dW50OyBpKyspCj4gKyAgICB7Cj4gKyAgICAgIGRhX3BhdGggPSBncnViX3hhc3ByaW50ZiAoImRp Z2VzdEFsZ29yaXRobXMuPyVkLmFsZ29yaXRobSIsIGkgKyAKPiAxKTsKPiArICAgICAgaWYgKCFk YV9wYXRoKQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX09VVF9PRl9NRU1PUlksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQg bm90IGFsbG9jYXRlIHBhdGggZm9yIGRpZ2VzdCAKPiBhbGdvcml0aG0gIgo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgInBhcnNpbmcgcGF0aCIpOwo+ICsgICAgICAgICAgZ290byBjbGVh bnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGFsZ29fb2lkX3NpemUg PSBzaXplb2YgKGFsZ29fb2lkKTsKPiArICAgICAgcmVzID0gYXNuMV9yZWFkX3ZhbHVlIChzaWdu ZWRfcGFydCwgZGFfcGF0aCwgYWxnb19vaWQsIAo+ICZhbGdvX29pZF9zaXplKTsKPiArICAgICAg aWYgKHJlcyAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0g Z3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwgIkVycm9yIHJlYWRpbmcKPiBkaWdl c3QgYWxnb3JpdGhtOiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0 cmVycm9yIChyZXMpKTsKPiArICAgICAgICAgIGdydWJfZnJlZSAoZGFfcGF0aCk7Cj4gKyAgICAg ICAgICBnb3RvIGNsZWFudXBfc2lnbmVkX3BhcnQ7Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAg aWYgKGdydWJfc3RybmNtcCAoc2hhNTEyX29pZCwgYWxnb19vaWQsIGFsZ29fb2lkX3NpemUpID09 IDApCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgaWYgKCFzaGE1MTJfaW5fZGEpCj4gKyAgICAg ICAgICAgIHsKPiArICAgICAgICAgICAgICBzaGE1MTJfaW5fZGEgPSB0cnVlOwo+ICsgICAgICAg ICAgICB9Cj4gKyAgICAgICAgICBlbHNlCj4gKyAgICAgICAgICAgIHsKPiArICAgICAgICAgICAg ICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFUVVJFLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICJTSEEtNTEyIHNwZWNpZmllZCB0d2ljZSBpbiBkaWdlc3Qg Cj4gYWxnb3JpdGhtICIKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCIp Owo+ICsgICAgICAgICAgICAgIGdydWJfZnJlZSAoZGFfcGF0aCk7Cj4gKyAgICAgICAgICAgICAg Z290byBjbGVhbnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgICAgICAgICB9Cj4gKyAgICAgICAgfQo+ ICsgICAgICBlbHNlIGlmIChncnViX3N0cm5jbXAgKHNoYTI1Nl9vaWQsIGFsZ29fb2lkLCBhbGdv X29pZF9zaXplKSA9PSAKPiAwKQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGlmICghc2hhMjU2 X2luX2RhKQo+ICsgICAgICAgICAgICB7Cj4gKyAgICAgICAgICAgICAgc2hhMjU2X2luX2RhID0g dHJ1ZTsKPiArICAgICAgICAgICAgfQo+ICsgICAgICAgICAgZWxzZQo+ICsgICAgICAgICAgICB7 Cj4gKyAgICAgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVS RSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0hBLTI1NiBzcGVjaWZpZWQg dHdpY2UgaW4gZGlnZXN0IAo+IGFsZ29yaXRobSAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgImxpc3QiKTsKPiArICAgICAgICAgICAgICBncnViX2ZyZWUgKGRhX3BhdGgpOwo+ ICsgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPiArICAgICAgICAgICAg fQo+ICsgICAgICAgIH0KPiArICAgICAgZWxzZQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGVy ciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX05PVF9JTVBMRU1FTlRFRF9ZRVQsICJPbmx5Cj4gU0hB LTI1NiBhbmQgU0hBLTUxMiBoYXNoZXMgYXJlIHN1cHBvcnRlZCwgZm91bmQgT0lEICVzIiwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29fb2lkKTsKPiArICAgICAgICAgIGdydWJf ZnJlZSAoZGFfcGF0aCk7Cj4gKyAgICAgICAgICBnb3RvIGNsZWFudXBfc2lnbmVkX3BhcnQ7Cj4g KyAgICAgICAgfQo+ICsKPiArICAgICAgZ3J1Yl9mcmVlIChkYV9wYXRoKTsKPiArICAgIH0KPiAr Cj4gKyAgLyogYXQgdGhpcyBwb2ludCwgYXQgbGVhc3Qgb25lIG9mIHNoYXsyNTYsNTEyfV9pbl9k YSBtdXN0IGJlIHRydWUgKi8KPiArCj4gKyAgLyoKPiArICAgKiBXZSBpZ25vcmUgdGhlIGNlcnRp ZmljYXRlcywgYnV0IHdlIGRvbid0IHBlcm1pdCBDUkxzLgo+ICsgICAqIEEgQ1JMIGVudHJ5IG1p Z2h0IGJlIHJldm9raW5nIHRoZSBjZXJ0aWZpY2F0ZSB3ZSdyZSB1c2luZywgYW5kIHdlIAo+IGhh dmUKPiArICAgKiBubyB3YXkgb2YgZGVhbGluZyB3aXRoIHRoYXQgYXQgdGhlIG1vbWVudC4KPiAr ICAgKi8KPiArICByZXMgPSBhc24xX3JlYWRfdmFsdWUgKHNpZ25lZF9wYXJ0LCAiY3JscyIsIE5V TEwsICZjcmxzX3NpemUpOwo+ICsgIGlmIChyZXMgIT0gQVNOMV9FTEVNRU5UX05PVF9GT1VORCkK PiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfTk9UX0lNUExFTUVO VEVEX1lFVCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIlBLQ1MjNyBtZXNzYWdlcyB3aXRo IGVtYmVkZGVkIENSTHMgYXJlIG5vdAo+IHN1cHBvcnRlZCIpOwo+ICsgICAgICBnb3RvIGNsZWFu dXBfc2lnbmVkX3BhcnQ7Cj4gKyAgICB9Cj4gKwo+ICsgIC8qIHJlYWQgdGhlIHNpZ25hdHVyZXMg Ki8KPiArCj4gKyAgcmVzID0gYXNuMV9udW1iZXJfb2ZfZWxlbWVudHMgKHNpZ25lZF9wYXJ0LCAi c2lnbmVySW5mb3MiLCAKPiAmc2lnbmVyX2NvdW50KTsKPiArICBpZiAocmVzICE9IEFTTjFfU1VD Q0VTUykKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJ R05BVFVSRSwgIkVycm9yIGNvdW50aW5nCj4gbnVtYmVyIG9mIHNpZ25lcnM6ICVzIiwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzKSk7Cj4gKyAgICAgIGdvdG8g Y2xlYW51cF9zaWduZWRfcGFydDsKPiArICAgIH0KPiArCj4gKyAgaWYgKHNpZ25lcl9jb3VudCA8 PSAwKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lH TkFUVVJFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAiQSBtaW5pbXVtIG9mIDEgc2lnbmVy IGlzIHJlcXVpcmVkIik7Cj4gKyAgICAgIGdvdG8gY2xlYW51cF9zaWduZWRfcGFydDsKPiArICAg IH0KPiArCj4gKyAgbXNnLT5zaWduZXJJbmZvcyA9IGdydWJfY2FsbG9jIChzaWduZXJfY291bnQs IHNpemVvZiAoc3RydWN0Cj4gcGtjczdfc2lnbmVySW5mbykpOwo+ICsgIGlmICghbXNnLT5zaWdu ZXJJbmZvcykKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VU X09GX01FTU9SWSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0 ZSBzcGFjZSBmb3IgJWQgc2lnbmVycyIsCj4gc2lnbmVyX2NvdW50KTsKPiArICAgICAgZ290byBj bGVhbnVwX3NpZ25lZF9wYXJ0Owo+ICsgICAgfQo+ICsKPiArICBtc2ctPnNpZ25lckluZm9fY291 bnQgPSAwOwo+ICsgIGZvciAoaSA9IDA7IGkgPCBzaWduZXJfY291bnQ7IGkrKykKPiArICAgIHsK PiArICAgICAgc2lfZGFfcGF0aCA9IGdydWJfeGFzcHJpbnRmCj4gKCJzaWduZXJJbmZvcy4/JWQu ZGlnZXN0QWxnb3JpdGhtLmFsZ29yaXRobSIsIGkgKyAxKTsKPiArICAgICAgaWYgKCFzaV9kYV9w YXRoKQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJS X09VVF9PRl9NRU1PUlksICJDb3VsZCBub3QKPiBhbGxvY2F0ZSBwYXRoIGZvciBzaWduZXIgJWQn cyBkaWdlc3QgYWxnb3JpdGhtIHBhcnNpbmcgcGF0aCIsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICBpKTsKPiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWduZXJJbmZvczsKPiArICAg ICAgICB9Cj4gKwo+ICsgICAgICBhbGdvX29pZF9zaXplID0gc2l6ZW9mIChhbGdvX29pZCk7Cj4g KyAgICAgIHJlcyA9IGFzbjFfcmVhZF92YWx1ZSAoc2lnbmVkX3BhcnQsIHNpX2RhX3BhdGgsIGFs Z29fb2lkLAo+ICZhbGdvX29pZF9zaXplKTsKPiArICAgICAgaWYgKHJlcyAhPSBBU04xX1NVQ0NF U1MpCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJf QkFEX1NJR05BVFVSRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFk aW5nIHNpZ25lciAlZCdzIGRpZ2VzdAo+IGFsZ29yaXRobTogJXMiLCBpLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzKSk7Cj4gKyAgICAgICAgICBncnVi X2ZyZWUgKHNpX2RhX3BhdGgpOwo+ICsgICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25lckluZm9z Owo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGdydWJfZnJlZSAoc2lfZGFfcGF0aCk7Cj4gKwo+ ICsgICAgICBpZiAoZ3J1Yl9zdHJuY21wIChzaGE1MTJfb2lkLCBhbGdvX29pZCwgYWxnb19vaWRf c2l6ZSkgPT0gMCkKPiArICAgICAgICB7Cj4gKyAgICAgICAgICBpZiAoIXNoYTUxMl9pbl9kYSkK PiArICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9TSUdOQVRVUkUsICJTaWduZXIgJWQKPiBjbGFpbXMgYSBTSEEtNTEyIHNpZ25hdHVy ZSAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIHdhcyBub3Qgc3Bl Y2lmaWVkIGluIHRoZSBvdXRlcgo+IERpZ2VzdEFsZ29yaXRobXMiLCBpKTsKPiArICAgICAgICAg ICAgICBnb3RvIGNsZWFudXBfc2lnbmVySW5mb3M7Cj4gKyAgICAgICAgICAgIH0KPiArICAgICAg ICAgIGVsc2UKPiArICAgICAgICAgICAgewo+ICsgICAgICAgICAgICAgIHNoYTUxMl9pbl9zaSA9 IHRydWU7Cj4gKyAgICAgICAgICAgICAgbXNnLT5zaWduZXJJbmZvc1tpXS5oYXNoID0KPiArICAg ICAgICAgICAgICAgICAgICAgIGdydWJfY3J5cHRvX2xvb2t1cF9tZF9ieV9uYW1lICgic2hhNTEy Iik7Cj4gKyAgICAgICAgICAgIH0KPiArICAgICAgICB9Cj4gKyAgICAgIGVsc2UgaWYgKGdydWJf c3RybmNtcCAoc2hhMjU2X29pZCwgYWxnb19vaWQsIGFsZ29fb2lkX3NpemUpID09IAo+IDApCj4g KyAgICAgICAgewo+ICsgICAgICAgICAgaWYgKCFzaGEyNTZfaW5fZGEpCj4gKyAgICAgICAgICAg IHsKPiArICAgICAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfU0lHTkFU VVJFLCAiU2lnbmVyICVkCj4gY2xhaW1zIGEgU0hBLTI1NiBzaWduYXR1cmUgIgo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJ3aGljaCB3YXMgbm90IHNwZWNpZmllZCBpbiB0aGUg b3V0ZXIKPiBEaWdlc3RBbGdvcml0aG1zIiwgaSk7Cj4gKyAgICAgICAgICAgICAgZ290byBjbGVh bnVwX3NpZ25lckluZm9zOwo+ICsgICAgICAgICAgICB9Cj4gKyAgICAgICAgICBlbHNlCj4gKyAg ICAgICAgICAgIHsKPiArICAgICAgICAgICAgICBzaGEyNTZfaW5fc2kgPSB0cnVlOwo+ICsgICAg ICAgICAgICAgIG1zZy0+c2lnbmVySW5mb3NbaV0uaGFzaCA9Cj4gKyAgICAgICAgICAgICAgICAg ICAgICBncnViX2NyeXB0b19sb29rdXBfbWRfYnlfbmFtZSAoInNoYTI1NiIpOwo+ICsgICAgICAg ICAgICB9Cj4gKyAgICAgICAgfQo+ICsgICAgICBlbHNlCj4gKyAgICAgICAgewo+ICsgICAgICAg ICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfTk9UX0lNUExFTUVOVEVEX1lFVCwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJPbmx5IFNIQS0yNTYgYW5kIFNIQS01MTIgaGFzaGVz IGFyZQo+IHN1cHBvcnRlZCwgZm91bmQgT0lEICVzIiwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGFsZ29fb2lkKTsKPiArICAgICAgICAgIGdvdG8gY2xlYW51cF9zaWduZXJJbmZvczsK PiArICAgICAgICB9Cj4gKwo+ICsgICAgICBpZiAoIW1zZy0+c2lnbmVySW5mb3NbaV0uaGFzaCkK PiArICAgICAgICB7Cj4gKyAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf U0lHTkFUVVJFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhhc2ggYWxnb3JpdGht IGZvciBzaWduZXIgJWQgKE9JRCAlcykKPiBub3QgbG9hZGVkIiwgaSwgYWxnb19vaWQpOwo+ICsg ICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25lckluZm9zOwo+ICsgICAgICAgIH0KPiArCj4gKyAg ICAgIHNpX3NpZ19wYXRoID0gZ3J1Yl94YXNwcmludGYgKCJzaWduZXJJbmZvcy4/JWQuc2lnbmF0 dXJlIiwgaSArIAo+IDEpOwo+ICsgICAgICBpZiAoIXNpX3NpZ19wYXRoKQo+ICsgICAgICAgIHsK PiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIHBhdGggZm9y IHNpZ25lciAlZCdzCj4gc2lnbmF0dXJlIHBhcnNpbmcgcGF0aCIsIGkpOwo+ICsgICAgICAgICAg Z290byBjbGVhbnVwX3NpZ25lckluZm9zOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIHJlc3Vs dF9idWYgPSBncnViX2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKHNpZ25lZF9wYXJ0LCAKPiBzaV9z aWdfcGF0aCwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgInNpZ25hdHVyZSBkYXRhIiwKPiAmcmVzdWx0X3NpemUpOwo+ICsgICAgICBncnViX2ZyZWUg KHNpX3NpZ19wYXRoKTsKPiArCj4gKyAgICAgIGlmICghcmVzdWx0X2J1ZikKPiArICAgICAgICB7 Cj4gKyAgICAgICAgICBlcnIgPSBncnViX2Vycm5vOwo+ICsgICAgICAgICAgZ290byBjbGVhbnVw X3NpZ25lckluZm9zOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGdjcnlfZXJyID0gZ2NyeV9t cGlfc2NhbiAoJihtc2ctPnNpZ25lckluZm9zW2ldLnNpZ19tcGkpLAo+IEdDUllNUElfRk1UX1VT RywKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfYnVmLCByZXN1bHRf c2l6ZSwgTlVMTCk7Cj4gKwo+ICsgICAgICBncnViX2ZyZWUgKHJlc3VsdF9idWYpOwo+ICsKPiAr ICAgICAgaWYgKGdjcnlfZXJyICE9IEdQR19FUlJfTk9fRVJST1IpCj4gKyAgICAgICAgewo+ICsg ICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBsb2FkaW5nIHNpZ25hdHVyZSAlZCBpbnRv IE1QSQo+IHN0cnVjdHVyZTogJWQiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwg Z2NyeV9lcnIpOwo+ICsgICAgICAgICAgZ290byBjbGVhbnVwX3NpZ25lckluZm9zOwo+ICsgICAg ICAgIH0KPiArCj4gKyAgICAgIC8qCj4gKyAgICAgICAqIHVzZSBtc2ctPnNpZ25lckluZm9fY291 bnQgdG8gdHJhY2sgZnVsbHkgcG9wdWxhdGVkIAo+IHNpZ25lckluZm9zIHNvIHdlCj4gKyAgICAg ICAqIGtub3cgaG93IG1hbnkgd2UgbmVlZCB0byBjbGVhbiB1cAo+ICsgICAgICAgKi8KPiArICAg ICAgbXNnLT5zaWduZXJJbmZvX2NvdW50Kys7Cj4gKyAgICB9Cj4gKwo+ICsgIC8qCj4gKyAgICog RmluYWwgY29uc2lzdGVuY3kgY2hlY2sgb2Ygc2lnbmVySW5mby4qLmRpZ2VzdEFsZ29yaXRobSB2 cwo+ICsgICAqIGRpZ2VzdEFsZ29yaXRobXMuKi5hbGdvcml0aG0uIEFuIGFsZ29yaXRobSBtdXN0 IGJlIHByZXNlbnQgaW4gCj4gYm90aAo+ICsgICAqIGRpZ2VzdEFsZ29yaXRobXMgYW5kIHNpZ25l ckluZm8gb3IgaW4gbmVpdGhlci4gV2UgaGF2ZSBhbHJlYWR5IAo+IGNoZWNrZWQKPiArICAgKiBm b3IgYW4gYWxnb3JpdGhtIGluIHNpZ25lckluZm8gdGhhdCBpcyBub3QgaW4gZGlnZXN0QWxnb3Jp dGhtcywgCj4gaGVyZSB3ZQo+ICsgICAqIGNoZWNrIGZvciBhbGdvcml0aG1zIGluIGRpZ2VzdEFs Z29yaXRobXMgYnV0IG5vdCBpbiBzaWduZXJJbmZvcy4KPiArICAgKi8KPiArICBpZiAoc2hhNTEy X2luX2RhICYmICFzaGE1MTJfaW5fc2kpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJy b3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRVUkUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJT SEEtNTEyIHNwZWNpZmllZCBpbiBEaWdlc3RBbGdvcml0aG1zIGJ1dCBkaWQgCj4gbm90ICIKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgImFwcGVhciBpbiBTaWduZXJJbmZvcyIpOwo+ICsgICAg ICBnb3RvIGNsZWFudXBfc2lnbmVySW5mb3M7Cj4gKyAgICB9Cj4gKwo+ICsgIGlmIChzaGEyNTZf aW5fZGEgJiYgIXNoYTI1Nl9pbl9zaSkKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJv ciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIlNI QS0yNTYgc3BlY2lmaWVkIGluIERpZ2VzdEFsZ29yaXRobXMgYnV0IGRpZCAKPiBub3QgIgo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAiYXBwZWFyIGluIFNpZ25lckluZm9zIik7Cj4gKyAgICAg IGdvdG8gY2xlYW51cF9zaWduZXJJbmZvczsKPiArICAgIH0KPiArCj4gKyAgYXNuMV9kZWxldGVf c3RydWN0dXJlICgmc2lnbmVkX3BhcnQpOwo+ICsgIHJldHVybiBHUlVCX0VSUl9OT05FOwo+ICsK PiArY2xlYW51cF9zaWduZXJJbmZvczoKPiArICBmb3IgKGkgPSAwOyBpIDwgbXNnLT5zaWduZXJJ bmZvX2NvdW50OyBpKyspCj4gKyAgICBnY3J5X21waV9yZWxlYXNlIChtc2ctPnNpZ25lckluZm9z W2ldLnNpZ19tcGkpOwo+ICsgIGdydWJfZnJlZSAobXNnLT5zaWduZXJJbmZvcyk7Cj4gK2NsZWFu dXBfc2lnbmVkX3BhcnQ6Cj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmc2lnbmVkX3BhcnQp Owo+ICsgIHJldHVybiBlcnI7Cj4gK30KPiArCj4gK2dydWJfZXJyX3QKPiArcGFyc2VfcGtjczdf c2lnbmVkRGF0YSAoY29uc3Qgdm9pZCAqc2lnYnVmLCBncnViX3NpemVfdCBkYXRhX3NpemUsCj4g c3RydWN0IHBrY3M3X3NpZ25lZERhdGEgKm1zZykKPiArewo+ICsgIGludCByZXM7Cj4gKyAgYXNu MV9ub2RlIGNvbnRlbnRfaW5mbzsKPiArICBncnViX2Vycl90IGVyciA9IEdSVUJfRVJSX05PTkU7 Cj4gKyAgY2hhciBjb250ZW50X29pZFtNQVhfT0lEX0xFTl07Cj4gKyAgZ3J1Yl91aW50OF90ICpj b250ZW50Owo+ICsgIGludCBjb250ZW50X3NpemU7Cj4gKyAgaW50IGNvbnRlbnRfb2lkX3NpemUg PSBzaXplb2YgKGNvbnRlbnRfb2lkKTsKPiArICBpbnQgc2l6ZTsKPiArCj4gKyAgaWYgKGRhdGFf c2l6ZSA+IEdSVUJfSU5UX01BWCkKPiArICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9P VVRfT0ZfUkFOR0UsICJDYW5ub3QgcGFyc2UgYSBQS0NTIzcgCj4gbWVzc2FnZSAiCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgZGF0YSBzaXpl ID4gCj4gSU5UX01BWCIpOwo+ICsgIHNpemUgPSAoaW50KSBkYXRhX3NpemU7Cj4gKwo+ICsgIHJl cyA9IGFzbjFfY3JlYXRlX2VsZW1lbnQgKF9nbnV0bHNfcGtpeF9hc24sCj4gIlBLSVgxLnBrY3Mt Ny1Db250ZW50SW5mbyIsICZjb250ZW50X2luZm8pOwo+ICsgIGlmIChyZXMgIT0gQVNOMV9TVUND RVNTKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09G X01FTU9SWSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIEFT Ti4xIHN0cnVjdHVyZSBmb3IgUEtDUyM3Cj4gZGF0YTogJXMiLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzKSk7Cj4gKyAgICB9Cj4gKwo+ICsgIHJlcyA9IGFz bjFfZGVyX2RlY29kaW5nMiAoJmNvbnRlbnRfaW5mbywgc2lnYnVmLCAmc2l6ZSwKPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiB8Cj4gQVNO MV9ERUNPREVfRkxBR19BTExPV19QQURESU5HLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYXNuMV9lcnJvcik7Cj4gKyAgaWYgKHJlcyAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4g KyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9TSUdOQVRVUkUsCj4gKyAgICAg ICAgICAgICAgICAgICAgICAgICJFcnJvciBkZWNvZGluZyBQS0NTIzcgbWVzc2FnZSBERVI6ICVz IiwgCj4gYXNuMV9lcnJvcik7Cj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPiArICAgIH0KPiArCj4g KyAgLyoKPiArICAgKiBDb250ZW50SW5mbyA6Oj0gU0VRVUVOQ0Ugewo+ICsgICAqICAgICBjb250 ZW50VHlwZSBDb250ZW50VHlwZSwKPiArICAgKiAgICAgY29udGVudCBbMF0gRVhQTElDSVQgQU5Z IERFRklORUQgQlkgY29udGVudFR5cGUgfQo+ICsgICAqCj4gKyAgICogQ29udGVudFR5cGUgOjo9 IE9CSkVDVCBJREVOVElGSUVSCj4gKyAgICovCj4gKyAgcmVzID0gYXNuMV9yZWFkX3ZhbHVlIChj b250ZW50X2luZm8sICJjb250ZW50VHlwZSIsIGNvbnRlbnRfb2lkLAo+ICZjb250ZW50X29pZF9z aXplKTsKPiArICBpZiAocmVzICE9IEFTTjFfU1VDQ0VTUykKPiArICAgIHsKPiArICAgICAgZXJy ID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJR05BVFVSRSwgIkVycm9yIHJlYWRpbmcgUEtD UyM3Cj4gY29udGVudCB0eXBlOiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFf c3RyZXJyb3IgKHJlcykpOwo+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsg IC8qIE9JRCBmb3IgU2lnbmVkRGF0YSBkZWZpbmVkIGluIDUuMSAqLwo+ICsgIGlmIChncnViX3N0 cm5jbXAgKHNpZ25lZERhdGFfb2lkLCBjb250ZW50X29pZCwgY29udGVudF9vaWRfc2l6ZSkgIT0g Cj4gMCkKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX1NJ R05BVFVSRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgY29udGVudCB0 eXBlIGluIFBLQ1MjNyBtZXNzYWdlOgo+IE9JRCAlcyIsIGNvbnRlbnRfb2lkKTsKPiArICAgICAg Z290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICBjb250ZW50ID0gZ3J1Yl9hc24xX2FsbG9j YXRlX2FuZF9yZWFkIChjb250ZW50X2luZm8sICJjb250ZW50IiwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAiUEtDUyM3IG1lc3NhZ2UgY29udGVudCIsCj4gJmNv bnRlbnRfc2l6ZSk7Cj4gKyAgaWYgKCFjb250ZW50KQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBn cnViX2Vycm5vOwo+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIGVyciA9 IHByb2Nlc3NfY29udGVudCAoY29udGVudCwgY29udGVudF9zaXplLCBtc2cpOwo+ICsgIGdydWJf ZnJlZSAoY29udGVudCk7Cj4gKwo+ICtjbGVhbnVwOgo+ICsgIGFzbjFfZGVsZXRlX3N0cnVjdHVy ZSAoJmNvbnRlbnRfaW5mbyk7Cj4gKyAgcmV0dXJuIGVycjsKPiArfQo+ICsKPiArLyoKPiArICog UmVsZWFzZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBQS0NTIzcgbWVzc2Fn ZS4KPiArICogSWYgdGhlIGNhbGxlciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgdGhlIG1lc3NhZ2Us IGl0IG11c3QgZnJlZSBpdC4KPiArICovCj4gK3ZvaWQKPiArcGtjczdfc2lnbmVkRGF0YV9yZWxl YXNlIChzdHJ1Y3QgcGtjczdfc2lnbmVkRGF0YSAqbXNnKQo+ICt7Cj4gKyAgZ3J1Yl9zc2l6ZV90 IGk7Cj4gKwo+ICsgIGZvciAoaSA9IDA7IGkgPCBtc2ctPnNpZ25lckluZm9fY291bnQ7IGkrKykK PiArICAgIHsKPiArICAgICAgZ2NyeV9tcGlfcmVsZWFzZSAobXNnLT5zaWduZXJJbmZvc1tpXS5z aWdfbXBpKTsKPiArICAgIH0KPiArICBncnViX2ZyZWUgKG1zZy0+c2lnbmVySW5mb3MpOwo+ICt9 Cj4gZGlmZiAtLWdpdCBhL2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy94NTA5LmMKPiBi L2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy94NTA5LmMKPiBuZXcgZmlsZSBtb2RlIDEw MDY0NAo+IGluZGV4IDAwMDAwMDAwMC4uZWI5YTFjYTBmCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L2dydWItY29yZS9jb21tYW5kcy9hcHBlbmRlZHNpZy94NTA5LmMKPiBAQCAtMCwwICsxLDk4MSBA QAo+ICsvKgo+ICsgKiAgR1JVQiAgLS0gIEdSYW5kIFVuaWZpZWQgQm9vdGxvYWRlcgo+ICsgKiAg Q29weXJpZ2h0IChDKSAyMDIwLCAyMDIyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgo+ ICsgKiAgQ29weXJpZ2h0IChDKSAyMDIwLCAyMDIyIElCTSBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsg KiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3Ig bW9kaWZ5Cj4gKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCAKPiBieQo+ICsgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKPiArICogIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCj4gKyAqCj4gKyAqICBHUlVCIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCj4gKyAqICBidXQgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgo+ ICsgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF LiAgU2VlIHRoZQo+ICsgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KPiArICoKPiArICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCj4gKyAqICBhbG9uZyB3aXRoIEdSVUIuICBJZiBu b3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCj4gKyAqLwo+ICsKPiArI2lu Y2x1ZGUgPGdydWIvbGlidGFzbjEuaD4KPiArI2luY2x1ZGUgPGdydWIvdHlwZXMuaD4KPiArI2lu Y2x1ZGUgPGdydWIvZXJyLmg+Cj4gKyNpbmNsdWRlIDxncnViL21tLmg+Cj4gKyNpbmNsdWRlIDxn cnViL2NyeXB0by5oPgo+ICsjaW5jbHVkZSA8Z3J1Yi9taXNjLmg+Cj4gKyNpbmNsdWRlIDxncnVi L2djcnlwdC9nY3J5cHQuaD4KPiArCj4gKyNpbmNsdWRlICJhcHBlbmRlZHNpZy5oIgo+ICsKPiAr c3RhdGljIGNoYXIgYXNuMV9lcnJvcltBU04xX01BWF9FUlJPUl9ERVNDUklQVElPTl9TSVpFXTsK PiArCj4gKy8qCj4gKyAqIFJGQyAzMjc5IDIuMy4xICBSU0EgS2V5cwo+ICsgKi8KPiArc3RhdGlj IGNvbnN0IGNoYXIgKnJzYUVuY3J5cHRpb25fb2lkID0gIjEuMi44NDAuMTEzNTQ5LjEuMS4xIjsK PiArCj4gKy8qCj4gKyAqIFJGQyA1MjgwIEFwcGVuZGl4IEEKPiArICovCj4gK3N0YXRpYyBjb25z dCBjaGFyICpjb21tb25OYW1lX29pZCA9ICIyLjUuNC4zIjsKPiArCj4gKy8qCj4gKyAqIFJGQyA1 MjgwIDQuMi4xLjMgS2V5IFVzYWdlCj4gKyAqLwo+ICtzdGF0aWMgY29uc3QgY2hhciAqa2V5VXNh Z2Vfb2lkID0gIjIuNS4yOS4xNSI7Cj4gKwo+ICtzdGF0aWMgY29uc3QgZ3J1Yl91aW50OF90IGRp Z2l0YWxTaWduYXR1cmVVc2FnZSA9IDB4ODA7Cj4gKwo+ICsvKgo+ICsgKiBSRkMgNTI4MCA0LjIu MS45IEJhc2ljIENvbnN0cmFpbnRzCj4gKyAqLwo+ICtzdGF0aWMgY29uc3QgY2hhciAqYmFzaWND b25zdHJhaW50c19vaWQgPSAiMi41LjI5LjE5IjsKPiArCj4gKy8qCj4gKyAqIFJGQyA1MjgwIDQu Mi4xLjEyIEV4dGVuZGVkIEtleSBVc2FnZQo+ICsgKi8KPiArc3RhdGljIGNvbnN0IGNoYXIgKmV4 dGVuZGVkS2V5VXNhZ2Vfb2lkID0gIjIuNS4yOS4zNyI7Cj4gK3N0YXRpYyBjb25zdCBjaGFyICpj b2RlU2lnbmluZ1VzYWdlX29pZCA9ICIxLjMuNi4xLjUuNS43LjMuMyI7Cj4gKwo+ICsvKgo+ICsg KiBSRkMgMzI3OSAyLjMuMQo+ICsgKgo+ICsgKiAgVGhlIFJTQSBwdWJsaWMga2V5IE1VU1QgYmUg ZW5jb2RlZCB1c2luZyB0aGUgQVNOLjEgdHlwZSAKPiBSU0FQdWJsaWNLZXk6Cj4gKyAqCj4gKyAq ICAgICBSU0FQdWJsaWNLZXkgOjo9IFNFUVVFTkNFIHsKPiArICogICAgICAgIG1vZHVsdXMgICAg ICAgICAgICBJTlRFR0VSLCAgICAtLSBuCj4gKyAqICAgICAgICBwdWJsaWNFeHBvbmVudCAgICAg SU5URUdFUiAgfSAgLS0gZQo+ICsgKgo+ICsgKiAgd2hlcmUgbW9kdWx1cyBpcyB0aGUgbW9kdWx1 cyBuLCBhbmQgcHVibGljRXhwb25lbnQgaXMgdGhlIHB1YmxpYwo+ICsgKiAgZXhwb25lbnQgZS4K PiArICovCj4gK3N0YXRpYyBncnViX2Vycl90Cj4gK2dydWJfcGFyc2VfcnNhX3B1YmtleSAoZ3J1 Yl91aW50OF90ICpkZXIsIGludCBkZXJzaXplLCBzdHJ1Y3QKPiB4NTA5X2NlcnRpZmljYXRlICpj ZXJ0aWZpY2F0ZSkKPiArewo+ICsgIGludCByZXN1bHQ7Cj4gKyAgYXNuMV9ub2RlIHNwayA9IE5V TEw7Cj4gKyAgZ3J1Yl91aW50OF90ICptX2RhdGEsICplX2RhdGE7Cj4gKyAgaW50IG1fc2l6ZSwg ZV9zaXplOwo+ICsgIGdydWJfZXJyX3QgZXJyID0gR1JVQl9FUlJfTk9ORTsKPiArICBnY3J5X2Vy cm9yX3QgZ2NyeV9lcnI7Cj4gKwo+ICsgIHJlc3VsdCA9IGFzbjFfY3JlYXRlX2VsZW1lbnQgKF9n bnV0bHNfZ251dGxzX2FzbiwKPiAiR05VVExTLlJTQVB1YmxpY0tleSIsICZzcGspOwo+ICsgIGlm IChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4gZ3J1Yl9l cnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICJDYW5ub3QgY3JlYXRlIHN0b3JhZ2UgZm9yIHB1YmxpYyBrZXkgQVNOLjEgCj4gZGF0YSIpOwo+ ICsgICAgfQo+ICsKPiArICByZXN1bHQgPSBhc24xX2Rlcl9kZWNvZGluZzIgKCZzcGssIGRlciwg JmRlcnNpemUsCj4gQVNOMV9ERUNPREVfRkxBR19TVFJJQ1RfREVSLCBhc24xX2Vycm9yKTsKPiAr ICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1 Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgIkNhbm5vdCBkZWNvZGUgY2VydGlmaWNhdGUgcHVibGljIGtleSBERVI6Cj4gJXMiLCBhc24x X2Vycm9yKTsKPiArICAgICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICBtX2RhdGEg PSBncnViX2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKHNwaywgIm1vZHVsdXMiLCAiUlNBCj4gbW9k dWx1cyIsICZtX3NpemUpOwo+ICsgIGlmICghbV9kYXRhKQo+ICsgICAgewo+ICsgICAgICBlcnIg PSBncnViX2Vycm5vOwo+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIGVf ZGF0YSA9IGdydWJfYXNuMV9hbGxvY2F0ZV9hbmRfcmVhZCAoc3BrLCAicHVibGljRXhwb25lbnQi LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJTQSBwdWJsaWMg ZXhwb25lbnQiLCAKPiAmZV9zaXplKTsKPiArICBpZiAoIWVfZGF0YSkKPiArICAgIHsKPiArICAg ICAgZXJyID0gZ3J1Yl9lcnJubzsKPiArICAgICAgZ290byBjbGVhbnVwX21fZGF0YTsKPiArICAg IH0KPiArCj4gKyAgLyoKPiArICAgKiBjb252ZXJ0IG0sIGUgdG8gbXBpCj4gKyAgICoKPiArICAg KiBuc2Nhbm5lZCBpcyBub3Qgc2V0IGZvciBGTVRfVVNHLCBpdCdzIG9ubHkgc2V0IGZvciBGTVRf UEdQLAo+ICsgICAqIHNvIHdlIGNhbid0IHZlcmlmeSBpdAo+ICsgICAqLwo+ICsgIGdjcnlfZXJy ID0gZ2NyeV9tcGlfc2NhbiAoJmNlcnRpZmljYXRlLT5tcGlzWzBdLCBHQ1JZTVBJX0ZNVF9VU0cs Cj4gbV9kYXRhLCBtX3NpemUsIE5VTEwpOwo+ICsgIGlmIChnY3J5X2VyciAhPSBHUEdfRVJSX05P X0VSUk9SKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURf RklMRV9UWVBFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbG9hZGluZyBSU0Eg bW9kdWx1cyBpbnRvIE1QSQo+IHN0cnVjdHVyZTogJWQiLCBnY3J5X2Vycik7Cj4gKyAgICAgIGdv dG8gY2xlYW51cF9lX2RhdGE7Cj4gKyAgICB9Cj4gKwo+ICsgIGdjcnlfZXJyID0gZ2NyeV9tcGlf c2NhbiAoJmNlcnRpZmljYXRlLT5tcGlzWzFdLCBHQ1JZTVBJX0ZNVF9VU0csCj4gZV9kYXRhLCBl X3NpemUsIE5VTEwpOwo+ICsgIGlmIChnY3J5X2VyciAhPSBHUEdfRVJSX05PX0VSUk9SKQo+ICsg ICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgbG9hZGluZyBSU0EgZXhwb25lbnQgaW50 byBNUEkKPiBzdHJ1Y3R1cmU6ICVkIiwgZ2NyeV9lcnIpOwo+ICsgICAgICBnb3RvIGNsZWFudXBf bV9tcGk7Cj4gKyAgICB9Cj4gKwo+ICsgIGdydWJfZnJlZSAoZV9kYXRhKTsKPiArICBncnViX2Zy ZWUgKG1fZGF0YSk7Cj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmc3BrKTsKPiArICByZXR1 cm4gR1JVQl9FUlJfTk9ORTsKPiArCj4gK2NsZWFudXBfbV9tcGk6Cj4gKyAgZ2NyeV9tcGlfcmVs ZWFzZSAoY2VydGlmaWNhdGUtPm1waXNbMF0pOwo+ICtjbGVhbnVwX2VfZGF0YToKPiArICBncnVi X2ZyZWUgKGVfZGF0YSk7Cj4gK2NsZWFudXBfbV9kYXRhOgo+ICsgIGdydWJfZnJlZSAobV9kYXRh KTsKPiArY2xlYW51cDoKPiArICBhc24xX2RlbGV0ZV9zdHJ1Y3R1cmUgKCZzcGspOwo+ICsgIHJl dHVybiBlcnI7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFJGQyA1MjgwOgo+ICsgKiAgIFN1YmplY3RQ dWJsaWNLZXlJbmZvICA6Oj0gIFNFUVVFTkNFICB7Cj4gKyAqICAgICAgIGFsZ29yaXRobSAgICAg ICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCj4gKyAqICAgICAgIHN1YmplY3RQdWJsaWNLZXkg ICAgIEJJVCBTVFJJTkcgIH0KPiArICoKPiArICogQWxnb3JpdGhtSWRlbnRpZmllcnMgY29tZSBm cm9tIFJGQyAzMjc5LCB3ZSBhcmUgbm90IHN0cmljdGx5IAo+IGNvbXBpbGFudCBhcyB3ZQo+ICsg KiBvbmx5IHN1cHBvcnQgUlNBIEVuY3J5cHRpb24uCj4gKyAqLwo+ICsKPiArc3RhdGljIGdydWJf ZXJyX3QKPiArZ3J1Yl94NTA5X3JlYWRfc3ViamVjdF9wdWJsaWNfa2V5IChhc24xX25vZGUgYXNu LCBzdHJ1Y3QKPiB4NTA5X2NlcnRpZmljYXRlICpyZXN1bHRzKQo+ICt7Cj4gKyAgaW50IHJlc3Vs dDsKPiArICBncnViX2Vycl90IGVycjsKPiArICBjb25zdCBjaGFyICphbGdvX25hbWUgPQo+ICsg ICAgICAgICAgInRic0NlcnRpZmljYXRlLnN1YmplY3RQdWJsaWNLZXlJbmZvLmFsZ29yaXRobS5h bGdvcml0aG0iOwo+ICsgIGNvbnN0IGNoYXIgKnBhcmFtc19uYW1lID0KPiArICAgICAgICAgICJ0 YnNDZXJ0aWZpY2F0ZS5zdWJqZWN0UHVibGljS2V5SW5mby5hbGdvcml0aG0ucGFyYW1ldGVycyI7 Cj4gKyAgY29uc3QgY2hhciAqcGtfbmFtZSA9IAo+ICJ0YnNDZXJ0aWZpY2F0ZS5zdWJqZWN0UHVi bGljS2V5SW5mby5zdWJqZWN0UHVibGljS2V5IjsKPiArICBjaGFyIGFsZ29fb2lkW01BWF9PSURf TEVOXTsKPiArICBpbnQgYWxnb19zaXplID0gc2l6ZW9mIChhbGdvX29pZCk7Cj4gKyAgY2hhciBw YXJhbXNfdmFsdWVbMl07Cj4gKyAgaW50IHBhcmFtc19zaXplID0gc2l6ZW9mIChwYXJhbXNfdmFs dWUpOwo+ICsgIGdydWJfdWludDhfdCAqa2V5X2RhdGEgPSBOVUxMOwo+ICsgIGludCBrZXlfc2l6 ZSA9IDA7Cj4gKyAgdW5zaWduZWQgaW50IGtleV90eXBlOwo+ICsKPiArICAvKiBhbGdvcml0aG06 IHNlZSBub3RlcyBmb3IgcnNhRW5jcnlwdGlvbl9vaWQgKi8KPiArICByZXN1bHQgPSBhc24xX3Jl YWRfdmFsdWUgKGFzbiwgYWxnb19uYW1lLCBhbGdvX29pZCwgJmFsZ29fc2l6ZSk7Cj4gKyAgaWYg KHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZyB4NTA5Cj4gcHVibGlj IGtleSBhbGdvcml0aG06ICVzIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3Ry ZXJyb3IgKHJlc3VsdCkpOwo+ICsgICAgfQo+ICsKPiArICBpZiAoZ3J1Yl9zdHJuY21wIChhbGdv X29pZCwgcnNhRW5jcnlwdGlvbl9vaWQsIHNpemVvZgo+IChyc2FFbmNyeXB0aW9uX29pZCkpICE9 IDApCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9OT1RfSU1Q TEVNRU5URURfWUVULAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHg1 MDkgcHVibGljIGtleSBhbGdvcml0aG06ICVzIiwKPiBhbGdvX29pZCk7Cj4gKyAgICB9Cj4gKwo+ ICsgIC8qCj4gKyAgICogUkZDIDMyNzkgMi4zLjEKPiArICAgKiBUaGUgcnNhRW5jcnlwdGlvbiBP SUQgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGUgYWxnb3JpdGhtIAo+IGZpZWxkCj4gKyAg ICogb2YgYSB2YWx1ZSBvZiB0eXBlIEFsZ29yaXRobUlkZW50aWZpZXIuICBUaGUgcGFyYW1ldGVy cyBmaWVsZCAKPiBNVVNUCj4gKyAgICogaGF2ZSBBU04uMSB0eXBlIE5VTEwgZm9yIHRoaXMgYWxn b3JpdGhtIGlkZW50aWZpZXIuCj4gKyAgICovCj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVl IChhc24sIHBhcmFtc19uYW1lLCBwYXJhbXNfdmFsdWUsIAo+ICZwYXJhbXNfc2l6ZSk7Cj4gKyAg aWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnVi X2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZyB4NTA5Cj4gcHVi bGljIGtleSBwYXJhbWV0ZXJzOiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBhc24x X3N0cmVycm9yIChyZXN1bHQpKTsKPiArICAgIH0KPiArCj4gKyAgaWYgKHBhcmFtc192YWx1ZVsw XSAhPSBBU04xX1RBR19OVUxMKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZh bGlkIHg1MDkgcHVibGljIGtleSBwYXJhbWV0ZXJzOiBleHBlY3RlZCAKPiBOVUxMIik7Cj4gKyAg ICB9Cj4gKwo+ICsgIC8qCj4gKyAgICogUkZDIDMyNzkgMi4zLjE6ICBUaGUgREVSIGVuY29kZWQg UlNBUHVibGljS2V5IGlzIHRoZSB2YWx1ZSBvZiB0aGUgCj4gQklUCj4gKyAgICogU1RSSU5HIHN1 YmplY3RQdWJsaWNLZXkuCj4gKyAgICovCj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlX3R5 cGUgKGFzbiwgcGtfbmFtZSwgTlVMTCwgJmtleV9zaXplLCAKPiAma2V5X3R5cGUpOwo+ICsgIGlm IChyZXN1bHQgIT0gQVNOMV9NRU1fRVJST1IpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnVi X2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZyBzaXplCj4gb2Yg eDUwOSBwdWJsaWMga2V5OiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0 cmVycm9yIChyZXN1bHQpKTsKPiArICAgIH0KPiArICBpZiAoa2V5X3R5cGUgIT0gQVNOMV9FVFlQ RV9CSVRfU1RSSU5HKQo+ICsgICAgewo+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9F UlJfQkFEX0ZJTEVfVFlQRSwgIlVuZXhwZWN0ZWQgQVNOLjEKPiB0eXBlIHdoZW4gcmVhZGluZyB4 NTA5IHB1YmxpYyBrZXk6ICV4IiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBl KTsKPiArICAgIH0KPiArCj4gKyAgLyogbGVuZ3RoIGlzIGluIGJpdHMgKi8KPiArICBrZXlfc2l6 ZSA9IChrZXlfc2l6ZSArIDcpIC8gODsKPiArCj4gKyAga2V5X2RhdGEgPSBncnViX21hbGxvYyAo a2V5X3NpemUpOwo+ICsgIGlmICgha2V5X2RhdGEpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBn cnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgIk91dCBvZiBtZW1vcnkgZm9yIHg1MDkgcHVibGljIGtleSIpOwo+ICsgICAgfQo+ICsK PiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKGFzbiwgcGtfbmFtZSwga2V5X2RhdGEsICZr ZXlfc2l6ZSk7Cj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAg ICAgIGdydWJfZnJlZSAoa2V5X2RhdGEpOwo+ICsgICAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JV Ql9FUlJfQkFEX0ZJTEVfVFlQRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBy ZWFkaW5nIHB1YmxpYyBrZXkgZGF0YSIpOwo+ICsgICAgfQo+ICsgIGtleV9zaXplID0gKGtleV9z aXplICsgNykgLyA4Owo+ICsKPiArICBlcnIgPSBncnViX3BhcnNlX3JzYV9wdWJrZXkgKGtleV9k YXRhLCBrZXlfc2l6ZSwgcmVzdWx0cyk7Cj4gKyAgZ3J1Yl9mcmVlIChrZXlfZGF0YSk7Cj4gKwo+ ICsgIHJldHVybiBlcnI7Cj4gK30KPiArCj4gKy8qIERlY29kZSBhIHN0cmluZyBhcyBkZWZpbmVk IGluIEFwcGVuZGl4IEEgKi8KPiArc3RhdGljIGdydWJfZXJyX3QKPiArZGVjb2RlX3N0cmluZyAo Y2hhciAqZGVyLCBpbnQgZGVyX3NpemUsIGNoYXIgKipzdHJpbmcsIGdydWJfc2l6ZV90Cj4gKnN0 cmluZ19zaXplKQo+ICt7Cj4gKyAgYXNuMV9ub2RlIHN0cmFzbjsKPiArICBpbnQgcmVzdWx0Owo+ ICsgIGNoYXIgKmNob2ljZTsKPiArICBpbnQgY2hvaWNlX3NpemUgPSAwOwo+ICsgIGludCB0bXBf c2l6ZSA9IDA7Cj4gKyAgZ3J1Yl9lcnJfdCBlcnIgPSBHUlVCX0VSUl9OT05FOwo+ICsKPiArICBy ZXN1bHQgPSBhc24xX2NyZWF0ZV9lbGVtZW50IChfZ251dGxzX3BraXhfYXNuLAo+ICJQS0lYMS5E aXJlY3RvcnlTdHJpbmciLCAmc3RyYXNuKTsKPiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VT UykKPiArICAgIHsKPiArICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9N RU1PUlksCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBBU04u MSBzdHJ1Y3R1cmUgZm9yCj4gY2VydGlmaWNhdGU6ICVzIiwKPiArICAgICAgICAgICAgICAgICAg ICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+ICsgICAgfQo+ICsKPiArICByZXN1bHQg PSBhc24xX2Rlcl9kZWNvZGluZzIgKCZzdHJhc24sIGRlciwgJmRlcl9zaXplLAo+IEFTTjFfREVD T0RFX0ZMQUdfU1RSSUNUX0RFUiwgYXNuMV9lcnJvcik7Cj4gKyAgaWYgKHJlc3VsdCAhPSBBU04x X1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JB RF9GSUxFX1RZUEUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2Ug REVSIGZvciBEaXJlY3RvcnlTdHJpbmc6Cj4gJXMiLCBhc24xX2Vycm9yKTsKPiArICAgICAgZ290 byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICBjaG9pY2UgPSBncnViX2FzbjFfYWxsb2NhdGVf YW5kX3JlYWQgKHN0cmFzbiwgIiIsICJEaXJlY3RvcnlTdHJpbmcKPiBjaG9pY2UiLCAmY2hvaWNl X3NpemUpOwo+ICsgIGlmICghY2hvaWNlKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vy cm5vOwo+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIGlmIChncnViX3N0 cm5jbXAgKCJ1dGY4U3RyaW5nIiwgY2hvaWNlLCBjaG9pY2Vfc2l6ZSkgPT0gMCkKPiArICAgIHsK PiArICAgICAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVlIChzdHJhc24sICJ1dGY4U3RyaW5nIiwg TlVMTCwgCj4gJnRtcF9zaXplKTsKPiArICAgICAgaWYgKHJlc3VsdCAhPSBBU04xX01FTV9FUlJP UikKPiArICAgICAgICB7Cj4gKyAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9C QURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZwo+IHNpemUgb2YgVVRGLTggc3RyaW5nOiAlcyIs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsK PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9jaG9pY2U7Cj4gKyAgICAgICAgfQo+ICsgICAgfQo+ ICsgIGVsc2UgaWYgKGdydWJfc3RybmNtcCAoInByaW50YWJsZVN0cmluZyIsIGNob2ljZSwgY2hv aWNlX3NpemUpID09IDApCj4gKyAgICB7Cj4gKyAgICAgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1 ZSAoc3RyYXNuLCAicHJpbnRhYmxlU3RyaW5nIiwgTlVMTCwgCj4gJnRtcF9zaXplKTsKPiArICAg ICAgaWYgKHJlc3VsdCAhPSBBU04xX01FTV9FUlJPUikKPiArICAgICAgICB7Cj4gKyAgICAgICAg ICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGlu Zwo+IHNpemUgb2YgVVRGLTggc3RyaW5nOiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsKPiArICAgICAgICAgIGdvdG8gY2xlYW51cF9j aG9pY2U7Cj4gKyAgICAgICAgfQo+ICsgICAgfQo+ICsgIGVsc2UKPiArICAgIHsKPiArICAgICAg ZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfTk9UX0lNUExFTUVOVEVEX1lFVCwgIk9ubHkgVVRG LTggYW5kCj4gcHJpbnRhYmxlIERpcmVjdG9yeVN0cmluZ3MgYXJlIHN1cHBvcnRlZCwgZ290ICVz IiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlKTsKPiArICAgICAgZ290byBjbGVh bnVwX2Nob2ljZTsKPiArICAgIH0KPiArCj4gKyAgLyogcmVhZCBzaXplIGRvZXMgbm90IGluY2x1 ZGUgdHJhaWxpbmcgbnVsbCAqLwo+ICsgIHRtcF9zaXplKys7Cj4gKwo+ICsgICpzdHJpbmcgPSBn cnViX21hbGxvYyAodG1wX3NpemUpOwo+ICsgIGlmICghKnN0cmluZykKPiArICAgIHsKPiArICAg ICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIERpcmVjdG9yeVN0cmlu ZyAKPiBjb250ZW50cyIpOwo+ICsgICAgICBnb3RvIGNsZWFudXBfY2hvaWNlOwo+ICsgICAgfQo+ ICsKPiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKHN0cmFzbiwgY2hvaWNlLCAqc3RyaW5n LCAmdG1wX3NpemUpOwo+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3Ig cmVhZGluZyBvdXQgJXMKPiBpbiBEaXJlY3RvcnlTdHJpbmc6ICVzIiwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgY2hvaWNlLCBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsKPiArICAgICAgZ3J1 Yl9mcmVlICgqc3RyaW5nKTsKPiArICAgICAgZ290byBjbGVhbnVwX2Nob2ljZTsKPiArICAgIH0K PiArICAqc3RyaW5nX3NpemUgPSB0bXBfc2l6ZSArIDE7Cj4gKyAgKCpzdHJpbmcpW3RtcF9zaXpl XSA9ICdcMCc7Cj4gKwo+ICtjbGVhbnVwX2Nob2ljZToKPiArICBncnViX2ZyZWUgKGNob2ljZSk7 Cj4gK2NsZWFudXA6Cj4gKyAgYXNuMV9kZWxldGVfc3RydWN0dXJlICgmc3RyYXNuKTsKPiArICBy ZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUQlNDZXJ0aWZpY2F0ZSAgOjo9ICBTRVFV RU5DRSAgewo+ICsgKiAgICAgICB2ZXJzaW9uICAgICAgICAgWzBdICBFWFBMSUNJVCBWZXJzaW9u IERFRkFVTFQgdjEsCj4gKyAqIC4uLgo+ICsgKgo+ICsgKiBWZXJzaW9uICA6Oj0gIElOVEVHRVIg IHsgIHYxKDApLCB2MigxKSwgdjMoMikgIH0KPiArICovCj4gK3N0YXRpYyBncnViX2Vycl90Cj4g K2NoZWNrX3ZlcnNpb24gKGFzbjFfbm9kZSBjZXJ0aWZpY2F0ZSkKPiArewo+ICsgIGludCByYzsK PiArICBjb25zdCBjaGFyICpuYW1lID0gInRic0NlcnRpZmljYXRlLnZlcnNpb24iOwo+ICsgIGdy dWJfdWludDhfdCB2ZXJzaW9uOwo+ICsgIGludCBsZW4gPSBzaXplb2YgKHZlcnNpb24pOwo+ICsK PiArICByYyA9IGFzbjFfcmVhZF92YWx1ZSAoY2VydGlmaWNhdGUsIG5hbWUsICZ2ZXJzaW9uLCAm bGVuKTsKPiArCj4gKyAgLyogcmVxdWlyZSB2ZXJzaW9uIDMgKi8KPiArICBpZiAocmMgIT0gQVNO MV9TVUNDRVNTIHx8IGxlbiAhPSAxKQo+ICsgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJS X0JBRF9GSUxFX1RZUEUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcg Y2VydGlmaWNhdGUgdmVyc2lvbiIpOwo+ICsKPiArICBpZiAodmVyc2lvbiAhPSAweDAyKQo+ICsg ICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJJbnZhbGlkIHg1 MDkKPiBjZXJ0aWZpY2F0ZSB2ZXJzaW9uLCBleHBlY3RlZCB2MyAoMHgwMiksIGdvdCAweCUwMngi LAo+ICsgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24pOwo+ICsKPiArICByZXR1cm4gR1JV Ql9FUlJfTk9ORTsKPiArfQo+ICsKPiArLyoKPiArICogVGhpcyBpcyBhbiBYLjUwMSBOYW1lLCB3 aGljaCBpcyBjb21wbGV4Lgo+ICsgKgo+ICsgKiBGb3Igc2ltcGxpY2l0eSwgd2UgZXh0cmFjdCBv bmx5IHRoZSBDTi4KPiArICovCj4gK3N0YXRpYyBncnViX2Vycl90Cj4gK3JlYWRfbmFtZSAoYXNu MV9ub2RlIGFzbiwgY29uc3QgY2hhciAqbmFtZV9wYXRoLCBjaGFyICoqbmFtZSwKPiBncnViX3Np emVfdCAqbmFtZV9zaXplKQo+ICt7Cj4gKyAgaW50IHNlcV9jb21wb25lbnRzLCBzZXRfY29tcG9u ZW50czsKPiArICBpbnQgcmVzdWx0Owo+ICsgIGludCBpLCBqOwo+ICsgIGNoYXIgKnRvcF9wYXRo LCAqc2V0X3BhdGgsICp0eXBlX3BhdGgsICp2YWxfcGF0aDsKPiArICBjaGFyIHR5cGVbTUFYX09J RF9MRU5dOwo+ICsgIGludCB0eXBlX2xlbiA9IHNpemVvZiAodHlwZSk7Cj4gKyAgaW50IHN0cmlu Z19zaXplID0gMDsKPiArICBjaGFyICpzdHJpbmdfZGVyOwo+ICsgIGdydWJfZXJyX3QgZXJyOwo+ ICsKPiArICAqbmFtZSA9IE5VTEw7Cj4gKwo+ICsgIHRvcF9wYXRoID0gZ3J1Yl94YXNwcmludGYg KCIlcy5yZG5TZXF1ZW5jZSIsIG5hbWVfcGF0aCk7Cj4gKyAgaWYgKCF0b3BfcGF0aCkKPiArICAg IHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICJDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciAlcyBuYW1lIHBhcnNp bmcKPiBwYXRoIiwgbmFtZV9wYXRoKTsKPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9udW1iZXJfb2Zf ZWxlbWVudHMgKGFzbiwgdG9wX3BhdGgsICZzZXFfY29tcG9uZW50cyk7Cj4gKyAgaWYgKHJlc3Vs dCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdS VUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciBjb3VudGluZyBuYW1lCj4gY29tcG9uZW50czog JXMiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsK PiArICAgICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICBmb3IgKGkgPSAxOyBpIDw9 IHNlcV9jb21wb25lbnRzOyBpKyspCj4gKyAgICB7Cj4gKyAgICAgIHNldF9wYXRoID0gZ3J1Yl94 YXNwcmludGYgKCIlcy4/JWQiLCB0b3BfcGF0aCwgaSk7Cj4gKyAgICAgIGlmICghc2V0X3BhdGgp Cj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VU X09GX01FTU9SWSwgIkNvdWxkIG5vdAo+IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgbmFtZSBzZXQg cGFyc2luZyBwYXRoIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcGF0aCk7 Cj4gKyAgICAgICAgICBnb3RvIGNsZWFudXBfc2V0Owo+ICsgICAgICAgIH0KPiArICAgICAgLyog dGhpcyBicmluZ3MgdXMsIGhvcGVmdWxseSwgdG8gYSBzZXQgKi8KPiArICAgICAgcmVzdWx0ID0g YXNuMV9udW1iZXJfb2ZfZWxlbWVudHMgKGFzbiwgc2V0X3BhdGgsIAo+ICZzZXRfY29tcG9uZW50 cyk7Cj4gKyAgICAgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgICAgIHsKPiAr ICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJv ciBjb3VudGluZwo+IG5hbWUgc3ViLWNvbXBvbmVudHMgY29tcG9uZW50cyAoZWxlbWVudCAlZCk6 ICVzIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGFzbjFfc3RyZXJyb3IgKHJl c3VsdCkpOwo+ICsgICAgICAgICAgZ290byBjbGVhbnVwX3NldDsKPiArICAgICAgICB9Cj4gKyAg ICAgIGZvciAoaiA9IDE7IGogPD0gc2V0X2NvbXBvbmVudHM7IGorKykKPiArICAgICAgICB7Cj4g KyAgICAgICAgICB0eXBlX3BhdGggPSBncnViX3hhc3ByaW50ZiAoIiVzLj8lZC4/JWQudHlwZSIs IHRvcF9wYXRoLCBpLCAKPiBqKTsKPiArICAgICAgICAgIGlmICghdHlwZV9wYXRoKQo+ICsgICAg ICAgICAgICB7Cj4gKyAgICAgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VU X09GX01FTU9SWSwgIkNvdWxkIG5vdAo+IGFsbG9jYXRlIG1lbW9yeSBmb3IgJXMgbmFtZSBjb21w b25lbnQgdHlwZSBwYXRoIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1l X3BhdGgpOwo+ICsgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9zZXQ7Cj4gKyAgICAgICAgICAg IH0KPiArICAgICAgICAgIHR5cGVfbGVuID0gc2l6ZW9mICh0eXBlKTsKPiArICAgICAgICAgIHJl c3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAoYXNuLCB0eXBlX3BhdGgsIHR5cGUsICZ0eXBlX2xlbik7 Cj4gKyAgICAgICAgICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPiArICAgICAgICAgICAg ewo+ICsgICAgICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZ UEUsICJFcnJvcgo+IHJlYWRpbmcgJXMgbmFtZSBjb21wb25lbnQgdHlwZTogJXMiLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcGF0aCwgYXNuMV9zdHJlcnJvciAocmVz dWx0KSk7Cj4gKyAgICAgICAgICAgICAgZ290byBjbGVhbnVwX3R5cGU7Cj4gKyAgICAgICAgICAg IH0KPiArCj4gKyAgICAgICAgICBpZiAoZ3J1Yl9zdHJuY21wICh0eXBlLCBjb21tb25OYW1lX29p ZCwgdHlwZV9sZW4pICE9IDApCj4gKyAgICAgICAgICAgIHsKPiArICAgICAgICAgICAgICBncnVi X2ZyZWUgKHR5cGVfcGF0aCk7Cj4gKyAgICAgICAgICAgICAgY29udGludWU7Cj4gKyAgICAgICAg ICAgIH0KPiArCj4gKyAgICAgICAgICB2YWxfcGF0aCA9IGdydWJfeGFzcHJpbnRmICgiJXMuPyVk Lj8lZC52YWx1ZSIsIHRvcF9wYXRoLCBpLCAKPiBqKTsKPiArICAgICAgICAgIGlmICghdmFsX3Bh dGgpCj4gKyAgICAgICAgICAgIHsKPiArICAgICAgICAgICAgICBlcnIgPSBncnViX2Vycm9yIChH UlVCX0VSUl9PVVRfT0ZfTUVNT1JZLCAiQ291bGQgbm90Cj4gYWxsb2NhdGUgbWVtb3J5IGZvciAl cyBuYW1lIGNvbXBvbmVudCB2YWx1ZSBwYXRoIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBuYW1lX3BhdGgpOwo+ICsgICAgICAgICAgICAgIGdvdG8gY2xlYW51cF9zZXQ7Cj4g KyAgICAgICAgICAgIH0KPiArCj4gKyAgICAgICAgICBzdHJpbmdfZGVyID0gZ3J1Yl9hc24xX2Fs bG9jYXRlX2FuZF9yZWFkIChhc24sIHZhbF9wYXRoLAo+IG5hbWVfcGF0aCwgJnN0cmluZ19zaXpl KTsKPiArICAgICAgICAgIGlmICghc3RyaW5nX2RlcikKPiArICAgICAgICAgICAgewo+ICsgICAg ICAgICAgICAgIGVyciA9IGdydWJfZXJybm87Cj4gKyAgICAgICAgICAgICAgZ290byBjbGVhbnVw X3ZhbF9wYXRoOwo+ICsgICAgICAgICAgICB9Cj4gKwo+ICsgICAgICAgICAgZXJyID0gZGVjb2Rl X3N0cmluZyAoc3RyaW5nX2Rlciwgc3RyaW5nX3NpemUsIG5hbWUsIAo+IG5hbWVfc2l6ZSk7Cj4g KyAgICAgICAgICBpZiAoZXJyKQo+ICsgICAgICAgICAgICBnb3RvIGNsZWFudXBfc3RyaW5nOwo+ ICsKPiArICAgICAgICAgIGdydWJfZnJlZSAoc3RyaW5nX2Rlcik7Cj4gKyAgICAgICAgICBncnVi X2ZyZWUgKHR5cGVfcGF0aCk7Cj4gKyAgICAgICAgICBncnViX2ZyZWUgKHZhbF9wYXRoKTsKPiAr ICAgICAgICAgIGJyZWFrOwo+ICsgICAgICAgIH0KPiArICAgICAgZ3J1Yl9mcmVlIChzZXRfcGF0 aCk7Cj4gKwo+ICsgICAgICBpZiAoKm5hbWUpCj4gKyAgICAgICAgYnJlYWs7Cj4gKyAgICB9Cj4g Kwo+ICsgIGdydWJfZnJlZSAodG9wX3BhdGgpOwo+ICsKPiArICByZXR1cm4gR1JVQl9FUlJfTk9O RTsKPiArCj4gK2NsZWFudXBfc3RyaW5nOgo+ICsgIGdydWJfZnJlZSAoc3RyaW5nX2Rlcik7Cj4g K2NsZWFudXBfdmFsX3BhdGg6Cj4gKyAgZ3J1Yl9mcmVlICh2YWxfcGF0aCk7Cj4gK2NsZWFudXBf dHlwZToKPiArICBncnViX2ZyZWUgKHR5cGVfcGF0aCk7Cj4gK2NsZWFudXBfc2V0Ogo+ICsgIGdy dWJfZnJlZSAoc2V0X3BhdGgpOwo+ICtjbGVhbnVwOgo+ICsgIGdydWJfZnJlZSAodG9wX3BhdGgp Owo+ICsgIHJldHVybiBlcnI7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFZlcmlmeSB0aGUgS2V5IFVz YWdlIGV4dGVuc2lvbi4KPiArICogV2UgcmVxdWlyZSB0aGUgRGlnaXRhbCBzaWduYXR1cmUgdXNh Z2UuCj4gKyAqLwo+ICtzdGF0aWMgZ3J1Yl9lcnJfdAo+ICt2ZXJpZnlfa2V5X3VzYWdlIChncnVi X3VpbnQ4X3QgKnZhbHVlLCBpbnQgdmFsdWVfc2l6ZSkKPiArewo+ICsgIGFzbjFfbm9kZSB1c2Fn ZWFzbjsKPiArICBpbnQgcmVzdWx0Owo+ICsgIGdydWJfZXJyX3QgZXJyID0gR1JVQl9FUlJfTk9O RTsKPiArICBncnViX3VpbnQ4X3QgdXNhZ2UgPSAweGZmOwo+ICsgIGludCB1c2FnZV9zaXplID0g c2l6ZW9mICh1c2FnZV9zaXplKTsKPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9jcmVhdGVfZWxlbWVu dCAoX2dudXRsc19wa2l4X2FzbiwgIlBLSVgxLktleVVzYWdlIiwgCj4gJnVzYWdlYXNuKTsKPiAr ICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPiArICAgIHsKPiArICAgICAgcmV0dXJuIGdy dWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlksCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAiQ291bGQgbm90IGNyZWF0ZSBBU04uMSBzdHJ1Y3R1cmUgZm9yIGtleSAKPiB1c2FnZSIp Owo+ICsgICAgfQo+ICsKPiArICByZXN1bHQgPSBhc24xX2Rlcl9kZWNvZGluZzIgKCZ1c2FnZWFz biwgdmFsdWUsICZ2YWx1ZV9zaXplLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg QVNOMV9ERUNPREVfRkxBR19TVFJJQ1RfREVSLCAKPiBhc24xX2Vycm9yKTsKPiArICBpZiAocmVz dWx0ICE9IEFTTjFfU1VDQ0VTUykKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAo R1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9y IHBhcnNpbmcgREVSIGZvciBLZXkgVXNhZ2U6ICVzIiwgCj4gYXNuMV9lcnJvcik7Cj4gKyAgICAg IGdvdG8gY2xlYW51cDsKPiArICAgIH0KPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9yZWFkX3ZhbHVl ICh1c2FnZWFzbiwgIiIsICZ1c2FnZSwgJnVzYWdlX3NpemUpOwo+ICsgIGlmIChyZXN1bHQgIT0g QVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICBlcnIgPSBncnViX2Vycm9yIChHUlVCX0VS Ul9CQURfRklMRV9UWVBFLCAiRXJyb3IgcmVhZGluZyBLZXkKPiBVc2FnZSB2YWx1ZTogJXMiLAo+ ICsgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsKPiArICAg ICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICBpZiAoISh1c2FnZSAmIGRpZ2l0YWxT aWduYXR1cmVVc2FnZSkpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJf RVJSX0JBRF9GSUxFX1RZUEUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICJLZXkgVXNhZ2Ug KDB4JXgpIG1pc3NpbmcgRGlnaXRhbCBTaWduYXR1cmUKPiB1c2FnZSIsIHVzYWdlKTsKPiArICAg ICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArY2xlYW51cDoKPiArICBhc24xX2RlbGV0 ZV9zdHJ1Y3R1cmUgKCZ1c2FnZWFzbik7Cj4gKyAgcmV0dXJuIGVycjsKPiArfQo+ICsKPiArLyoK PiArICogQmFzaWNDb25zdHJhaW50cyA6Oj0gU0VRVUVOQ0Ugewo+ICsgKiAgICAgICBjQSAgICAg ICAgICAgICAgICAgICAgICBCT09MRUFOIERFRkFVTFQgRkFMU0UsCj4gKyAqICAgICAgIHBhdGhM ZW5Db25zdHJhaW50ICAgICAgIElOVEVHRVIgKDAuLk1BWCkgT1BUSU9OQUwgfQo+ICsgKi8KPiAr c3RhdGljIGdydWJfZXJyX3QKPiArdmVyaWZ5X2Jhc2ljX2NvbnN0cmFpbnRzIChncnViX3VpbnQ4 X3QgKnZhbHVlLCBpbnQgdmFsdWVfc2l6ZSkKPiArewo+ICsgIGFzbjFfbm9kZSBiYXNpY2FzbjsK PiArICBpbnQgcmVzdWx0Owo+ICsgIGdydWJfZXJyX3QgZXJyID0gR1JVQl9FUlJfTk9ORTsKPiAr ICBjaGFyIGNBWzZdOyAvKiBGQUxTRSBvciBUUlVFICovCj4gKyAgaW50IGNBX3NpemUgPSBzaXpl b2YgKGNBKTsKPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9jcmVhdGVfZWxlbWVudCAoX2dudXRsc19w a2l4X2FzbiwKPiAiUEtJWDEuQmFzaWNDb25zdHJhaW50cyIsICZiYXNpY2Fzbik7Cj4gKyAgaWYg KHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9PVVRfT0ZfTUVNT1JZLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAg IkNvdWxkIG5vdCBjcmVhdGUgQVNOLjEgc3RydWN0dXJlIGZvciBCYXNpYyAiCj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAiQ29uc3RyYWludHMiKTsKPiArICAgIH0KPiArCj4gKyAgcmVzdWx0 ID0gYXNuMV9kZXJfZGVjb2RpbmcyICgmYmFzaWNhc24sIHZhbHVlLCAmdmFsdWVfc2l6ZSwKPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RF UiwgCj4gYXNuMV9lcnJvcik7Cj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAg ICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIERFUiBmb3IgQmFzaWMgQ29u c3RyYWludHM6Cj4gJXMiLCBhc24xX2Vycm9yKTsKPiArICAgICAgZ290byBjbGVhbnVwOwo+ICsg ICAgfQo+ICsKPiArICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKGJhc2ljYXNuLCAiY0EiLCBj QSwgJmNBX3NpemUpOwo+ICsgIGlmIChyZXN1bHQgPT0gQVNOMV9FTEVNRU5UX05PVF9GT1VORCkK PiArICAgIHsKPiArICAgICAgLyogTm90IHByZXNlbnQsIGRlZmF1bHQgaXMgRmFsc2UsIHNvIHRo aXMgaXMgT0sgKi8KPiArICAgICAgZXJyID0gR1JVQl9FUlJfTk9ORTsKPiArICAgICAgZ290byBj bGVhbnVwOwo+ICsgICAgfQo+ICsgIGVsc2UgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4g KyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUs ICJFcnJvciByZWFkaW5nIEJhc2ljCj4gQ29uc3RyYWludHMgY0EgdmFsdWU6ICVzIiwKPiArICAg ICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4gKyAgICAgIGdv dG8gY2xlYW51cDsKPiArICAgIH0KPiArCj4gKyAgLyogVGhlIGNlcnRpZmljYXRlIG11c3Qgbm90 IGJlIGEgQ0EgY2VydGlmaWNhdGUgKi8KPiArICBpZiAoZ3J1Yl9zdHJuY21wICgiRkFMU0UiLCBj QSwgY0Ffc2l6ZSkgIT0gMCkKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JV Ql9FUlJfQkFEX0ZJTEVfVFlQRSwgIlVuZXhwZWN0ZWQgQ0EgdmFsdWU6IAo+ICVzIiwgY0EpOwo+ ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICtjbGVhbnVwOgo+ICsgIGFzbjFf ZGVsZXRlX3N0cnVjdHVyZSAoJmJhc2ljYXNuKTsKPiArICByZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ ICsvKgo+ICsgKiBFeHRLZXlVc2FnZVN5bnRheCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uTUFYKSBP RiBLZXlQdXJwb3NlSWQKPiArICoKPiArICogS2V5UHVycG9zZUlkIDo6PSBPQkpFQ1QgSURFTlRJ RklFUgo+ICsgKi8KPiArc3RhdGljIGdydWJfZXJyX3QKPiArdmVyaWZ5X2V4dGVuZGVkX2tleV91 c2FnZSAoZ3J1Yl91aW50OF90ICp2YWx1ZSwgaW50IHZhbHVlX3NpemUpCj4gK3sKPiArICBhc24x X25vZGUgZXh0ZW5kZWRhc247Cj4gKyAgaW50IHJlc3VsdCwgY291bnQ7Cj4gKyAgZ3J1Yl9lcnJf dCBlcnIgPSBHUlVCX0VSUl9OT05FOwo+ICsgIGNoYXIgdXNhZ2VbTUFYX09JRF9MRU5dOwo+ICsg IGludCB1c2FnZV9zaXplID0gc2l6ZW9mICh1c2FnZSk7Cj4gKwo+ICsgIHJlc3VsdCA9IGFzbjFf Y3JlYXRlX2VsZW1lbnQgKF9nbnV0bHNfcGtpeF9hc24sCj4gIlBLSVgxLkV4dEtleVVzYWdlU3lu dGF4IiwgJmV4dGVuZGVkYXNuKTsKPiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VTUykKPiAr ICAgIHsKPiArICAgICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJSX09VVF9PRl9NRU1PUlks Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGNyZWF0ZSBBU04uMSBzdHJ1 Y3R1cmUgZm9yIAo+IEV4dGVuZGVkIEtleSAiCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAi VXNhZ2UiKTsKPiArICAgIH0KPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9kZXJfZGVjb2RpbmcyICgm ZXh0ZW5kZWRhc24sIHZhbHVlLCAmdmFsdWVfc2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiwgCj4gYXNuMV9lcnJvcik7Cj4g KyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdy dWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICJFcnJvciBwYXJzaW5nIERFUiBmb3IgRXh0ZW5kZWQgS2V5IFVzYWdlOgo+ICVzIiwgYXNu MV9lcnJvcik7Cj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPiArICAgIH0KPiArCj4gKyAgLyoKPiAr ICAgKiBJZiBFS1VzIGFyZSBwcmVzZW50LCB0aGVyZSBtdXN0IGJlIGV4YWN0bHkgMSB1c2FnZSBh bmQgaXQgbXVzdCBiZSAKPiBhCj4gKyAgICogY29kZVNpZ25pbmcgdXNhZ2UuIChJZiB3ZSBnZXQg dG8gdGhpcyBwb2ludCwgd2UgYXJlIHBhcnNpbmcgYW4gCj4gRUtVCj4gKyAgICogZXh0ZW5zaW9u IGFuZCB0aGVyZWZvcmUgbXVzdCBoYXZlIGEgdXNhZ2UuIFRoZSBjb2RlIHRoYXQgbWFrZXMgCj4g aGF2aW5nIGFuCj4gKyAgICogRUtVIGV4dGVuc2lvbiBvcHRpb25hbCBpcyBpbiB2ZXJpZnlfZXh0 ZW5zaW9ucy4pCj4gKyAgICovCj4gKyAgcmVzdWx0ID0gYXNuMV9udW1iZXJfb2ZfZWxlbWVudHMg KGV4dGVuZGVkYXNuLCAiIiwgJmNvdW50KTsKPiArICBpZiAocmVzdWx0ICE9IEFTTjFfU1VDQ0VT UykKPiArICAgIHsKPiArICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVf VFlQRSwgIkVycm9yIGNvdW50aW5nCj4gbnVtYmVyIG9mIEV4dGVuZGVkIEtleSBVc2FnZXM6ICVz IiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAocmVzdWx0KSk7Cj4g KyAgICAgIGdvdG8gY2xlYW51cDsKPiArICAgIH0KPiArCj4gKyAgaWYgKGNvdW50ICE9IDEpCj4g KyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUs ICJVbmV4cGVjdGVkIG51bWJlciBvZgo+IEV4dGVuZGVkIEtleSBVc2FnZXM6ICVkLCAxIGV4cGVj dGVkIiwKPiArICAgICAgICAgICAgICAgICAgICAgICAgY291bnQpOwo+ICsgICAgICBnb3RvIGNs ZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAoZXh0ZW5k ZWRhc24sICI/MSIsIHVzYWdlLCAmdXNhZ2Vfc2l6ZSk7Cj4gKyAgaWYgKHJlc3VsdCAhPSBBU04x X1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JB RF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nCj4gRXh0ZW5kZWQgS2V5IFVzYWdlOiAlcyIsCj4g KyAgICAgICAgICAgICAgICAgICAgICAgIGFzbjFfc3RyZXJyb3IgKHJlc3VsdCkpOwo+ICsgICAg ICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIGlmIChncnViX3N0cm5jbXAgKGNvZGVT aWduaW5nVXNhZ2Vfb2lkLCB1c2FnZSwgdXNhZ2Vfc2l6ZSkgIT0gMCkKPiArICAgIHsKPiArICAg ICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfQkFEX0ZJTEVfVFlQRSwKPiArICAgICAgICAg ICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgRXh0ZW5kZWQgS2V5IFVzYWdlIE9JRCwgZ290OiAl cyIsIAo+IHVzYWdlKTsKPiArICAgICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArY2xl YW51cDoKPiArICBhc24xX2RlbGV0ZV9zdHJ1Y3R1cmUgKCZleHRlbmRlZGFzbik7Cj4gKyAgcmV0 dXJuIGVycjsKPiArfQo+ICsKPiArLyoKPiArICogRXh0ZW5zaW9ucyAgOjo9ICBTRVFVRU5DRSBT SVpFICgxLi5NQVgpIE9GIEV4dGVuc2lvbgo+ICsgKgo+ICsgKiBFeHRlbnNpb24gIDo6PSAgU0VR VUVOQ0UgIHsKPiArICogICAgICBleHRuSUQgICAgICBPQkpFQ1QgSURFTlRJRklFUiwKPiArICog ICAgICBjcml0aWNhbCAgICBCT09MRUFOIERFRkFVTFQgRkFMU0UsCj4gKyAqICAgICAgZXh0blZh bHVlICAgT0NURVQgU1RSSU5HCj4gKyAqICAgICAgICAgICAgICAgICAgLS0gY29udGFpbnMgdGhl IERFUiBlbmNvZGluZyBvZiBhbiBBU04uMSB2YWx1ZQo+ICsgKiAgICAgICAgICAgICAgICAgIC0t IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGV4dGVuc2lvbiB0eXBlIGlkZW50aWZpZWQKPiArICogICAg ICAgICAgICAgICAgICAtLSBieSBleHRuSUQKPiArICogfQo+ICsgKgo+ICsgKiBBIGNlcnRpZmlj YXRlIG11c3Q6Cj4gKyAqICAtIGNvbnRhaW4gdGhlIERpZ2l0YWwgU2lnbmF0dXJlIHVzYWdlIG9u bHkKPiArICogIC0gbm90IGJlIGEgQ0EKPiArICogIC0gY29udGFpbiBubyBleHRlbmRlZCB1c2Fn ZXMsIG9yIG9ubHkgYSBjb2RlIHNpZ25pbmcgZXh0ZW5kZWQgCj4gdXNhZ2UKPiArICogIC0gbm90 IGNvbnRhaW4gYW55IG90aGVyIGNyaXRpY2FsIGV4dGVuc2lvbnMgKFJGQyA1MjgwIHMgNC4yKQo+ ICsgKi8KPiArc3RhdGljIGdydWJfZXJyX3QKPiArdmVyaWZ5X2V4dGVuc2lvbnMgKGFzbjFfbm9k ZSBjZXJ0KQo+ICt7Cj4gKyAgaW50IHJlc3VsdDsKPiArICBpbnQgZXh0LCBudW1fZXh0ZW5zaW9u cyA9IDA7Cj4gKyAgaW50IHVzYWdlX3ByZXNlbnQgPSAwLCBjb25zdHJhaW50c19wcmVzZW50ID0g MCwgCj4gZXh0ZW5kZWRfdXNhZ2VfcHJlc2VudCA9IDA7Cj4gKyAgY2hhciAqb2lkX3BhdGgsICpj cml0aWNhbF9wYXRoLCAqdmFsdWVfcGF0aDsKPiArICBjaGFyIGV4dG5JRFtNQVhfT0lEX0xFTl07 Cj4gKyAgaW50IGV4dG5JRF9zaXplOwo+ICsgIGdydWJfZXJyX3QgZXJyOwo+ICsgIGNoYXIgY3Jp dGljYWxbNl07IC8qIHdlIGdldCBlaXRoZXIgIlRSVUUiIG9yICJGQUxTRSIgKi8KPiArICBpbnQg Y3JpdGljYWxfc2l6ZTsKPiArICBncnViX3VpbnQ4X3QgKnZhbHVlOwo+ICsgIGludCB2YWx1ZV9z aXplOwo+ICsKPiArICByZXN1bHQgPSBhc24xX251bWJlcl9vZl9lbGVtZW50cyAoY2VydCwKPiAi dGJzQ2VydGlmaWNhdGUuZXh0ZW5zaW9ucyIsICZudW1fZXh0ZW5zaW9ucyk7Cj4gKyAgaWYgKHJl c3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vycm9y IChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiRXJyb3IgY291bnRpbmcKPiBudW1iZXIgb2YgZXh0 ZW5zaW9uczogJXMiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAo cmVzdWx0KSk7Cj4gKyAgICB9Cj4gKwo+ICsgIGlmIChudW1fZXh0ZW5zaW9ucyA8IDIpCj4gKyAg ICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAi SW5zdWZmaWNpZW50IG51bWJlcgo+IG9mIGV4dGVuc2lvbnMgZm9yICIKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICJjZXJ0aWZpY2F0ZSwgbmVlZCBhdCBsZWFzdCAyLCBnb3QgJWQiLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2V4dGVuc2lvbnMpOwo+ICsgICAgfQo+ICsKPiAr ICBmb3IgKGV4dCA9IDE7IGV4dCA8PSBudW1fZXh0ZW5zaW9uczsgZXh0KyspCj4gKyAgICB7Cj4g KyAgICAgIG9pZF9wYXRoID0gZ3J1Yl94YXNwcmludGYgCj4gKCJ0YnNDZXJ0aWZpY2F0ZS5leHRl bnNpb25zLj8lZC5leHRuSUQiLCBleHQpOwo+ICsKPiArICAgICAgZXh0bklEX3NpemUgPSBzaXpl b2YgKGV4dG5JRCk7Cj4gKyAgICAgIHJlc3VsdCA9IGFzbjFfcmVhZF92YWx1ZSAoY2VydCwgb2lk X3BhdGgsIGV4dG5JRCwgJmV4dG5JRF9zaXplKTsKPiArICAgICAgaWYgKHJlc3VsdCAhPSBBU04x X1NVQ0NFU1MpCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJvciAoR1JV Ql9FUlJfQkFEX0ZJTEVfVFlQRSwgIkVycm9yIHJlYWRpbmcKPiBleHRlbnNpb24gT0lEOiAlcyIs Cj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc24xX3N0cmVycm9yIChyZXN1bHQpKTsK PiArICAgICAgICAgIGdvdG8gY2xlYW51cF9vaWRfcGF0aDsKPiArICAgICAgICB9Cj4gKwo+ICsg ICAgICBjcml0aWNhbF9wYXRoID0gZ3J1Yl94YXNwcmludGYKPiAoInRic0NlcnRpZmljYXRlLmV4 dGVuc2lvbnMuPyVkLmNyaXRpY2FsIiwgZXh0KTsKPiArICAgICAgY3JpdGljYWxfc2l6ZSA9IHNp emVvZiAoY3JpdGljYWwpOwo+ICsgICAgICByZXN1bHQgPSBhc24xX3JlYWRfdmFsdWUgKGNlcnQs IGNyaXRpY2FsX3BhdGgsIGNyaXRpY2FsLCAKPiAmY3JpdGljYWxfc2l6ZSk7Cj4gKyAgICAgIGlm IChyZXN1bHQgPT0gQVNOMV9FTEVNRU5UX05PVF9GT1VORCkKPiArICAgICAgICB7Cj4gKyAgICAg ICAgICBjcml0aWNhbFswXSA9ICdcMCc7Cj4gKyAgICAgICAgfQo+ICsgICAgICBlbHNlIGlmIChy ZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgICAgIHsKPiArICAgICAgICAgIGVyciA9IGdy dWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJFcnJvciByZWFkaW5nCj4gZXh0ZW5z aW9uIGNyaXRpY2FsaXR5OiAlcyIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc24x X3N0cmVycm9yIChyZXN1bHQpKTsKPiArICAgICAgICAgIGdvdG8gY2xlYW51cF9jcml0aWNhbF9w YXRoOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIHZhbHVlX3BhdGggPSBncnViX3hhc3ByaW50 Zgo+ICgidGJzQ2VydGlmaWNhdGUuZXh0ZW5zaW9ucy4/JWQuZXh0blZhbHVlIiwgZXh0KTsKPiAr ICAgICAgdmFsdWUgPSBncnViX2FzbjFfYWxsb2NhdGVfYW5kX3JlYWQgKGNlcnQsIHZhbHVlX3Bh dGgsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VydGlm aWNhdGUgZXh0ZW5zaW9uCj4gdmFsdWUiLCAmdmFsdWVfc2l6ZSk7Cj4gKyAgICAgIGlmICghdmFs dWUpCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0gZ3J1Yl9lcnJubzsKPiArICAgICAg ICAgIGdvdG8gY2xlYW51cF92YWx1ZV9wYXRoOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIC8q Cj4gKyAgICAgICAqIE5vdyB3ZSBtdXN0IHNlZSBpZiB3ZSByZWNvZ25pc2UgdGhlIE9JRC4KPiAr ICAgICAgICogSWYgd2UgaGF2ZSBhbiB1bnJlY29nbmlzZWQgY3JpdGljYWwgZXh0ZW5zaW9uIHdl IE1VU1QgYmFpbC4KPiArICAgICAgICovCj4gKyAgICAgIGlmIChncnViX3N0cm5jbXAgKGtleVVz YWdlX29pZCwgZXh0bklELCBleHRuSURfc2l6ZSkgPT0gMCkKPiArICAgICAgICB7Cj4gKyAgICAg ICAgICBlcnIgPSB2ZXJpZnlfa2V5X3VzYWdlICh2YWx1ZSwgdmFsdWVfc2l6ZSk7Cj4gKyAgICAg ICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05PTkUpCj4gKyAgICAgICAgICAgIHsKPiArICAgICAg ICAgICAgICBnb3RvIGNsZWFudXBfdmFsdWU7Cj4gKyAgICAgICAgICAgIH0KPiArICAgICAgICAg IHVzYWdlX3ByZXNlbnQrKzsKPiArICAgICAgICB9Cj4gKyAgICAgIGVsc2UgaWYgKGdydWJfc3Ry bmNtcCAoYmFzaWNDb25zdHJhaW50c19vaWQsIGV4dG5JRCwgCj4gZXh0bklEX3NpemUpID09IDAp Cj4gKyAgICAgICAgewo+ICsgICAgICAgICAgZXJyID0gdmVyaWZ5X2Jhc2ljX2NvbnN0cmFpbnRz ICh2YWx1ZSwgdmFsdWVfc2l6ZSk7Cj4gKyAgICAgICAgICBpZiAoZXJyICE9IEdSVUJfRVJSX05P TkUpCj4gKyAgICAgICAgICAgIHsKPiArICAgICAgICAgICAgICBnb3RvIGNsZWFudXBfdmFsdWU7 Cj4gKyAgICAgICAgICAgIH0KPiArICAgICAgICAgIGNvbnN0cmFpbnRzX3ByZXNlbnQrKzsKPiAr ICAgICAgICB9Cj4gKyAgICAgIGVsc2UgaWYgKGdydWJfc3RybmNtcCAoZXh0ZW5kZWRLZXlVc2Fn ZV9vaWQsIGV4dG5JRCwgCj4gZXh0bklEX3NpemUpID09IDApCj4gKyAgICAgICAgewo+ICsgICAg ICAgICAgZXJyID0gdmVyaWZ5X2V4dGVuZGVkX2tleV91c2FnZSAodmFsdWUsIHZhbHVlX3NpemUp Owo+ICsgICAgICAgICAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQo+ICsgICAgICAgICAgICB7 Cj4gKyAgICAgICAgICAgICAgZ290byBjbGVhbnVwX3ZhbHVlOwo+ICsgICAgICAgICAgICB9Cj4g KyAgICAgICAgICBleHRlbmRlZF91c2FnZV9wcmVzZW50Kys7Cj4gKyAgICAgICAgfQo+ICsgICAg ICBlbHNlIGlmIChncnViX3N0cm5jbXAgKCJUUlVFIiwgY3JpdGljYWwsIGNyaXRpY2FsX3NpemUp ID09IDApCj4gKyAgICAgICAgewo+ICsgICAgICAgICAgLyoKPiArICAgICAgICAgICAqIHBlciB0 aGUgUkZDLCB3ZSBtdXN0IG5vdCBwcm9jZXNzIGEgY2VydGlmaWNhdGUgd2l0aAo+ICsgICAgICAg ICAgICogYSBjcml0aWNhbCBleHRlbnNpb24gd2UgZG8gbm90IHVuZGVyc3RhbmQuCj4gKyAgICAg ICAgICAgKi8KPiArICAgICAgICAgIGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxF X1RZUEUsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5oYW5kbGVkIGNyaXRpY2Fs IHg1MDkgZXh0ZW5zaW9uIHdpdGgKPiBPSUQgJXMiLCBleHRuSUQpOwo+ICsgICAgICAgICAgZ290 byBjbGVhbnVwX3ZhbHVlOwo+ICsgICAgICAgIH0KPiArCj4gKyAgICAgIGdydWJfZnJlZSAodmFs dWUpOwo+ICsgICAgICBncnViX2ZyZWUgKHZhbHVlX3BhdGgpOwo+ICsgICAgICBncnViX2ZyZWUg KGNyaXRpY2FsX3BhdGgpOwo+ICsgICAgICBncnViX2ZyZWUgKG9pZF9wYXRoKTsKPiArICAgIH0K PiArCj4gKyAgaWYgKHVzYWdlX3ByZXNlbnQgIT0gMSkKPiArICAgIHsKPiArICAgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJVbmV4cGVjdGVkIG51bWJlcgo+ IG9mIEtleSBVc2FnZSBleHRlbnNpb25zICIKPiArICAgICAgICAgICAgICAgICAgICAgICAgICIt IGV4cGVjdGVkIDEsIGdvdCAlZCIsIHVzYWdlX3ByZXNlbnQpOwo+ICsgICAgfQo+ICsgIGlmIChj b25zdHJhaW50c19wcmVzZW50ICE9IDEpCj4gKyAgICB7Cj4gKyAgICAgIHJldHVybiBncnViX2Vy cm9yIChHUlVCX0VSUl9CQURfRklMRV9UWVBFLCAiVW5leHBlY3RlZCBudW1iZXIKPiBvZiBiYXNp YyBjb25zdHJhaW50cyBleHRlbnNpb25zICIKPiArICAgICAgICAgICAgICAgICAgICAgICAgICIt IGV4cGVjdGVkIDEsIGdvdCAlZCIsIGNvbnN0cmFpbnRzX3ByZXNlbnQpOwo+ICsgICAgfQo+ICsg IGlmIChleHRlbmRlZF91c2FnZV9wcmVzZW50ID4gMSkKPiArICAgIHsKPiArICAgICAgcmV0dXJu IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsICJVbmV4cGVjdGVkIG51bWJlcgo+ IG9mIEV4dGVuZGVkIEtleSBVc2FnZSBleHRlbnNpb25zICIKPiArICAgICAgICAgICAgICAgICAg ICAgICAgICItIGV4cGVjdGVkIDAgb3IgMSwgZ290ICVkIiwgCj4gZXh0ZW5kZWRfdXNhZ2VfcHJl c2VudCk7Cj4gKyAgICB9Cj4gKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cj4gKwo+ICtjbGVhbnVw X3ZhbHVlOgo+ICsgIGdydWJfZnJlZSAodmFsdWUpOwo+ICtjbGVhbnVwX3ZhbHVlX3BhdGg6Cj4g KyAgZ3J1Yl9mcmVlICh2YWx1ZV9wYXRoKTsKPiArY2xlYW51cF9jcml0aWNhbF9wYXRoOgo+ICsg IGdydWJfZnJlZSAoY3JpdGljYWxfcGF0aCk7Cj4gK2NsZWFudXBfb2lkX3BhdGg6Cj4gKyAgZ3J1 Yl9mcmVlIChvaWRfcGF0aCk7Cj4gKyAgcmV0dXJuIGVycjsKPiArfQo+ICsKPiArLyoKPiArICog UGFyc2UgYSBjZXJ0aWZpY2F0ZSB3aG9zZSBERVItZW5jb2RlZCBmb3JtIGlzIGluIEBkYXRhLCBv ZiBzaXplIAo+IEBkYXRhX3NpemUuCj4gKyAqIFJldHVybiB0aGUgcmVzdWx0cyBpbiBAcmVzdWx0 cywgd2hpY2ggbXVzdCBwb2ludCB0byBhbiBhbGxvY2F0ZWQKPiB4NTA5IGNlcnRpZmljYXRlLgo+ ICsgKi8KPiArZ3J1Yl9lcnJfdAo+ICtwYXJzZV94NTA5X2NlcnRpZmljYXRlIChjb25zdCB2b2lk ICpkYXRhLCBncnViX3NpemVfdCBkYXRhX3NpemUsCj4gc3RydWN0IHg1MDlfY2VydGlmaWNhdGUg KnJlc3VsdHMpCj4gK3sKPiArICBpbnQgcmVzdWx0ID0gMDsKPiArICBhc24xX25vZGUgY2VydDsK PiArICBncnViX2Vycl90IGVycjsKPiArICBpbnQgc2l6ZTsKPiArICBpbnQgdG1wX3NpemU7Cj4g Kwo+ICsgIGlmIChkYXRhX3NpemUgPiBHUlVCX0lOVF9NQVgpCj4gKyAgICByZXR1cm4gZ3J1Yl9l cnJvciAoR1JVQl9FUlJfT1VUX09GX1JBTkdFLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICJD YW5ub3QgcGFyc2UgYSBjZXJ0aWZpY2F0ZSB3aGVyZSBkYXRhIHNpemUgPiAKPiBJTlRfTUFYIik7 Cj4gKyAgc2l6ZSA9IChpbnQpIGRhdGFfc2l6ZTsKPiArCj4gKyAgcmVzdWx0ID0gYXNuMV9jcmVh dGVfZWxlbWVudCAoX2dudXRsc19wa2l4X2FzbiwgIlBLSVgxLkNlcnRpZmljYXRlIiwgCj4gJmNl cnQpOwo+ICsgIGlmIChyZXN1bHQgIT0gQVNOMV9TVUNDRVNTKQo+ICsgICAgewo+ICsgICAgICBy ZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfT1VUX09GX01FTU9SWSwKPiArICAgICAgICAgICAg ICAgICAgICAgICAgICJDb3VsZCBub3QgY3JlYXRlIEFTTi4xIHN0cnVjdHVyZSBmb3IKPiBjZXJ0 aWZpY2F0ZTogJXMiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgYXNuMV9zdHJlcnJvciAo cmVzdWx0KSk7Cj4gKyAgICB9Cj4gKwo+ICsgIHJlc3VsdCA9IGFzbjFfZGVyX2RlY29kaW5nMiAo JmNlcnQsIGRhdGEsICZzaXplLAo+IEFTTjFfREVDT0RFX0ZMQUdfU1RSSUNUX0RFUiwgYXNuMV9l cnJvcik7Cj4gKyAgaWYgKHJlc3VsdCAhPSBBU04xX1NVQ0NFU1MpCj4gKyAgICB7Cj4gKyAgICAg IGVyciA9IGdydWJfZXJyb3IgKEdSVUJfRVJSX0JBRF9GSUxFX1RZUEUsCj4gKyAgICAgICAgICAg ICAgICAgICAgICAgICJDb3VsZCBub3QgcGFyc2UgREVSIGZvciBjZXJ0aWZpY2F0ZTogJXMiLCAK PiBhc24xX2Vycm9yKTsKPiArICAgICAgZ290byBjbGVhbnVwOwo+ICsgICAgfQo+ICsKPiArICAv Kgo+ICsgICAqIFRCU0NlcnRpZmljYXRlICA6Oj0gIFNFUVVFTkNFIHsKPiArICAgKiAgICAgdmVy c2lvbiAgICAgICAgIFswXSAgRVhQTElDSVQgVmVyc2lvbiBERUZBVUxUIHYxCj4gKyAgICovCj4g KyAgZXJyID0gY2hlY2tfdmVyc2lvbiAoY2VydCk7Cj4gKyAgaWYgKGVyciAhPSBHUlVCX0VSUl9O T05FKQo+ICsgICAgewo+ICsgICAgICBnb3RvIGNsZWFudXA7Cj4gKyAgICB9Cj4gKwo+ICsgIC8q Cj4gKyAgICogc2VyaWFsTnVtYmVyICAgICAgICAgQ2VydGlmaWNhdGVTZXJpYWxOdW1iZXIsCj4g KyAgICoKPiArICAgKiBDZXJ0aWZpY2F0ZVNlcmlhbE51bWJlciAgOjo9ICBJTlRFR0VSCj4gKyAg ICovCj4gKyAgcmVzdWx0cy0+c2VyaWFsID0gZ3J1Yl9hc24xX2FsbG9jYXRlX2FuZF9yZWFkIChj ZXJ0LAo+ICJ0YnNDZXJ0aWZpY2F0ZS5zZXJpYWxOdW1iZXIiLAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNlcnRpZmljYXRlIHNlcmlhbAo+IG51 bWJlciIsICZ0bXBfc2l6ZSk7Cj4gKyAgaWYgKCFyZXN1bHRzLT5zZXJpYWwpCj4gKyAgICB7Cj4g KyAgICAgIGVyciA9IGdydWJfZXJybm87Cj4gKyAgICAgIGdvdG8gY2xlYW51cDsKPiArICAgIH0K PiArICAvKgo+ICsgICAqIEl0J3Mgc2FmZSB0byBjYXN0IHRoZSBzaWduZWQgaW50IHRvIGFuIHVu c2lnbmVkIGhlcmUsIHdlIGtub3cKPiArICAgKiBsZW5ndGggaXMgbm9uLW5lZ2F0aXZlCj4gKyAg ICovCj4gKyAgcmVzdWx0cy0+c2VyaWFsX2xlbiA9IHRtcF9zaXplOwo+ICsKPiArICAvKgo+ICsg ICAqIHNpZ25hdHVyZSAgICAgICAgICAgIEFsZ29yaXRobUlkZW50aWZpZXIsCj4gKyAgICoKPiAr ICAgKiBXZSBkb24ndCBsb2FkIHRoZSBzaWduYXR1cmUgb3IgaXNzdWVyIGF0IHRoZSBtb21lbnQs Cj4gKyAgICogYXMgd2UgZG9uJ3QgYXR0ZW1wdCB4NTA5IHZlcmlmaWNhdGlvbi4KPiArICAgKi8K PiArCj4gKyAgLyoKPiArICAgKiBpc3N1ZXIgICAgICAgICAgICAgICBOYW1lLAo+ICsgICAqCj4g KyAgICogVGhlIFJGQyBvbmx5IHJlcXVpcmVzIHRoZSBzZXJpYWwgbnVtYmVyIHRvIGJlIHVuaXF1 ZSB3aXRoaW4KPiArICAgKiBpc3N1ZXJzLCBzbyB0byBhdm9pZCBhbWJpZ3VpdHkgd2UgX3RlY2hu aWNhbGx5XyBvdWdodCB0byBtYWtlCj4gKyAgICogdGhpcyBhdmFpbGFibGUuCj4gKyAgICovCj4g Kwo+ICsgIC8qCj4gKyAgICogdmFsaWRpdHkgICAgICAgICAgICAgVmFsaWRpdHksCj4gKyAgICoK PiArICAgKiBWYWxpZGl0eSA6Oj0gU0VRVUVOQ0Ugewo+ICsgICAqICAgICBub3RCZWZvcmUgICAg ICBUaW1lLAo+ICsgICAqICAgICBub3RBZnRlciAgICAgICBUaW1lIH0KPiArICAgKgo+ICsgICAq IFdlIGNhbid0IHZhbGlkYXRlIHRoaXMgcmVhc29uYWJseSwgd2UgaGF2ZSBubyB0cnVlIHRpbWUg c291cmNlIG9uIAo+IHNldmVyYWwKPiArICAgKiBwbGF0Zm9ybXMuIEZvciBub3cgd2UgZG8gbm90 IHBhcnNlIHRoZW0uCj4gKyAgICovCj4gKwo+ICsgIC8qCj4gKyAgICogc3ViamVjdCAgICAgICAg ICAgICAgTmFtZSwKPiArICAgKgo+ICsgICAqIFRoaXMgaXMgYW4gWDUwMSBuYW1lLCB3ZSBwYXJz ZSBvdXQganVzdCB0aGUgQ04uCj4gKyAgICovCj4gKyAgZXJyID0gcmVhZF9uYW1lIChjZXJ0LCAi dGJzQ2VydGlmaWNhdGUuc3ViamVjdCIsICZyZXN1bHRzLT5zdWJqZWN0LAo+ICZyZXN1bHRzLT5z dWJqZWN0X2xlbik7Cj4gKyAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQo+ICsgICAgZ290byBj bGVhbnVwX3NlcmlhbDsKPiArCj4gKyAgLyoKPiArICAgKiBUQlNDZXJ0aWZpY2F0ZSAgOjo9ICBT RVFVRU5DRSAgewo+ICsgICAqICAgIC4uLgo+ICsgICAqICAgIHN1YmplY3RQdWJsaWNLZXlJbmZv IFN1YmplY3RQdWJsaWNLZXlJbmZvLAo+ICsgICAqICAgIC4uLgo+ICsgICAqLwo+ICsgIGVyciA9 IGdydWJfeDUwOV9yZWFkX3N1YmplY3RfcHVibGljX2tleSAoY2VydCwgcmVzdWx0cyk7Cj4gKyAg aWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQo+ICsgICAgZ290byBjbGVhbnVwX25hbWU7Cj4gKwo+ ICsgIC8qCj4gKyAgICogVEJTQ2VydGlmaWNhdGUgIDo6PSAgU0VRVUVOQ0UgIHsKPiArICAgKiAg ICAuLi4KPiArICAgKiAgICBleHRlbnNpb25zICAgICAgWzNdICBFWFBMSUNJVCBFeHRlbnNpb25z IE9QVElPTkFMCj4gKyAgICogICAgICAgICAgICAgICAgICAgICAgICAgLS0gSWYgcHJlc2VudCwg dmVyc2lvbiBNVVNUIGJlIHYzCj4gKyAgICogfQo+ICsgICAqLwo+ICsKPiArICBlcnIgPSB2ZXJp ZnlfZXh0ZW5zaW9ucyAoY2VydCk7Cj4gKyAgaWYgKGVyciAhPSBHUlVCX0VSUl9OT05FKQo+ICsg ICAgZ290byBjbGVhbnVwX21waXM7Cj4gKwo+ICsgIC8qCj4gKyAgICogV2UgZG8gbm90IHJlYWQg b3IgY2hlY2sgdGhlIHNpZ25hdHVyZSBvbiB0aGUgY2VydGlmaWNhdGU6Cj4gKyAgICogYXMgZGlz Y3Vzc2VkIHdlIGRvIG5vdCB0cnkgdG8gdmFsaWRhdGUgdGhlIGNlcnRpZmljYXRlIGJ1dCB0cnVz dAo+ICsgICAqIGl0IGltcGxpY3RseS4KPiArICAgKi8KPiArCj4gKyAgYXNuMV9kZWxldGVfc3Ry dWN0dXJlICgmY2VydCk7Cj4gKyAgcmV0dXJuIEdSVUJfRVJSX05PTkU7Cj4gKwo+ICtjbGVhbnVw X21waXM6Cj4gKyAgZ2NyeV9tcGlfcmVsZWFzZSAocmVzdWx0cy0+bXBpc1swXSk7Cj4gKyAgZ2Ny eV9tcGlfcmVsZWFzZSAocmVzdWx0cy0+bXBpc1sxXSk7Cj4gK2NsZWFudXBfbmFtZToKPiArICBn cnViX2ZyZWUgKHJlc3VsdHMtPnN1YmplY3QpOwo+ICtjbGVhbnVwX3NlcmlhbDoKPiArICBncnVi X2ZyZWUgKHJlc3VsdHMtPnNlcmlhbCk7Cj4gK2NsZWFudXA6Cj4gKyAgYXNuMV9kZWxldGVfc3Ry dWN0dXJlICgmY2VydCk7Cj4gKyAgcmV0dXJuIGVycjsKPiArfQo+ICsKPiArLyoKPiArICogUmVs ZWFzZSBhbGwgdGhlIHN0b3JhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSB4NTA5IGNlcnRpZmljYXRl Lgo+ICsgKiBJZiB0aGUgY2FsbGVyIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB0aGUgY2VydGlmaWNh dGUsIGl0IG11c3QgZnJlZSAKPiBpdC4KPiArICogVGhlIGNhbGxlciBpcyBhbHNvIHJlc3BvbnNp YmxlIGZvciBtYWludGVuYW5jZSBvZiB0aGUgbGlua2VkIGxpc3QuCj4gKyAqLwo+ICt2b2lkCj4g K2NlcnRpZmljYXRlX3JlbGVhc2UgKHN0cnVjdCB4NTA5X2NlcnRpZmljYXRlICpjZXJ0KQo+ICt7 Cj4gKyAgZ3J1Yl9mcmVlIChjZXJ0LT5zdWJqZWN0KTsKPiArICBncnViX2ZyZWUgKGNlcnQtPnNl cmlhbCk7Cj4gKyAgZ2NyeV9tcGlfcmVsZWFzZSAoY2VydC0+bXBpc1swXSk7Cj4gKyAgZ2NyeV9t cGlfcmVsZWFzZSAoY2VydC0+bXBpc1sxXSk7Cj4gK30KCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCkdydWItZGV2ZWwgbWFpbGluZyBsaXN0CkdydWItZGV2 ZWxAZ251Lm9yZwpodHRwczovL2xpc3RzLmdudS5vcmcvbWFpbG1hbi9saXN0aW5mby9ncnViLWRl dmVsCg==