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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AD968C05027 for ; Thu, 9 Feb 2023 06:12:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229479AbjBIGML (ORCPT ); Thu, 9 Feb 2023 01:12:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52032 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229460AbjBIGMJ (ORCPT ); Thu, 9 Feb 2023 01:12:09 -0500 Received: from fd01.gateway.ufhost.com (fd01.gateway.ufhost.com [61.152.239.71]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 75A611BAFD for ; Wed, 8 Feb 2023 22:12:04 -0800 (PST) Received: from EXMBX165.cuchost.com (unknown [175.102.18.54]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "EXMBX165", Issuer "EXMBX165" (not verified)) by fd01.gateway.ufhost.com (Postfix) with ESMTP id 3354B24E1CD; Thu, 9 Feb 2023 14:12:02 +0800 (CST) Received: from EXMBX063.cuchost.com (172.16.7.63) by EXMBX165.cuchost.com (172.16.6.75) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Thu, 9 Feb 2023 14:12:02 +0800 Received: from EXMBX066.cuchost.com (172.16.7.66) by EXMBX063.cuchost.com (172.16.7.63) with Microsoft SMTP Server (TLS) id 15.0.1497.42; Thu, 9 Feb 2023 14:12:01 +0800 Received: from EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f]) by EXMBX066.cuchost.com ([fe80::5947:9245:907e:339f%17]) with mapi id 15.00.1497.044; Thu, 9 Feb 2023 14:12:01 +0800 From: JeeHeng Sia To: Alexandre Ghiti , "paul.walmsley@sifive.com" , "palmer@dabbelt.com" , "aou@eecs.berkeley.edu" CC: "linux-riscv@lists.infradead.org" , "linux-kernel@vger.kernel.org" , Leyfoon Tan , Mason Huo Subject: RE: [PATCH v3 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Topic: [PATCH v3 4/4] RISC-V: Add arch functions to support hibernation/suspend-to-disk Thread-Index: AQHZMi9ZN0+4F1UUIkevO0NjoPA2067DLC2AgAFYUND///wZgIABtH4w Date: Thu, 9 Feb 2023 06:12:01 +0000 Message-ID: <1e24323f1fcb4ba0a45d3889074df907@EXMBX066.cuchost.com> References: <20230127091051.1465278-1-jeeheng.sia@starfivetech.com> <20230127091051.1465278-5-jeeheng.sia@starfivetech.com> <5b0f10eb-df3c-81f1-8d06-e65956bd0412@ghiti.fr> In-Reply-To: <5b0f10eb-df3c-81f1-8d06-e65956bd0412@ghiti.fr> Accept-Language: en-US, zh-CN Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-exchange-transport-fromentityheader: Hosted x-originating-ip: [202.188.176.82] x-yovoleruleagent: yovoleflag Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org SGkgQWxleCwNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBBbGV4YW5k cmUgR2hpdGkgPGFsZXhAZ2hpdGkuZnI+DQo+IFNlbnQ6IFdlZG5lc2RheSwgOCBGZWJydWFyeSwg MjAyMyA4OjA1IFBNDQo+IFRvOiBKZWVIZW5nIFNpYSA8amVlaGVuZy5zaWFAc3RhcmZpdmV0ZWNo LmNvbT47IHBhdWwud2FsbXNsZXlAc2lmaXZlLmNvbTsgcGFsbWVyQGRhYmJlbHQuY29tOyBhb3VA ZWVjcy5iZXJrZWxleS5lZHUNCj4gQ2M6IGxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmc7 IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IExleWZvb24gVGFuIDxsZXlmb29uLnRhbkBz dGFyZml2ZXRlY2guY29tPjsgTWFzb24gSHVvDQo+IDxtYXNvbi5odW9Ac3RhcmZpdmV0ZWNoLmNv bT4NCj4gU3ViamVjdDogUmU6IFtQQVRDSCB2MyA0LzRdIFJJU0MtVjogQWRkIGFyY2ggZnVuY3Rp b25zIHRvIHN1cHBvcnQgaGliZXJuYXRpb24vc3VzcGVuZC10by1kaXNrDQo+IA0KPiBIaSBTaWEs DQo+IA0KPiBPbiAyLzgvMjMgMDU6NDMsIEplZUhlbmcgU2lhIHdyb3RlOg0KPiA+DQo+ID4+IC0t LS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4+IEZyb206IEFsZXhhbmRyZSBHaGl0aSA8YWxl eEBnaGl0aS5mcj4NCj4gPj4gU2VudDogVHVlc2RheSwgNyBGZWJydWFyeSwgMjAyMyAxMTo0NiBQ TQ0KPiA+PiBUbzogSmVlSGVuZyBTaWEgPGplZWhlbmcuc2lhQHN0YXJmaXZldGVjaC5jb20+OyBw YXVsLndhbG1zbGV5QHNpZml2ZS5jb207IHBhbG1lckBkYWJiZWx0LmNvbTsgYW91QGVlY3MuYmVy a2VsZXkuZWR1DQo+ID4+IENjOiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51 eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOyBMZXlmb29uIFRhbiA8bGV5Zm9vbi50YW5Ac3RhcmZp dmV0ZWNoLmNvbT47IE1hc29uIEh1bw0KPiA+PiA8bWFzb24uaHVvQHN0YXJmaXZldGVjaC5jb20+ DQo+ID4+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjMgNC80XSBSSVNDLVY6IEFkZCBhcmNoIGZ1bmN0 aW9ucyB0byBzdXBwb3J0IGhpYmVybmF0aW9uL3N1c3BlbmQtdG8tZGlzaw0KPiA+Pg0KPiA+PiBI aSBTaWEsDQo+ID4+DQo+ID4+IE9uIDEvMjcvMjMgMTA6MTAsIFNpYSBKZWUgSGVuZyB3cm90ZToN Cj4gPj4+IExvdyBsZXZlbCBBcmNoIGZ1bmN0aW9ucyB3ZXJlIGNyZWF0ZWQgdG8gc3VwcG9ydCBo aWJlcm5hdGlvbi4NCj4gPj4+IHN3c3VzcF9hcmNoX3N1c3BlbmQoKSByZWxpZXMgY29kZSBmcm9t IF9fY3B1X3N1c3BlbmRfZW50ZXIoKSB0byB3cml0ZQ0KPiA+Pj4gY3B1IHN0YXRlIG9udG8gdGhl IHN0YWNrLCB0aGVuIGNhbGxpbmcgc3dzdXNwX3NhdmUoKSB0byBzYXZlIHRoZSBtZW1vcnkNCj4g Pj4+IGltYWdlLg0KPiA+Pj4NCj4gPj4+IEFyY2ggc3BlY2lmaWMgaGliZXJuYXRpb24gaGVhZGVy IGlzIGltcGxlbWVudGVkIGFuZCBpcyB1dGlsaXplZCBieSB0aGUNCj4gPj4+IGFyY2hfaGliZXJu YXRpb25faGVhZGVyX3Jlc3RvcmUoKSBhbmQgYXJjaF9oaWJlcm5hdGlvbl9oZWFkZXJfc2F2ZSgp DQo+ID4+PiBmdW5jdGlvbnMuIFRoZSBhcmNoIHNwZWNpZmljIGhpYmVybmF0aW9uIGhlYWRlciBj b25zaXN0cyBvZiBzYXRwLCBoYXJ0aWQsDQo+ID4+PiBhbmQgdGhlIGNwdV9yZXN1bWUgYWRkcmVz cy4gVGhlIGtlcm5lbCBidWlsdCB2ZXJzaW9uIGlzIGFsc28gbmVlZCB0byBiZQ0KPiA+Pj4gc2F2 ZWQgaW50byB0aGUgaGliZXJuYXRpb24gaW1hZ2UgaGVhZGVyIHRvIG1ha2luZyBzdXJlIG9ubHkg dGhlIHNhbWUNCj4gPj4+IGtlcm5lbCBpcyByZXN0b3JlIHdoZW4gcmVzdW1lLg0KPiA+Pj4NCj4g Pj4+IHN3c3VzcF9hcmNoX3Jlc3VtZSgpIGNyZWF0ZXMgYSB0ZW1wb3JhcnkgcGFnZSB0YWJsZSB0 aGF0IGNvdmVyaW5nIG9ubHkNCj4gPj4+IHRoZSBsaW5lYXIgbWFwLiBJdCBjb3BpZXMgdGhlIHJl c3RvcmUgY29kZSB0byBhICdzYWZlJyBwYWdlLCB0aGVuIHN0YXJ0DQo+ID4+PiB0byByZXN0b3Jl IHRoZSBtZW1vcnkgaW1hZ2UuIE9uY2UgY29tcGxldGVkLCBpdCByZXN0b3JlcyB0aGUgb3JpZ2lu YWwNCj4gPj4+IGtlcm5lbCdzIHBhZ2UgdGFibGUuIEl0IHRoZW4gY2FsbHMgaW50byBfX2hpYmVy bmF0ZV9jcHVfcmVzdW1lKCkNCj4gPj4+IHRvIHJlc3RvcmUgdGhlIENQVSBjb250ZXh0LiBGaW5h bGx5LCBpdCBmb2xsb3dzIHRoZSBub3JtYWwgaGliZXJuYXRpb24NCj4gPj4+IHBhdGggYmFjayB0 byB0aGUgaGliZXJuYXRpb24gY29yZS4NCj4gPj4+DQo+ID4+PiBUbyBlbmFibGUgaGliZXJuYXRp b24vc3VzcGVuZCB0byBkaXNrIGludG8gUklTQ1YsIHRoZSBiZWxvdyBjb25maWcNCj4gPj4+IG5l ZWQgdG8gYmUgZW5hYmxlZDoNCj4gPj4+IC0gQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fSEVBREVS DQo+ID4+PiAtIENPTkZJR19BUkNIX0hJQkVSTkFUSU9OX1BPU1NJQkxFDQo+ID4+Pg0KPiA+Pj4g U2lnbmVkLW9mZi1ieTogU2lhIEplZSBIZW5nIDxqZWVoZW5nLnNpYUBzdGFyZml2ZXRlY2guY29t Pg0KPiA+Pj4gUmV2aWV3ZWQtYnk6IExleSBGb29uIFRhbiA8bGV5Zm9vbi50YW5Ac3RhcmZpdmV0 ZWNoLmNvbT4NCj4gPj4+IFJldmlld2VkLWJ5OiBNYXNvbiBIdW8gPG1hc29uLmh1b0BzdGFyZml2 ZXRlY2guY29tPg0KPiA+Pj4gLS0tDQo+ID4+PiAgICBhcmNoL3Jpc2N2L0tjb25maWcgICAgICAg ICAgICAgICAgIHwgICA3ICsNCj4gPj4+ICAgIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vYXNzZW1i bGVyLmggfCAgMjAgKysNCj4gPj4+ICAgIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vc3VzcGVuZC5o ICAgfCAgMjEgKysNCj4gPj4+ICAgIGFyY2gvcmlzY3Yva2VybmVsL01ha2VmaWxlICAgICAgICAg fCAgIDEgKw0KPiA+Pj4gICAgYXJjaC9yaXNjdi9rZXJuZWwvYXNtLW9mZnNldHMuYyAgICB8ICAg NSArDQo+ID4+PiAgICBhcmNoL3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMgIHwgIDg5ICsr KysrKysNCj4gPj4+ICAgIGFyY2gvcmlzY3Yva2VybmVsL2hpYmVybmF0ZS5jICAgICAgfCAzNjAg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gPj4+ICAgIDcgZmlsZXMgY2hhbmdlZCwg NTAzIGluc2VydGlvbnMoKykNCj4gPj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2 L2tlcm5lbC9oaWJlcm5hdGUtYXNtLlMNCj4gPj4+ICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNo L3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYw0KPiA+Pj4NCj4gPj4+IGRpZmYgLS1naXQgYS9hcmNo L3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWcNCj4gPj4+IGluZGV4IGUyYjY1NjA0 M2FiZi4uNDU1NTg0OGE4MTdmIDEwMDY0NA0KPiA+Pj4gLS0tIGEvYXJjaC9yaXNjdi9LY29uZmln DQo+ID4+PiArKysgYi9hcmNoL3Jpc2N2L0tjb25maWcNCj4gPj4+IEBAIC02OTAsNiArNjkwLDEz IEBAIG1lbnUgIlBvd2VyIG1hbmFnZW1lbnQgb3B0aW9ucyINCj4gPj4+DQo+ID4+PiAgICBzb3Vy Y2UgImtlcm5lbC9wb3dlci9LY29uZmlnIg0KPiA+Pj4NCj4gPj4+ICtjb25maWcgQVJDSF9ISUJF Uk5BVElPTl9QT1NTSUJMRQ0KPiA+Pj4gKwlkZWZfYm9vbCB5DQo+ID4+PiArDQo+ID4+PiArY29u ZmlnIEFSQ0hfSElCRVJOQVRJT05fSEVBREVSDQo+ID4+PiArCWRlZl9ib29sIHkNCj4gPj4+ICsJ ZGVwZW5kcyBvbiBISUJFUk5BVElPTg0KPiA+Pj4gKw0KPiA+Pj4gICAgZW5kbWVudSAjICJQb3dl ciBtYW5hZ2VtZW50IG9wdGlvbnMiDQo+ID4+Pg0KPiA+Pj4gICAgbWVudSAiQ1BVIFBvd2VyIE1h bmFnZW1lbnQiDQo+ID4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9hc3Nl bWJsZXIuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vYXNzZW1ibGVyLmgNCj4gPj4+IGluZGV4 IGVmMTI4M2QwNGI3MC4uM2RlNzBkM2U2Y2ViIDEwMDY0NA0KPiA+Pj4gLS0tIGEvYXJjaC9yaXNj di9pbmNsdWRlL2FzbS9hc3NlbWJsZXIuaA0KPiA+Pj4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRl L2FzbS9hc3NlbWJsZXIuaA0KPiA+Pj4gQEAgLTU5LDQgKzU5LDI0IEBADQo+ID4+PiAgICAJCVJF R19MCXMxMSwgKFNVU1BFTkRfQ09OVEVYVF9SRUdTICsgUFRfUzExKShhMCkNCj4gPj4+ICAgIAku ZW5kbQ0KPiA+Pj4NCj4gPj4+ICsvKioNCj4gPj4+ICsgKiBjb3B5X3BhZ2UgLSBjb3B5IDEgcGFn ZSAoNEtCKSBvZiBkYXRhIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uDQo+ID4+PiArICogQGEw IC0gZGVzdGluYXRpb24NCj4gPj4+ICsgKiBAYTEgLSBzb3VyY2UNCj4gPj4+ICsgKi8NCj4gPj4+ ICsJLm1hY3JvCWNvcHlfcGFnZSBhMCwgYTENCj4gPj4+ICsJCWx1aQlhMiwgMHgxDQo+ID4+PiAr CQlhZGQJYTIsIGEyLCBhMA0KPiA+Pj4gKy4xIDoNCj4gPj4+ICsJCVJFR19MCXQwLCAwKGExKQ0K PiA+Pj4gKwkJUkVHX0wJdDEsIFNaUkVHKGExKQ0KPiA+Pj4gKw0KPiA+Pj4gKwkJUkVHX1MJdDAs IDAoYTApDQo+ID4+PiArCQlSRUdfUwl0MSwgU1pSRUcoYTApDQo+ID4+PiArDQo+ID4+PiArCQlh ZGRpCWEwLCBhMCwgMiAqIFNaUkVHDQo+ID4+PiArCQlhZGRpCWExLCBhMSwgMiAqIFNaUkVHDQo+ ID4+PiArCQlibmUJYTIsIGEwLCAuMQ0KPiA+Pj4gKwkuZW5kbQ0KPiA+Pj4gKw0KPiA+Pj4gICAg I2VuZGlmCS8qIF9fQVNNX0FTU0VNQkxFUl9IICovDQo+ID4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N1c3Bl bmQuaA0KPiA+Pj4gaW5kZXggNzU0MTljNWNhMjcyLi5kYjQwYWU0MzNhYTkgMTAwNjQ0DQo+ID4+ PiAtLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N1c3BlbmQuaA0KPiA+Pj4gKysrIGIvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9zdXNwZW5kLmgNCj4gPj4+IEBAIC0yMSw2ICsyMSwxMiBAQCBz dHJ1Y3Qgc3VzcGVuZF9jb250ZXh0IHsNCj4gPj4+ICAgICNlbmRpZg0KPiA+Pj4gICAgfTsNCj4g Pj4+DQo+ID4+PiArLyoNCj4gPj4+ICsgKiBUaGlzIHBhcmFtZXRlciB3aWxsIGJlIGFzc2lnbmVk IHRvIDAgZHVyaW5nIHJlc3VtZSBhbmQgd2lsbCBiZSB1c2VkIGJ5DQo+ID4+PiArICogaGliZXJu YXRpb24gY29yZSBmb3IgdGhlIHN1YnNlcXVlbnQgcmVzdW1lIHNlcXVlbmNlDQo+ID4+PiArICov DQo+ID4+PiArZXh0ZXJuIGludCBpbl9zdXNwZW5kOw0KPiA+Pj4gKw0KPiA+Pj4gICAgLyogTG93 LWxldmVsIENQVSBzdXNwZW5kIGVudHJ5IGZ1bmN0aW9uICovDQo+ID4+PiAgICBpbnQgX19jcHVf c3VzcGVuZF9lbnRlcihzdHJ1Y3Qgc3VzcGVuZF9jb250ZXh0ICpjb250ZXh0KTsNCj4gPj4+DQo+ ID4+PiBAQCAtMzYsNCArNDIsMTkgQEAgaW50IF9fY3B1X3Jlc3VtZV9lbnRlcih1bnNpZ25lZCBs b25nIGhhcnRpZCwgdW5zaWduZWQgbG9uZyBjb250ZXh0KTsNCj4gPj4+ICAgIC8qIFVzZWQgdG8g c2F2ZSBhbmQgcmVzdG9yZSB0aGUgY3NyICovDQo+ID4+PiAgICB2b2lkIHN1c3BlbmRfc2F2ZV9j c3JzKHN0cnVjdCBzdXNwZW5kX2NvbnRleHQgKmNvbnRleHQpOw0KPiA+Pj4gICAgdm9pZCBzdXNw ZW5kX3Jlc3RvcmVfY3NycyhzdHJ1Y3Qgc3VzcGVuZF9jb250ZXh0ICpjb250ZXh0KTsNCj4gPj4+ ICsNCj4gPj4+ICsvKiBMb3ctbGV2ZWwgQVBJIHRvIHN1cHBvcnQgaGliZXJuYXRpb24gKi8NCj4g Pj4+ICtpbnQgc3dzdXNwX2FyY2hfc3VzcGVuZCh2b2lkKTsNCj4gPj4+ICtpbnQgc3dzdXNwX2Fy Y2hfcmVzdW1lKHZvaWQpOw0KPiA+Pj4gK2ludCBhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9zYXZl KHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSk7DQo+ID4+PiAraW50IGFyY2hfaGli ZXJuYXRpb25faGVhZGVyX3Jlc3RvcmUodm9pZCAqYWRkcik7DQo+ID4+PiAraW50IF9faGliZXJu YXRlX2NwdV9yZXN1bWUodm9pZCk7DQo+ID4+PiArDQo+ID4+PiArLyogVXNlZCB0byByZXN1bWUg b24gdGhlIENQVSB3ZSBoaWJlcm5hdGVkIG9uICovDQo+ID4+PiAraW50IGhpYmVybmF0ZV9yZXN1 bWVfbm9uYm9vdF9jcHVfZGlzYWJsZSh2b2lkKTsNCj4gPj4+ICsNCj4gPj4+ICsvKiBVc2VkIHRv IHJlc3RvcmUgdGhlIGhpYmVybmF0ZWQgaW1hZ2UgKi8NCj4gPj4+ICthc21saW5rYWdlIHZvaWQg cmVzdG9yZV9pbWFnZSh1bnNpZ25lZCBsb25nIHJlc3VtZV9zYXRwLCB1bnNpZ25lZCBsb25nIHNh dHBfdGVtcCwNCj4gPj4+ICsJCQkJdW5zaWduZWQgbG9uZyBjcHVfcmVzdW1lKTsNCj4gPj4+ICth c21saW5rYWdlIGludCBjb3JlX3Jlc3RvcmVfY29kZSh2b2lkKTsNCj4gPj4+ICAgICNlbmRpZg0K PiA+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL01ha2VmaWxlIGIvYXJjaC9yaXNj di9rZXJuZWwvTWFrZWZpbGUNCj4gPj4+IGluZGV4IDRjZjMwM2E3NzlhYi4uZGFhYjM0MWQ1NWU0 IDEwMDY0NA0KPiA+Pj4gLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwvTWFrZWZpbGUNCj4gPj4+ICsr KyBiL2FyY2gvcmlzY3Yva2VybmVsL01ha2VmaWxlDQo+ID4+PiBAQCAtNjQsNiArNjQsNyBAQCBv YmotJChDT05GSUdfTU9EVUxFUykJCSs9IG1vZHVsZS5vDQo+ID4+PiAgICBvYmotJChDT05GSUdf TU9EVUxFX1NFQ1RJT05TKQkrPSBtb2R1bGUtc2VjdGlvbnMubw0KPiA+Pj4NCj4gPj4+ICAgIG9i ai0kKENPTkZJR19DUFVfUE0pCQkrPSBzdXNwZW5kX2VudHJ5Lm8gc3VzcGVuZC5vDQo+ID4+PiAr b2JqLSQoQ09ORklHX0hJQkVSTkFUSU9OKQkrPSBoaWJlcm5hdGUubyBoaWJlcm5hdGUtYXNtLm8N Cj4gPj4+DQo+ID4+PiAgICBvYmotJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKQkrPSBtY291bnQu byBmdHJhY2Uubw0KPiA+Pj4gICAgb2JqLSQoQ09ORklHX0RZTkFNSUNfRlRSQUNFKQkrPSBtY291 bnQtZHluLm8NCj4gPj4+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9hc20tb2Zmc2V0 cy5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvYXNtLW9mZnNldHMuYw0KPiA+Pj4gaW5kZXggZGY5NDQ0 Mzk3OTA4Li5kNmE3NWFhYzFkMjcgMTAwNjQ0DQo+ID4+PiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5l bC9hc20tb2Zmc2V0cy5jDQo+ID4+PiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9hc20tb2Zmc2V0 cy5jDQo+ID4+PiBAQCAtOSw2ICs5LDcgQEANCj4gPj4+ICAgICNpbmNsdWRlIDxsaW51eC9rYnVp bGQuaD4NCj4gPj4+ICAgICNpbmNsdWRlIDxsaW51eC9tbS5oPg0KPiA+Pj4gICAgI2luY2x1ZGUg PGxpbnV4L3NjaGVkLmg+DQo+ID4+PiArI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4NCj4gPj4+ ICAgICNpbmNsdWRlIDxhc20va3ZtX2hvc3QuaD4NCj4gPj4+ICAgICNpbmNsdWRlIDxhc20vdGhy ZWFkX2luZm8uaD4NCj4gPj4+ICAgICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+DQo+ID4+PiBAQCAt MTE2LDYgKzExNywxMCBAQCB2b2lkIGFzbV9vZmZzZXRzKHZvaWQpDQo+ID4+Pg0KPiA+Pj4gICAg CU9GRlNFVChTVVNQRU5EX0NPTlRFWFRfUkVHUywgc3VzcGVuZF9jb250ZXh0LCByZWdzKTsNCj4g Pj4+DQo+ID4+PiArCU9GRlNFVChISUJFUk5fUEJFX0FERFIsIHBiZSwgYWRkcmVzcyk7DQo+ID4+ PiArCU9GRlNFVChISUJFUk5fUEJFX09SSUcsIHBiZSwgb3JpZ19hZGRyZXNzKTsNCj4gPj4+ICsJ T0ZGU0VUKEhJQkVSTl9QQkVfTkVYVCwgcGJlLCBuZXh0KTsNCj4gPj4+ICsNCj4gPj4+ICAgIAlP RkZTRVQoS1ZNX0FSQ0hfR1VFU1RfWkVSTywga3ZtX3ZjcHVfYXJjaCwgZ3Vlc3RfY29udGV4dC56 ZXJvKTsNCj4gPj4+ICAgIAlPRkZTRVQoS1ZNX0FSQ0hfR1VFU1RfUkEsIGt2bV92Y3B1X2FyY2gs IGd1ZXN0X2NvbnRleHQucmEpOw0KPiA+Pj4gICAgCU9GRlNFVChLVk1fQVJDSF9HVUVTVF9TUCwg a3ZtX3ZjcHVfYXJjaCwgZ3Vlc3RfY29udGV4dC5zcCk7DQo+ID4+PiBkaWZmIC0tZ2l0IGEvYXJj aC9yaXNjdi9rZXJuZWwvaGliZXJuYXRlLWFzbS5TIGIvYXJjaC9yaXNjdi9rZXJuZWwvaGliZXJu YXRlLWFzbS5TDQo+ID4+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+Pj4gaW5kZXggMDAwMDAw MDAwMDAwLi5hODNkNTM0Yjg5YmQNCj4gPj4+IC0tLSAvZGV2L251bGwNCj4gPj4+ICsrKyBiL2Fy Y2gvcmlzY3Yva2VybmVsL2hpYmVybmF0ZS1hc20uUw0KPiA+Pj4gQEAgLTAsMCArMSw4OSBAQA0K PiA+Pj4gKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wLW9ubHkgKi8NCj4gPj4+ ICsvKg0KPiA+Pj4gKyAqIEhpYmVybmF0aW9uIHN1cHBvcnQgc3BlY2lmaWMgZm9yIFJJU0NWDQo+ ID4+PiArICoNCj4gPj4+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjMgU3RhckZpdmUgVGVjaG5vbG9n eSBDby4sIEx0ZC4NCj4gPj4+ICsgKg0KPiA+Pj4gKyAqIEF1dGhvcjogSmVlIEhlbmcgU2lhIDxq ZWVoZW5nLnNpYUBzdGFyZml2ZXRlY2guY29tPg0KPiA+Pj4gKyAqLw0KPiA+Pj4gKw0KPiA+Pj4g KyNpbmNsdWRlIDxhc20vYXNtLmg+DQo+ID4+PiArI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5o Pg0KPiA+Pj4gKyNpbmNsdWRlIDxhc20vYXNzZW1ibGVyLmg+DQo+ID4+PiArI2luY2x1ZGUgPGFz bS9jc3IuaD4NCj4gPj4+ICsNCj4gPj4+ICsjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPg0KPiA+ Pj4gKw0KPiA+Pj4gKy8qDQo+ID4+PiArICogVGhpcyBjb2RlIGlzIGV4ZWN1dGVkIHdoZW4gcmVz dW1lIGZyb20gdGhlIGhpYmVybmF0aW9uLg0KPiA+Pj4gKyAqDQo+ID4+PiArICogSXQgYmVnaW5z IHdpdGggbG9hZGluZyB0aGUgdGVtcG9yYXJ5IHBhZ2UgdGFibGUgdGhlbiByZXN0b3JlcyB0aGUg bWVtb3J5IGltYWdlLg0KPiA+Pj4gKyAqIEZpbmFsbHkgYnJhbmNoZXMgdG8gX19oaWJlcm5hdGVf Y3B1X3Jlc3VtZSgpIHRvIHJlc3RvcmUgdGhlIHN0YXRlIHNhdmVkIGJ5DQo+ID4+PiArICogc3dz dXNwX2FyY2hfc3VzcGVuZCgpLg0KPiA+Pj4gKyAqLw0KPiA+Pj4gKw0KPiA+Pj4gKy8qDQo+ID4+ PiArICogaW50IF9faGliZXJuYXRlX2NwdV9yZXN1bWUodm9pZCkNCj4gPj4+ICsgKiBTd2l0Y2gg YmFjayB0byB0aGUgaGliZXJuYXRlZCBpbWFnZSdzIHBhZ2UgdGFibGUgcHJpb3IgdG8gcmVzdG9y ZSB0aGUgQ1BVDQo+ID4+PiArICogY29udGV4dC4NCj4gPj4+ICsgKg0KPiA+Pj4gKyAqIEFsd2F5 cyByZXR1cm5zIDAgdG8gdGhlIEMgY29kZS4NCj4gPj4+ICsgKi8NCj4gPj4+ICtFTlRSWShfX2hp YmVybmF0ZV9jcHVfcmVzdW1lKQ0KPiA+Pj4gKwkvKiBzd2l0Y2ggdG8gaGliZXJuYXRlZCBpbWFn ZSdzIHBhZ2UgdGFibGUgKi8NCj4gPj4+ICsJY3NydyBDU1JfU0FUUCwgczANCj4gPj4+ICsJc2Zl bmNlLnZtYQ0KPiA+Pj4gKw0KPiA+Pj4gKwlSRUdfTAlhMCwgaGliZXJuYXRlX2NwdV9jb250ZXh0 DQo+ID4+PiArDQo+ID4+PiArCS8qIFJlc3RvcmUgQ1NScyAqLw0KPiA+Pj4gKwlyZXN0b3JlX2Nz cg0KPiA+Pj4gKw0KPiA+Pj4gKwkvKiBSZXN0b3JlIHJlZ2lzdGVycyAoZXhjZXB0IEEwIGFuZCBU MC1UNikgKi8NCj4gPj4+ICsJcmVzdG9yZV9yZWcNCj4gPj4+ICsNCj4gPj4+ICsJLyogUmV0dXJu IHplcm8gdmFsdWUgKi8NCj4gPj4+ICsJYWRkCWEwLCB6ZXJvLCB6ZXJvDQo+ID4+PiArDQo+ID4+ PiArCS8qIFJldHVybiB0byBDIGNvZGUgKi8NCj4gPj4+ICsJcmV0DQo+ID4+PiArRU5EKF9faGli ZXJuYXRlX2NwdV9yZXN1bWUpDQo+ID4+PiArDQo+ID4+PiArLyoNCj4gPj4+ICsgKiBQcmVwYXJl IHRvIHJlc3RvcmUgdGhlIGltYWdlLg0KPiA+Pj4gKyAqIGEwOiBzYXRwIG9mIHNhdmVkIHBhZ2Ug dGFibGVzDQo+ID4+PiArICogYTE6IHNhdHAgb2YgdGVtcG9yYXJ5IHBhZ2UgdGFibGVzDQo+ID4+ PiArICogYTI6IGNwdV9yZXN1bWUNCj4gPj4+ICsgKi8NCj4gPj4+ICtFTlRSWShyZXN0b3JlX2lt YWdlKQ0KPiA+Pj4gKwltdglzMCwgYTANCj4gPj4+ICsJbXYJczEsIGExDQo+ID4+PiArCW12CXMy LCBhMg0KPiA+Pj4gKwlSRUdfTAlzNCwgcmVzdG9yZV9wYmxpc3QNCj4gPj4+ICsJUkVHX0wJYTEs IHJlbG9jYXRlZF9yZXN0b3JlX2NvZGUNCj4gPj4+ICsNCj4gPj4+ICsJamFscglhMQ0KPiA+Pj4g K0VORChyZXN0b3JlX2ltYWdlKQ0KPiA+Pj4gKw0KPiA+Pj4gKy8qDQo+ID4+PiArICogVGhlIGJl bG93IGNvZGUgd2lsbCBiZSBleGVjdXRlZCBmcm9tIGEgJ3NhZmUnIHBhZ2UuDQo+ID4+PiArICog SXQgZmlyc3Qgc3dpdGNoZXMgdG8gdGhlIHRlbXBvcmFyeSBwYWdlIHRhYmxlLCB0aGVuIHN0YXJ0 IHRvIGNvcHkgdGhlIHBhZ2VzDQo+ID4+PiArICogYmFjayB0byB0aGUgb3JpZ2luYWwgbWVtb3J5 IGxvY2F0aW9uLiBGaW5hbGx5LCBpdCBqdW1wcyB0byB0aGUgX19oaWJlcm5hdGVfY3B1X3Jlc3Vt ZSgpDQo+ID4+PiArICogdG8gcmVzdG9yZSB0aGUgQ1BVIGNvbnRleHQuDQo+ID4+PiArICovDQo+ ID4+PiArRU5UUlkoY29yZV9yZXN0b3JlX2NvZGUpDQo+ID4+PiArCS8qIHN3aXRjaCB0byB0ZW1w IHBhZ2UgdGFibGUgKi8NCj4gPj4+ICsJY3NydyBzYXRwLCBzMQ0KPiA+Pj4gKwlzZmVuY2Uudm1h DQo+ID4+PiArLkxjb3B5Og0KPiA+Pj4gKwkvKiBUaGUgYmVsb3cgY29kZSB3aWxsIHJlc3RvcmUg dGhlIGhpYmVybmF0ZWQgaW1hZ2UuICovDQo+ID4+PiArCVJFR19MCWExLCBISUJFUk5fUEJFX0FE RFIoczQpDQo+ID4+PiArCVJFR19MCWEwLCBISUJFUk5fUEJFX09SSUcoczQpDQo+ID4+PiArDQo+ ID4+PiArCWNvcHlfcGFnZSBhMCwgYTENCj4gPj4+ICsNCj4gPj4+ICsJUkVHX0wJczQsIEhJQkVS Tl9QQkVfTkVYVChzNCkNCj4gPj4+ICsJYm5leglzNCwgLkxjb3B5DQo+ID4+PiArDQo+ID4+PiAr CWphbHIJczINCj4gPj4+ICtFTkQoY29yZV9yZXN0b3JlX2NvZGUpDQo+ID4+PiBkaWZmIC0tZ2l0 IGEvYXJjaC9yaXNjdi9rZXJuZWwvaGliZXJuYXRlLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9oaWJl cm5hdGUuYw0KPiA+Pj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPj4+IGluZGV4IDAwMDAwMDAw MDAwMC4uYmY3ZjNjNzgxODIwDQo+ID4+PiAtLS0gL2Rldi9udWxsDQo+ID4+PiArKysgYi9hcmNo L3Jpc2N2L2tlcm5lbC9oaWJlcm5hdGUuYw0KPiA+Pj4gQEAgLTAsMCArMSwzNjAgQEANCj4gPj4+ ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5DQo+ID4+PiArLyoNCj4g Pj4+ICsgKiBIaWJlcm5hdGlvbiBzdXBwb3J0IHNwZWNpZmljIGZvciBSSVNDVg0KPiA+Pj4gKyAq DQo+ID4+PiArICogQ29weXJpZ2h0IChDKSAyMDIzIFN0YXJGaXZlIFRlY2hub2xvZ3kgQ28uLCBM dGQuDQo+ID4+PiArICoNCj4gPj4+ICsgKiBBdXRob3I6IEplZSBIZW5nIFNpYSA8amVlaGVuZy5z aWFAc3RhcmZpdmV0ZWNoLmNvbT4NCj4gPj4+ICsgKi8NCj4gPj4+ICsNCj4gPj4+ICsjaW5jbHVk ZSA8YXNtL2JhcnJpZXIuaD4NCj4gPj4+ICsjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4NCj4g Pj4+ICsjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+DQo+ID4+PiArI2luY2x1ZGUgPGFzbS9w YWdlLmg+DQo+ID4+PiArI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+DQo+ID4+PiArI2luY2x1ZGUg PGFzbS9zZWN0aW9ucy5oPg0KPiA+Pj4gKyNpbmNsdWRlIDxhc20vc2V0X21lbW9yeS5oPg0KPiA+ Pj4gKyNpbmNsdWRlIDxhc20vc21wLmg+DQo+ID4+PiArI2luY2x1ZGUgPGFzbS9zdXNwZW5kLmg+ DQo+ID4+PiArDQo+ID4+PiArI2luY2x1ZGUgPGxpbnV4L2NwdS5oPg0KPiA+Pj4gKyNpbmNsdWRl IDxsaW51eC9tZW1ibG9jay5oPg0KPiA+Pj4gKyNpbmNsdWRlIDxsaW51eC9wbS5oPg0KPiA+Pj4g KyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPg0KPiA+Pj4gKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5k Lmg+DQo+ID4+PiArI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4NCj4gPj4+ICsNCj4gPj4+ICsv KiBUaGUgbG9naWNhbCBjcHUgbnVtYmVyIHdlIHNob3VsZCByZXN1bWUgb24sIGluaXRpYWxpc2Vk IHRvIGEgbm9uLWNwdSBudW1iZXIgKi8NCj4gPj4+ICtzdGF0aWMgaW50IHNsZWVwX2NwdSA9IC1F SU5WQUw7DQo+ID4+PiArDQo+ID4+PiArLyogQ1BVIGNvbnRleHQgdG8gYmUgc2F2ZWQgKi8NCj4g Pj4+ICtzdHJ1Y3Qgc3VzcGVuZF9jb250ZXh0ICpoaWJlcm5hdGVfY3B1X2NvbnRleHQ7DQo+ID4+ PiArDQo+ID4+PiArdW5zaWduZWQgbG9uZyByZWxvY2F0ZWRfcmVzdG9yZV9jb2RlOw0KPiA+Pj4g Kw0KPiA+Pj4gKy8qIFBvaW50ZXIgdG8gdGhlIHRlbXBvcmFyeSByZXN1bWUgcGFnZSB0YWJsZSAq Lw0KPiA+Pj4gK3BnZF90ICpyZXN1bWVfcGdfZGlyOw0KPiA+Pj4gKw0KPiA+Pj4gKy8qKg0KPiA+ Pj4gKyAqIHN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHJfaW52YXJpYW50cyAtIGNvbnRhaW5lciB0 byBzdG9yZSBrZXJuZWwgYnVpbGQgdmVyc2lvbg0KPiA+Pj4gKyAqIEB1dHNfdmVyc2lvbjogdG8g c2F2ZSB0aGUgYnVpbGQgbnVtYmVyIGFuZCBkYXRlIHNvIHRoYXQgdGhlIHdlIGFyZSBub3QgcmVz dW1lIHdpdGgNCj4gPj4+ICsgKgkJYSBkaWZmZXJlbnQga2VybmVsDQo+ID4+PiArICovDQo+ID4+ PiArc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkcl9pbnZhcmlhbnRzIHsNCj4gPj4+ICsJY2hhcgkJ dXRzX3ZlcnNpb25bX19ORVdfVVRTX0xFTiArIDFdOw0KPiA+Pj4gK307DQo+ID4+PiArDQo+ID4+ PiArLyoqDQo+ID4+PiArICogc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkciAtIGhlbHBlciBwYXJh bWV0ZXJzIHRoYXQgaGVscCB1cyB0byByZXN0b3JlIHRoZSBpbWFnZQ0KPiA+Pj4gKyAqIEBpbnZh cmlhbnRzOiBjb250YWluZXIgdG8gc3RvcmUga2VybmVsIGJ1aWxkIHZlcnNpb24NCj4gPj4+ICsg KiBAaGFydGlkOiB0byBtYWtlIHN1cmUgc2FtZSBib290X2NwdSBleGVjdXRpbmcgdGhlIGhpYmVy bmF0ZS9yZXN0b3JlIGNvZGUuDQo+ID4+PiArICogQHNhdmVkX3NhdHA6IG9yaWdpbmFsIHBhZ2Ug dGFibGUgdXNlZCBieSB0aGUgaGliZXJuYXRlZCBpbWFnZS4NCj4gPj4+ICsgKiBAcmVzdG9yZV9j cHVfYWRkcjogdGhlIGtlcm5lbCdzIGltYWdlIGFkZHJlc3MgdG8gcmVzdG9yZSB0aGUgQ1BVIGNv bnRleHQuDQo+ID4+PiArICovDQo+ID4+PiArc3RhdGljIHN0cnVjdCBhcmNoX2hpYmVybmF0ZV9o ZHIgew0KPiA+Pj4gKwlzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMgaW52YXJp YW50czsNCj4gPj4+ICsJdW5zaWduZWQgbG9uZwloYXJ0aWQ7DQo+ID4+PiArCXVuc2lnbmVkIGxv bmcJc2F2ZWRfc2F0cDsNCj4gPj4+ICsJdW5zaWduZWQgbG9uZwlyZXN0b3JlX2NwdV9hZGRyOw0K PiA+Pj4gK30gcmVzdW1lX2hkcjsNCj4gPj4+ICsNCj4gPj4+ICtzdGF0aWMgaW5saW5lIHZvaWQg YXJjaF9oZHJfaW52YXJpYW50cyhzdHJ1Y3QgYXJjaF9oaWJlcm5hdGVfaGRyX2ludmFyaWFudHMg KmkpDQo+ID4+PiArew0KPiA+Pj4gKwltZW1zZXQoaSwgMCwgc2l6ZW9mKCppKSk7DQo+ID4+PiAr CW1lbWNweShpLT51dHNfdmVyc2lvbiwgaW5pdF91dHNuYW1lKCktPnZlcnNpb24sIHNpemVvZihp LT51dHNfdmVyc2lvbikpOw0KPiA+Pj4gK30NCj4gPj4+ICsNCj4gPj4+ICsvKg0KPiA+Pj4gKyAq IENoZWNrIGlmIHRoZSBnaXZlbiBwZm4gaXMgaW4gdGhlICdub3NhdmUnIHNlY3Rpb24uDQo+ID4+ PiArICovDQo+ID4+PiAraW50IHBmbl9pc19ub3NhdmUodW5zaWduZWQgbG9uZyBwZm4pDQo+ID4+ PiArew0KPiA+Pj4gKwl1bnNpZ25lZCBsb25nIG5vc2F2ZV9iZWdpbl9wZm4gPSBzeW1fdG9fcGZu KCZfX25vc2F2ZV9iZWdpbik7DQo+ID4+PiArCXVuc2lnbmVkIGxvbmcgbm9zYXZlX2VuZF9wZm4g PSBzeW1fdG9fcGZuKCZfX25vc2F2ZV9lbmQgLSAxKTsNCj4gPj4+ICsNCj4gPj4+ICsJcmV0dXJu ICgocGZuID49IG5vc2F2ZV9iZWdpbl9wZm4pICYmIChwZm4gPD0gbm9zYXZlX2VuZF9wZm4pKTsN Cj4gPj4+ICt9DQo+ID4+PiArDQo+ID4+PiArdm9pZCBub3RyYWNlIHNhdmVfcHJvY2Vzc29yX3N0 YXRlKHZvaWQpDQo+ID4+PiArew0KPiA+Pj4gKwlXQVJOX09OKG51bV9vbmxpbmVfY3B1cygpICE9 IDEpOw0KPiA+Pj4gK30NCj4gPj4+ICsNCj4gPj4+ICt2b2lkIG5vdHJhY2UgcmVzdG9yZV9wcm9j ZXNzb3Jfc3RhdGUodm9pZCkNCj4gPj4+ICt7DQo+ID4+PiArfQ0KPiA+Pj4gKw0KPiA+Pj4gKy8q DQo+ID4+PiArICogSGVscGVyIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBzYXZlZCB0byB0aGUgaGli ZXJuYXRpb24gaW1hZ2UgaGVhZGVyLg0KPiA+Pj4gKyAqLw0KPiA+Pj4gK2ludCBhcmNoX2hpYmVy bmF0aW9uX2hlYWRlcl9zYXZlKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGludCBtYXhfc2l6ZSkNCj4g Pj4+ICt7DQo+ID4+PiArCXN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHIgKmhkciA9IGFkZHI7DQo+ ID4+PiArDQo+ID4+PiArCWlmIChtYXhfc2l6ZSA8IHNpemVvZigqaGRyKSkNCj4gPj4+ICsJCXJl dHVybiAtRU9WRVJGTE9XOw0KPiA+Pj4gKw0KPiA+Pj4gKwlhcmNoX2hkcl9pbnZhcmlhbnRzKCZo ZHItPmludmFyaWFudHMpOw0KPiA+Pj4gKw0KPiA+Pj4gKwloZHItPmhhcnRpZCA9IGNwdWlkX3Rv X2hhcnRpZF9tYXAoc2xlZXBfY3B1KTsNCj4gPj4+ICsJaGRyLT5zYXZlZF9zYXRwID0gY3NyX3Jl YWQoQ1NSX1NBVFApOw0KPiA+Pj4gKwloZHItPnJlc3RvcmVfY3B1X2FkZHIgPSAodW5zaWduZWQg bG9uZylfX2hpYmVybmF0ZV9jcHVfcmVzdW1lOw0KPiA+Pj4gKw0KPiA+Pj4gKwlyZXR1cm4gMDsN Cj4gPj4+ICt9DQo+ID4+PiArRVhQT1JUX1NZTUJPTChhcmNoX2hpYmVybmF0aW9uX2hlYWRlcl9z YXZlKTsNCj4gPj4+ICsNCj4gPj4+ICsvKg0KPiA+Pj4gKyAqIFJldHJpZXZlIHRoZSBoZWxwZXIg cGFyYW1ldGVycyBmcm9tIHRoZSBoaWJlcm5hdGlvbiBpbWFnZSBoZWFkZXINCj4gPj4+ICsgKi8N Cj4gPj4+ICtpbnQgYXJjaF9oaWJlcm5hdGlvbl9oZWFkZXJfcmVzdG9yZSh2b2lkICphZGRyKQ0K PiA+Pj4gK3sNCj4gPj4+ICsJc3RydWN0IGFyY2hfaGliZXJuYXRlX2hkcl9pbnZhcmlhbnRzIGlu dmFyaWFudHM7DQo+ID4+PiArCXN0cnVjdCBhcmNoX2hpYmVybmF0ZV9oZHIgKmhkciA9IGFkZHI7 DQo+ID4+PiArCWludCByZXQgPSAwOw0KPiA+Pj4gKw0KPiA+Pj4gKwlhcmNoX2hkcl9pbnZhcmlh bnRzKCZpbnZhcmlhbnRzKTsNCj4gPj4+ICsNCj4gPj4+ICsJaWYgKG1lbWNtcCgmaGRyLT5pbnZh cmlhbnRzLCAmaW52YXJpYW50cywgc2l6ZW9mKGludmFyaWFudHMpKSkgew0KPiA+Pj4gKwkJcHJf Y3JpdCgiSGliZXJuYXRlIGltYWdlIG5vdCBnZW5lcmF0ZWQgYnkgdGhpcyBrZXJuZWwhXG4iKTsN Cj4gPj4+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+Pj4gKwl9DQo+ID4+PiArDQo+ID4+PiArCXNs ZWVwX2NwdSA9IHJpc2N2X2hhcnRpZF90b19jcHVpZChoZHItPmhhcnRpZCk7DQo+ID4+PiArCWlm IChzbGVlcF9jcHUgPCAwKSB7DQo+ID4+PiArCQlwcl9jcml0KCJIaWJlcm5hdGVkIG9uIGEgQ1BV IG5vdCBrbm93biB0byB0aGlzIGtlcm5lbCFcbiIpOw0KPiA+Pj4gKwkJc2xlZXBfY3B1ID0gLUVJ TlZBTDsNCj4gPj4+ICsJCXJldHVybiAtRUlOVkFMOw0KPiA+Pj4gKwl9DQo+ID4+PiArDQo+ID4+ PiArI2lmZGVmIENPTkZJR19TTVANCj4gPj4+ICsJcmV0ID0gYnJpbmd1cF9oaWJlcm5hdGVfY3B1 KHNsZWVwX2NwdSk7DQo+ID4+PiArCWlmIChyZXQpIHsNCj4gPj4+ICsJCXNsZWVwX2NwdSA9IC1F SU5WQUw7DQo+ID4+PiArCQlyZXR1cm4gcmV0Ow0KPiA+Pj4gKwl9DQo+ID4+PiArI2VuZGlmDQo+ ID4+PiArCXJlc3VtZV9oZHIgPSAqaGRyOw0KPiA+Pj4gKw0KPiA+Pj4gKwlyZXR1cm4gcmV0Ow0K PiA+Pj4gK30NCj4gPj4+ICtFWFBPUlRfU1lNQk9MKGFyY2hfaGliZXJuYXRpb25faGVhZGVyX3Jl c3RvcmUpOw0KPiA+Pj4gKw0KPiA+Pj4gK2ludCBzd3N1c3BfYXJjaF9zdXNwZW5kKHZvaWQpDQo+ ID4+PiArew0KPiA+Pj4gKwlpbnQgcmV0ID0gMDsNCj4gPj4+ICsNCj4gPj4+ICsJaWYgKF9fY3B1 X3N1c3BlbmRfZW50ZXIoaGliZXJuYXRlX2NwdV9jb250ZXh0KSkgew0KPiA+Pj4gKwkJc2xlZXBf Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOw0KPiA+Pj4gKwkJc3VzcGVuZF9zYXZlX2NzcnMoaGli ZXJuYXRlX2NwdV9jb250ZXh0KTsNCj4gPj4+ICsJCXJldCA9IHN3c3VzcF9zYXZlKCk7DQo+ID4+ PiArCX0gZWxzZSB7DQo+ID4+PiArCQlzdXNwZW5kX3Jlc3RvcmVfY3NycyhoaWJlcm5hdGVfY3B1 X2NvbnRleHQpOw0KPiA+Pj4gKwkJZmx1c2hfdGxiX2FsbCgpOw0KPiA+Pj4gKw0KPiA+Pj4gKwkJ LyogSW52YWxpZGF0ZWQgSWNhY2hlICovDQo+ID4+PiArCQlmbHVzaF9pY2FjaGVfYWxsKCk7DQo+ ID4+PiArDQo+ID4+PiArCQkvKg0KPiA+Pj4gKwkJICogVGVsbCB0aGUgaGliZXJuYXRpb24gY29y ZSB0aGF0IHdlJ3ZlIGp1c3QgcmVzdG9yZWQNCj4gPj4+ICsJCSAqIHRoZSBtZW1vcnkNCj4gPj4+ ICsJCSAqLw0KPiA+Pj4gKwkJaW5fc3VzcGVuZCA9IDA7DQo+ID4+PiArCQlzbGVlcF9jcHUgPSAt RUlOVkFMOw0KPiA+Pj4gKwl9DQo+ID4+PiArDQo+ID4+PiArCXJldHVybiByZXQ7DQo+ID4+PiAr fQ0KPiA+Pj4gKw0KPiA+Pj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRlbXBfcGd0YWJsZV9tYXBf cHRlKHB0ZV90ICpwdGVwLCB1bnNpZ25lZCBsb25nIHZhZGRyLCBwZ3Byb3RfdCBwcm90KQ0KPiA+ Pj4gK3sNCj4gPj4+ICsJdWludHB0cl90IHB0ZV9pZHggPSBwdGVfaW5kZXgodmFkZHIpOw0KPiA+ Pj4gKw0KPiA+Pj4gKwlwdGVwW3B0ZV9pZHhdID0gcGZuX3B0ZShQRk5fRE9XTihfX3BhKHZhZGRy KSksIHByb3QpOw0KPiA+Pj4gKw0KPiA+Pj4gKwlyZXR1cm4gMDsNCj4gPj4+ICt9DQo+ID4+PiAr DQo+ID4+PiArI2lmbmRlZiBfX1BBR0VUQUJMRV9QTURfRk9MREVEDQo+ID4+PiArI2RlZmluZSB0 ZW1wX3BndGFibGVfbWFwX3BnZF9uZXh0KHBnZHAsIHZhZGRyLCBwcm90KQkJCVwNCj4gPj4+ICsJ CShwZ3RhYmxlX2w1X2VuYWJsZWQgPwkJCQkJXA0KPiA+Pj4gKwkJdGVtcF9wZ3RhYmxlX21hcF9w NGQocGdkcCwgdmFkZHIsIHByb3QpIDoJCVwNCj4gPj4+ICsJCShwZ3RhYmxlX2w0X2VuYWJsZWQg PwkJCQkJXA0KPiA+Pj4gKwkJdGVtcF9wZ3RhYmxlX21hcF9wdWQoKHB1ZF90ICopcGdkcCwgdmFk ZHIsIHByb3QpIDoJXA0KPiA+Pj4gKwkJdGVtcF9wZ3RhYmxlX21hcF9wbWQoKHBtZF90ICopcGdk cCwgdmFkZHIsIHByb3QpKSkNCj4gPj4+ICsNCj4gPj4+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyB0 ZW1wX3BndGFibGVfbWFwX3BtZChwbWRfdCAqcG1kcCwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdw cm90X3QgcHJvdCkNCj4gPj4+ICt7DQo+ID4+PiArCXVpbnRwdHJfdCBwbWRfaWR4ID0gcG1kX2lu ZGV4KHZhZGRyKTsNCj4gPj4+ICsJcHRlX3QgKnB0ZXA7DQo+ID4+PiArDQo+ID4+PiArCWlmIChw bWRfbm9uZShwbWRwW3BtZF9pZHhdKSkgew0KPiA+Pj4gKwkJcHRlcCA9IChwdGVfdCAqKWdldF9z YWZlX3BhZ2UoR0ZQX0FUT01JQyk7DQo+ID4+PiArCQlpZiAoIXB0ZXApDQo+ID4+PiArCQkJcmV0 dXJuIC1FTk9NRU07DQo+ID4+PiArDQo+ID4+PiArCQltZW1zZXQocHRlcCwgMCwgUEFHRV9TSVpF KTsNCj4gPj4+ICsJCXBtZHBbcG1kX2lkeF0gPSBwZm5fcG1kKFBGTl9ET1dOKF9fcGEocHRlcCkp LCBQQUdFX1RBQkxFKTsNCj4gPj4+ICsJfSBlbHNlIHsNCj4gPj4+ICsJCXB0ZXAgPSAocHRlX3Qg KilfX3ZhKFBGTl9QSFlTKF9wbWRfcGZuKHBtZHBbcG1kX2lkeF0pKSk7DQo+ID4+PiArCX0NCj4g Pj4+ICsNCj4gPj4+ICsJcmV0dXJuIHRlbXBfcGd0YWJsZV9tYXBfcHRlKHB0ZXAsIHZhZGRyLCBw cm90KTsNCj4gPj4+ICt9DQo+ID4+PiArDQo+ID4+PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVt cF9wZ3RhYmxlX21hcF9wdWQocHVkX3QgKnB1ZHAsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJv dF90IHByb3QpDQo+ID4+PiArew0KPiA+Pj4gKwl1aW50cHRyX3QgcHVkX2luZGV4ID0gcHVkX2lu ZGV4KHZhZGRyKTsNCj4gPj4+ICsJcG1kX3QgKnBtZHA7DQo+ID4+PiArDQo+ID4+PiArCWlmIChw dWRfdmFsKHB1ZHBbcHVkX2luZGV4XSkgPT0gMCkgew0KPiA+Pj4gKwkJcG1kcCA9IChwbWRfdCAq KWdldF9zYWZlX3BhZ2UoR0ZQX0FUT01JQyk7DQo+ID4+PiArCQlpZiAoIXBtZHApDQo+ID4+PiAr CQkJcmV0dXJuIC1FTk9NRU07DQo+ID4+PiArDQo+ID4+PiArCQltZW1zZXQocG1kcCwgMCwgUEFH RV9TSVpFKTsNCj4gPj4+ICsJCXB1ZHBbcHVkX2luZGV4XSA9IHBmbl9wdWQoUEZOX0RPV04oX19w YShwbWRwKSksIFBBR0VfVEFCTEUpOw0KPiA+Pj4gKwl9IGVsc2Ugew0KPiA+Pj4gKwkJcG1kcCA9 IChwbWRfdCAqKV9fdmEoUEZOX1BIWVMoX3B1ZF9wZm4ocHVkcFtwdWRfaW5kZXhdKSkpOw0KPiA+ Pj4gKwl9DQo+ID4+PiArDQo+ID4+PiArCXJldHVybiB0ZW1wX3BndGFibGVfbWFwX3BtZChwbWRw LCB2YWRkciwgcHJvdCk7DQo+ID4+PiArfQ0KPiA+Pj4gKw0KPiA+Pj4gK3N0YXRpYyB1bnNpZ25l ZCBsb25nIHRlbXBfcGd0YWJsZV9tYXBfcDRkKHA0ZF90ICpwNGRwLCB1bnNpZ25lZCBsb25nIHZh ZGRyLCBwZ3Byb3RfdCBwcm90KQ0KPiA+Pj4gK3sNCj4gPj4+ICsJdWludHB0cl90IHA0ZF9pbmRl eCA9IHA0ZF9pbmRleCh2YWRkcik7DQo+ID4+PiArCXB1ZF90ICpwdWRwOw0KPiA+Pj4gKw0KPiA+ Pj4gKwlpZiAocDRkX3ZhbChwNGRwW3A0ZF9pbmRleF0pID09IDApIHsNCj4gPj4+ICsJCXB1ZHAg PSAocHVkX3QgKilnZXRfc2FmZV9wYWdlKEdGUF9BVE9NSUMpOw0KPiA+Pj4gKwkJaWYgKCFwdWRw KQ0KPiA+Pj4gKwkJCXJldHVybiAtRU5PTUVNOw0KPiA+Pj4gKw0KPiA+Pj4gKwkJbWVtc2V0KHB1 ZHAsIDAsIFBBR0VfU0laRSk7DQo+ID4+PiArCQlwNGRwW3A0ZF9pbmRleF0gPSBwZm5fcDRkKFBG Tl9ET1dOKF9fcGEocHVkcCkpLCBQQUdFX1RBQkxFKTsNCj4gPj4+ICsJfSBlbHNlIHsNCj4gPj4+ ICsJCXB1ZHAgPSAocHVkX3QgKilfX3ZhKFBGTl9QSFlTKF9wNGRfcGZuKHA0ZHBbcDRkX2luZGV4 XSkpKTsNCj4gPj4+ICsJfQ0KPiA+Pj4gKw0KPiA+Pj4gKwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21h cF9wdWQocHVkcCwgdmFkZHIsIHByb3QpOw0KPiA+Pj4gK30NCj4gPj4+ICsNCj4gPj4+ICsjZWxz ZQ0KPiA+Pj4gKyNkZWZpbmUgdGVtcF9wZ3RhYmxlX21hcF9wZ2RfbmV4dChuZXh0cCwgdmFkZHIs IHByb3QpCVwNCj4gPj4+ICsJdGVtcF9wZ3RhYmxlX21hcF9wdGUoKHB0ZV90ICopbmV4dHAsIHZh ZGRyLCBwcm90KQ0KPiA+Pj4gKyNlbmRpZiAvKiBfX1BBR0VUQUJMRV9QTURfRk9MREVEICovDQo+ ID4+PiArDQo+ID4+PiArc3RhdGljIHVuc2lnbmVkIGxvbmcgdGVtcF9wZ3RhYmxlX21hcF9wZ2Qo cGdkX3QgKnBnZHAsIHVuc2lnbmVkIGxvbmcgdmFkZHIsIHBncHJvdF90IHByb3QpDQo+ID4+PiAr ew0KPiA+Pj4gKwl1aW50cHRyX3QgcGdkX2lkeCA9IHBnZF9pbmRleCh2YWRkcik7DQo+ID4+PiAr CXZvaWQgKm5leHRwOw0KPiA+Pj4gKw0KPiA+Pj4gKwlpZiAocGdkX3ZhbChwZ2RwW3BnZF9pZHhd KSA9PSAwKSB7DQo+ID4+PiArCQluZXh0cCA9ICh2b2lkICopZ2V0X3NhZmVfcGFnZShHRlBfQVRP TUlDKTsNCj4gPj4+ICsJCWlmICghbmV4dHApDQo+ID4+PiArCQkJcmV0dXJuIC1FTk9NRU07DQo+ ID4+PiArDQo+ID4+PiArCQltZW1zZXQobmV4dHAsIDAsIFBBR0VfU0laRSk7DQo+ID4+PiArCQlw Z2RwW3BnZF9pZHhdID0gcGZuX3BnZChQRk5fRE9XTihfX3BhKG5leHRwKSksIFBBR0VfVEFCTEUp Ow0KPiA+Pj4gKwl9IGVsc2Ugew0KPiA+Pj4gKwkJbmV4dHAgPSAodm9pZCAqKV9fdmEoUEZOX1BI WVMoX3BnZF9wZm4ocGdkcFtwZ2RfaWR4XSkpKTsNCj4gPj4+ICsJfQ0KPiA+Pj4gKw0KPiA+Pj4g KwlyZXR1cm4gdGVtcF9wZ3RhYmxlX21hcF9wZ2RfbmV4dChuZXh0cCwgdmFkZHIsIHByb3QpOw0K PiA+Pj4gK30NCj4gPj4+ICsNCj4gPj4+ICtzdGF0aWMgdW5zaWduZWQgbG9uZyB0ZW1wX3BndGFi bGVfbWFwcGluZyhwZ2RfdCAqcGdkcCwgdW5zaWduZWQgbG9uZyB2YWRkciwgcGdwcm90X3QgcHJv dCkNCj4gPj4+ICt7DQo+ID4+PiArCXJldHVybiB0ZW1wX3BndGFibGVfbWFwX3BnZChwZ2RwLCB2 YWRkciwgcHJvdCk7DQo+ID4+PiArfQ0KPiA+Pj4gKw0KPiA+Pj4gK3N0YXRpYyB1bnNpZ25lZCBs b25nIHJlbG9jYXRlX3Jlc3RvcmVfY29kZSh2b2lkKQ0KPiA+Pj4gK3sNCj4gPj4+ICsJdW5zaWdu ZWQgbG9uZyByZXQ7DQo+ID4+PiArCXZvaWQgKnBhZ2UgPSAodm9pZCAqKWdldF9zYWZlX3BhZ2Uo R0ZQX0FUT01JQyk7DQo+ID4+PiArDQo+ID4+PiArCWlmICghcGFnZSkNCj4gPj4+ICsJCXJldHVy biAtRU5PTUVNOw0KPiA+Pj4gKw0KPiA+Pj4gKwljb3B5X3BhZ2UocGFnZSwgY29yZV9yZXN0b3Jl X2NvZGUpOw0KPiA+Pj4gKw0KPiA+Pj4gKwkvKiBNYWtlIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhl IHJlbG9jYXRlZCBjb2RlIGV4ZWN1dGFibGUgKi8NCj4gPj4+ICsJc2V0X21lbW9yeV94KCh1bnNp Z25lZCBsb25nKXBhZ2UsIDEpOw0KPiA+Pj4gKw0KPiA+Pj4gKwlyZXQgPSB0ZW1wX3BndGFibGVf bWFwcGluZyhyZXN1bWVfcGdfZGlyLCAodW5zaWduZWQgbG9uZylwYWdlLCBQQUdFX0tFUk5FTF9S RUFEX0VYRUMpOw0KPiA+Pj4gKwlpZiAocmV0KQ0KPiA+Pj4gKwkJcmV0dXJuIHJldDsNCj4gPj4+ ICsNCj4gPj4+ICsJcmV0dXJuICh1bnNpZ25lZCBsb25nKXBhZ2U7DQo+ID4+PiArfQ0KPiA+Pj4g Kw0KPiA+Pj4gK2ludCBzd3N1c3BfYXJjaF9yZXN1bWUodm9pZCkNCj4gPj4+ICt7DQo+ID4+PiAr CXVuc2lnbmVkIGxvbmcgYWRkciA9IFBBR0VfT0ZGU0VUOw0KPiA+Pj4gKwl1bnNpZ25lZCBsb25n IHJldDsNCj4gPj4+ICsNCj4gPj4+ICsJLyoNCj4gPj4+ICsJICogTWVtb3J5IGFsbG9jYXRlZCBi eSBnZXRfc2FmZV9wYWdlKCkgd2lsbCBiZSBkZWFsdCB3aXRoIGJ5IHRoZSBoaWJlcm5hdGlvbiBj b3JlLA0KPiA+Pj4gKwkgKiB3ZSBkb24ndCBuZWVkIHRvIGZyZWUgaXQgaGVyZS4NCj4gPj4+ICsJ ICovDQo+ID4+PiArCXJlc3VtZV9wZ19kaXIgPSAocGdkX3QgKilnZXRfc2FmZV9wYWdlKEdGUF9B VE9NSUMpOw0KPiA+Pj4gKwlpZiAoIXJlc3VtZV9wZ19kaXIpDQo+ID4+PiArCQlyZXR1cm4gLUVO T01FTTsNCj4gPj4+ICsNCj4gPj4+ICsJLyoNCj4gPj4+ICsJICogVGhlIHBhZ2VzIG5lZWQgdG8g YmUgd3JpdGFibGUgd2hlbiByZXN0b3JpbmcgdGhlIGltYWdlLg0KPiA+Pj4gKwkgKiBDcmVhdGUg YSBzZWNvbmQgY29weSBvZiBwYWdlIHRhYmxlIGp1c3QgZm9yIHRoZSBsaW5lYXIgbWFwLCBhbmQg dXNlIHRoaXMgd2hlbg0KPiA+Pj4gKwkgKiByZXN0b3JpbmcuDQo+ID4+PiArCSAqLw0KPiA+Pj4g Kwlmb3IgKDsgYWRkciA8PSAodW5zaWduZWQgbG9uZylwZm5fdG9fdmlydChtYXhfbG93X3Bmbik7 IGFkZHIgKz0gUEFHRV9TSVpFKSB7DQo+ID4+PiArCQlyZXQgPSB0ZW1wX3BndGFibGVfbWFwcGlu ZyhyZXN1bWVfcGdfZGlyLCBhZGRyLCBQQUdFX0tFUk5FTCk7DQo+ID4+PiArCQlpZiAocmV0KQ0K PiA+Pj4gKwkJCXJldHVybiAoaW50KXJldDsNCj4gPj4+ICsJfQ0KPiA+Pj4gKw0KPiA+Pg0KPiA+ PiBUbyBtZSB0aGlzIGlzIHdyb25nIGFzIHRoaXMgZG9lcyBub3QgYWNjb3VudCBmb3IgdGhlIHJl YWwgcGh5c2ljYWwNCj4gPj4gbWFwcGluZyBsYXlvdXQ6IGNhbid0IHlvdSBzaW1wbHkgY29weSB0 aGUgbGluZWFyIG1hcHBpbmcgZnJvbQ0KPiA+PiBzd2FwcGVyX3BnX2Rpcj8NCj4gPiBIaSwgd2Ug Y292ZXJpbmcgdGhlIGxpbmVhciBtYXBwaW5nIGZyb20gUEFHRV9PRkZTRVQgdXAgdG8gcGZuX3Rv X3ZpcnQobWF4X2xvd19wZm4pLiBXZSBzaG91bGRuJ3QgY29weSBmcm9tIHRoZQ0KPiBzd2FwcGVy X3BnX2RpciBhcyB3ZSBhcmUgbm90IHN1cHBvc2UgdG8gbW9kaWZ5IGl0cyBjb250ZW50Lg0KPiAN Cj4gDQo+IEZpcnN0LCB5b3UncmUgcmlnaHQsIHdlIG5lZWQgdGhlIHRlbXBvcmFyeSBwYWdlIHRh YmxlIGFzIHN3YXBwZXJfcGdfZGlyDQo+IHdpbGwgZ2V0IG92ZXJ3cml0dGVuIHVuZGVyIG91ciBm ZWV0Lg0KPiANCj4gTm93LCBJIHN0aWxsIGRpc2FncmVlIHdpdGggbWFwcGluZyBhbGwgdGhlIG1l bW9yeTogdGhlIGxpbmVhciBtYXBwaW5nIGlzDQo+IHNwYXJzZSBiZWNhdXNlIHdlIG9ubHkgbWFw IHdoYXQgbWVtYmxvY2sgZ2l2ZXMgdXMgKHNvbWUgcmVnaW9ucyBhcmUNCj4gbWFya2VkIGFzICJu b21hcCIgZm9yIGEgcmVhc29uKS4NCj4gDQo+IEkganVzdCB0b29rIGEgbG9vayBhdCBhcm02NCwg YW5kIHRoZXkgZG8gZXhhY3RseSB0aGF0OiB0aGV5IGdvIHRocm91Z2gNCj4gc3dhcHBlcl9wZ19k aXIsIGNvcHkgdGhlIGxpbmVhciBtYXBwaW5nIGFuZCBlbmFibGUgd3JpdGUgYXQgZXZlcnkgbGVh Zg0KPiBsZXZlbA0KPiAoaHR0cHM6Ly9lbGl4aXIuYm9vdGxpbi5jb20vbGludXgvbGF0ZXN0L3Nv dXJjZS9hcmNoL2FybTY0L2tlcm5lbC9oaWJlcm5hdGUuYyNMNDE5KS4NCllvdSdyZSByaWdodCwg YnV0IHdlIGRvbuKAmXQgaGF2ZSB0byBjb3B5IGZyb20gdGhlIHN3YXBwZXJfcGdfZGlyLiBXZSBj YW4gaW5zZXJ0IGtlcm5lbF9wYWdlX3ByZXNlbnQoKSB0byB0aGUgZnVuY3Rpb24gdG8gY2hlY2sg dGhlIHBhZ2UgdmFsaWRpdHkgcHJpb3IgdG8gZG8gdGhlIG1hcHBpbmcuIEFncmVlPw0KPiANCj4g DQo+ID4+IEJ1dCBJIGhhdmUgdG8gYWRtaXQgdGhhdCBJIHN0cnVnZ2xlIHRvIHVuZGVyc3RhbmQg dGhlIG5lZWQgZm9yIHRoaXMNCj4gPj4gdGVtcG9yYXJ5IHBhZ2UgdGFibGU6IGFsbCB3ZSBuZWVk IHRvIGRvIGlzIHRvIGFsbG93IHRvIHdyaXRlIHRvIHRoZQ0KPiA+PiBsaW5lYXIgbWFwcGluZywg c28gd2h5IGRvbid0IHdlIHNpbXBseSBzZXRfbWVtb3J5X3J3KGxpbmVhciBtYXBwaW5nKT8NCj4g PiBTaW1pbGFyIHRvIHRoZSBhYm92ZSBjb21tZW50LiBXaGVuIHdlIHJlc3RvcmUgdGhlIG1lbW9y eSBjb250ZW50LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgcGFnZXMgYXJlIHdyaXRlLWFibGUu IGlmIHlvdSBtb2RpZnkNCj4gdGhlIHN3YXBwZXJfcGdfZGlyLCB0aGUga2VybmVsIHdpbGwgY3Jh c2ggYWZ0ZXJ3YXJkcy4NCj4gPiBUaGF04oCZcyB3aHkgd2UgbmVlZCBhIHNlY29uZCBwYWdlIHRh YmxlIHRvIGRvIHRoZSByZWNvdmVyaW5nIGpvYi4NCj4gPj4NCj4gPj4+ICsJLyogTW92ZSB0aGUg cmVzdG9yZSBjb2RlIHRvIGEgbmV3IHBhZ2Ugc28gdGhhdCBpdCBkb2Vzbid0IGdldCBvdmVyd3Jp dHRlbiBieSBpdHNlbGYgKi8NCj4gPj4+ICsJcmVsb2NhdGVkX3Jlc3RvcmVfY29kZSA9IHJlbG9j YXRlX3Jlc3RvcmVfY29kZSgpOw0KPiA+Pg0KPiA+PiBBbmQgZG8gd2UgcmVhbGx5IG5lZWQgdG8g ZG8gdGhhdCB0b28/IFRoZSBjb2RlIGluIHF1ZXN0aW9uIGNhbiBvbmx5IGJlDQo+ID4+IG92ZXJ3 cml0dGVuIGJ5IHRoZSBzYW1lIGNvZGUgcmlnaHQ/DQo+ID4gWWVzLCB3ZSBuZWVkIHRvIG1vdmUg dGhlIHJlY292ZXJpbmcgY29kZSB0byBhIG5ldyBwYWdlIHRvIHByZXZlbnQgdGhlIGNvZGUgZnJv bSBvdmVyd3JpdGUgaXRzZWxmIHdoZW4gcmVzdG9yaW5nIHRoZSBtZW1vcnkuDQo+ID4+IFRoYW5r cywNCj4gPj4NCj4gPj4gQWxleA0KPiA+Pg0KPiA+Pg0KPiA+Pj4gKwlpZiAocmVsb2NhdGVkX3Jl c3RvcmVfY29kZSA9PSAtRU5PTUVNKQ0KPiA+Pj4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4+PiAr DQo+ID4+PiArCS8qDQo+ID4+PiArCSAqIE1hcCB0aGUgX19oaWJlcm5hdGVfY3B1X3Jlc3VtZSgp IGFkZHJlc3MgdG8gdGhlIHRlbXBvcmFyeSBwYWdlIHRhYmxlIHNvIHRoYXQgdGhlDQo+ID4+PiAr CSAqIHJlc3RvcmUgY29kZSBjYW4ganVtcCB0byBpdCBhZnRlciBmaW5pc2hlZCByZXN0b3JlIHRo ZSBpbWFnZS4gVGhlIG5leHQgZXhlY3V0aW9uDQo+ID4+PiArCSAqIGNvZGUgZG9lc24ndCBmaW5k IGl0c2VsZiBpbiBhIGRpZmZlcmVudCBhZGRyZXNzIHNwYWNlIGFmdGVyIHN3aXRjaGluZyBvdmVy IHRvIHRoZQ0KPiA+Pj4gKwkgKiBvcmlnaW5hbCBwYWdlIHRhYmxlIHVzZWQgYnkgdGhlIGhpYmVy bmF0ZWQgaW1hZ2UuDQo+ID4+PiArCSAqLw0KPiA+Pj4gKwlyZXQgPSB0ZW1wX3BndGFibGVfbWFw cGluZyhyZXN1bWVfcGdfZGlyLCAodW5zaWduZWQgbG9uZylyZXN1bWVfaGRyLnJlc3RvcmVfY3B1 X2FkZHIsDQo+ID4+PiArCQkJCQlQQUdFX0tFUk5FTF9SRUFEX0VYRUMpOw0KPiA+Pj4gKwlpZiAo cmV0KQ0KPiA+Pj4gKwkJcmV0dXJuIHJldDsNCj4gPj4+ICsNCj4gPj4+ICsJcmVzdG9yZV9pbWFn ZShyZXN1bWVfaGRyLnNhdmVkX3NhdHAsIChQRk5fRE9XTihfX3BhKHJlc3VtZV9wZ19kaXIpKSB8 IHNhdHBfbW9kZSksDQo+ID4+PiArCQkJcmVzdW1lX2hkci5yZXN0b3JlX2NwdV9hZGRyKTsNCj4g Pj4+ICsNCj4gPj4+ICsJcmV0dXJuIDA7DQo+ID4+PiArfQ0KPiA+Pj4gKw0KPiA+Pj4gKyNpZmRl ZiBDT05GSUdfUE1fU0xFRVBfU01QDQo+ID4+PiAraW50IGhpYmVybmF0ZV9yZXN1bWVfbm9uYm9v dF9jcHVfZGlzYWJsZSh2b2lkKQ0KPiA+Pj4gK3sNCj4gPj4+ICsJaWYgKHNsZWVwX2NwdSA8IDAp IHsNCj4gPj4+ICsJCXByX2VycigiRmFpbGluZyB0byByZXN1bWUgZnJvbSBoaWJlcm5hdGUgb24g YW4gdW5rbm93biBDUFUuXG4iKTsNCj4gPj4+ICsJCXJldHVybiAtRU5PREVWOw0KPiA+Pj4gKwl9 DQo+ID4+PiArDQo+ID4+PiArCXJldHVybiBmcmVlemVfc2Vjb25kYXJ5X2NwdXMoc2xlZXBfY3B1 KTsNCj4gPj4+ICt9DQo+ID4+PiArI2VuZGlmDQo+ID4+PiArDQo+ID4+PiArc3RhdGljIGludCBf X2luaXQgcmlzY3ZfaGliZXJuYXRlX2luaXQodm9pZCkNCj4gPj4+ICt7DQo+ID4+PiArCWhpYmVy bmF0ZV9jcHVfY29udGV4dCA9IGtjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzdXNwZW5kX2NvbnRl eHQpLCBHRlBfS0VSTkVMKTsNCj4gPj4+ICsNCj4gPj4+ICsJaWYgKFdBUk5fT04oIWhpYmVybmF0 ZV9jcHVfY29udGV4dCkpDQo+ID4+PiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPj4+ICsNCj4gPj4+ ICsJcmV0dXJuIDA7DQo+ID4+PiArfQ0KPiA+Pj4gKw0KPiA+Pj4gK2Vhcmx5X2luaXRjYWxsKHJp c2N2X2hpYmVybmF0ZV9pbml0KTsNCj4gPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXw0KPiA+IGxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdA0KPiA+IGxpbnV4 LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcNCj4gPiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2DQo=