From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.136; helo=mga12.intel.com; envelope-from=jian.j.wang@intel.com; receiver=edk2-devel@lists.01.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 333D521155D57 for ; Mon, 11 Jun 2018 21:32:33 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga007.jf.intel.com ([10.7.209.58]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Jun 2018 21:32:32 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,213,1526367600"; d="scan'208";a="48262815" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by orsmga007.jf.intel.com with ESMTP; 11 Jun 2018 21:32:32 -0700 Received: from fmsmsx154.amr.corp.intel.com (10.18.116.70) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 11 Jun 2018 21:32:32 -0700 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by FMSMSX154.amr.corp.intel.com (10.18.116.70) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 11 Jun 2018 21:32:31 -0700 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.51]) by shsmsx102.ccr.corp.intel.com ([169.254.2.223]) with mapi id 14.03.0319.002; Tue, 12 Jun 2018 12:32:29 +0800 From: "Wang, Jian J" To: Laszlo Ersek , "edk2-devel@lists.01.org" CC: "Ni, Ruiyu" , "Yao, Jiewen" , "Dong, Eric" , "Zeng, Star" Thread-Topic: [edk2] [PATCH 1/2] UefiCpuPkg/CpuDxe: allow accessing (DXE) page table in SMM mode Thread-Index: AQHUAVMeL2RB1sB9GkWja9060Lz8dqRac5uAgAFnGkA= Date: Tue, 12 Jun 2018 04:32:29 +0000 Message-ID: References: <20180611070833.5440-1-jian.j.wang@intel.com> <20180611070833.5440-2-jian.j.wang@intel.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiZTY5MDE3NDQtN2JiOS00ZTA2LTk3MjEtYTU4ZWUxMmM1ZDJhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiR3Nlb3lOS1JLUWtMZTV2RHBTVHNERUlUOE9kc01qXC9hZml2Q1BJSDRXb1ZLdk5rNDhaOTlaNExRTytUTk4zWUoifQ== x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.200.100 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH 1/2] UefiCpuPkg/CpuDxe: allow accessing (DXE) page table in SMM mode X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.26 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jun 2018 04:32:33 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 SGkgTGFzemxvLA0KDQpUaGFuayB5b3UgdmVyeSBtdWNoIGZvciBzdWNoIHRob3JvdWdoIHJldmll dy4gSSdkIGxpa2UgdG8gZXhwbGFpbiBhIGJpdCBpbiBhZHZhbmNlLg0KDQpQdXR0aW5nIGFzaWRl IHRoZSBzcGVjaWZpYyBjb2RpbmcgaXNzdWVzIGluIG15IHBhdGNoLCBvbmUgdGhpbmcgaXMgY2xl YXIgdGhhdCBTTU0gbW9kZQ0KaGFzIGl0cyBvd24gcGFnZSB0YWJsZS4gQ3B1RHhlIHNob3VsZCBu b3QgdG91Y2ggaXQgZXZlbiBpZiBpdHMgcHVibGljIGludGVyZmFjZSBpcyBjYWxsZWQNCnZpYSBn QlMgc2VydmljZXMsIGJlY2F1c2UgaXQgaGFzIG5vIGtub3dsZWRnZSBvZiBTTU0gaW50ZXJuYWwg dGhpbmdzIGFuZCBpdCBtaWdodA0KamVvcGFyZGl6ZSBTTU0gb3BlcmF0aW9uIGlmIGl0IGRvZXMu IEJ1dCBjdXJyZW50IENwdUR4ZSBkb2Vzbid0IHRha2UgdGhpcyBpbnRvIGFjY291bnQuDQpJIHRo aW5rIGl0IHNob3VsZCBiZSBmaXhlZCBhbnl3YXksIGV2ZW4gdGhlcmUncyBubyBIZWFwIEd1YXJk IGZlYXR1cmUsIHNpbmNlIGN1cnJlbnQNCmRlc2lnbiBhbGxvd3MgU01NIHRvIHRvdWNoIG1lbW9y eSBvd25lZCBieSBEWEUgYnV0IG5vdCB2aWNlIHZlcnNhLg0KDQpUaGUgYmFzaWMgaWRlYSBvZiB0 aGlzIHBhdGNoIGlzLCBpZiB3ZSB3YW50IHRvIGFjY2VzcyBEWEUgcGFnZSB0YWJsZSBpbiBTTU0g bW9kZSwgd2UNCmNhbm5vdCBkbyB0aGlzIHZpYSBDUjMgcmVnaXN0ZXIgKGl0IGhhcyBiZWVuIHJl bG9hZGVkIGJ5IFNNTSkgZGlyZWN0bHkgYnV0IHZpYSBhIHN0b3JlZA0KdmFsdWUgaW4gYSBnbG9i YWwuIFRoaXMgaXMgZmVhc2libGUgYmVjYXVzZSBwYWdlIHRhYmxlIGlzIGp1c3QgYSBjaHVuayBv ZiBub3JtYWwgbWVtb3J5Lg0KQWxsIHdlIG5lZWQgaXMgYW4gZW50cnkgYWRkcmVzcyBwb2ludGVy LiBXaGVuIGV4aXRpbmcgU01NIG1vZGUgYmFjayB0byBEWEUsIHRoZQ0KdXBkYXRlZCBwYWdlIHRh YmxlIHdpbGwgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkgb25jZSBDUjMgaXMgcmVzdG9yZWQgdG8g RFhFIHZlcnNpb24uDQpUaGF0IG1lYW5zIHdlIGNhbiBjaGFuZ2UgRFhFIHBhZ2UgdGFibGUgYXR0 cmlidXRlcyBldmVuIGluIFNNTSBtb2RlLg0KDQpQbGVhc2Ugc2VlIG15IG90aGVyIHJlc3BvbnNl cyBiZWxvdy4NCg0KUmVnYXJkcywNCkppYW4NCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0t LQ0KPiBGcm9tOiBMYXN6bG8gRXJzZWsgW21haWx0bzpsZXJzZWtAcmVkaGF0LmNvbV0NCj4gU2Vu dDogTW9uZGF5LCBKdW5lIDExLCAyMDE4IDg6MTggUE0NCj4gVG86IFdhbmcsIEppYW4gSiA8amlh bi5qLndhbmdAaW50ZWwuY29tPjsgZWRrMi1kZXZlbEBsaXN0cy4wMS5vcmcNCj4gQ2M6IE5pLCBS dWl5dSA8cnVpeXUubmlAaW50ZWwuY29tPjsgWWFvLCBKaWV3ZW4gPGppZXdlbi55YW9AaW50ZWwu Y29tPjsgRG9uZywNCj4gRXJpYyA8ZXJpYy5kb25nQGludGVsLmNvbT4NCj4gU3ViamVjdDogUmU6 IFtlZGsyXSBbUEFUQ0ggMS8yXSBVZWZpQ3B1UGtnL0NwdUR4ZTogYWxsb3cgYWNjZXNzaW5nIChE WEUpDQo+IHBhZ2UgdGFibGUgaW4gU01NIG1vZGUNCj4gDQo+IEhpIEppYW4sDQo+IA0KPiBPbiAw Ni8xMS8xOCAwOTowOCwgSmlhbiBKIFdhbmcgd3JvdGU6DQo+ID4gVGhlIFNNTSB2ZXJzaW9uIG9m IE1lbW9yeUFsbG9jYXRpb25MaWIgYWxsb3dzIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZA0KPiA+ IGluIERYRSAoYmVmb3JlIEVuZE9mRHhlKS4gVGhpcyBpcyBkb25lIGJ5IGNoZWNraW5nIHRoZSBt ZW1vcnkgcmFuZ2UgYW5kDQo+ID4gY2FsbGluZyBnQlMgc2VydmljZXMgdG8gZG8gcmVhbCBvcGVy YXRpb24gaWYgdGhlIG1lbW9yeSB0byBmcmVlIGlzIG91dA0KPiA+IG9mIFNNUkFNLiBUaGlzIHdv dWxkIGNhdXNlIHByb2JsZW0gaWYgc29tZSBtZW1vcnkgcmVsYXRlZCBmZWF0dXJlcywgbGlrZQ0K PiA+IEhlYXAgR3VhcmQsIGhhdmUgdG8gdXBkYXRlIHBhZ2UgdGFibGUgdG8gY2hhbmdlIG1lbW9y eSBhdHRyaWJ1dGVzLg0KPiA+IEJlY2F1c2UgcGFnZSB0YWJsZSBpbiBTTU0gbW9kZSBpcyBkaWZm ZXJlbnQgZnJvbSBEWEUgbW9kZSwgZ0JTIG1lbW9yeQ0KPiA+IHNlcnZpY2VzIGNhbm5vdCBnZXQg dGhlIGNvcnJlY3QgYXR0cmlidXRlcyBvZiBEWEUgbWVtb3J5IGZyb20gU01NIHBhZ2UNCj4gPiB0 YWJsZSBhbmQgdGhlbiBjYXVzZSBpbmNvcnJlY3QgbWVtb3J5IG1hbmlwdWxhdGlvbnMuDQo+IA0K PiAoMSkgSSB0aGluayB0aGlzIGRlc2NyaXB0aW9uIG1ha2VzIHNlbnNlLCBidXQgaXQgZG9lcyBu b3QgaGlnaGxpZ2h0IHRoZQ0KPiBpbnZvbHZlbWVudCBvZiBDcHVEeGUuDQo+IA0KPiAoMWEpIFBs ZWFzZSByZWZlcmVuY2UgIk1kZVBrZy9MaWJyYXJ5L1NtbU1lbW9yeUFsbG9jYXRpb25MaWIiIHNw ZWNpZmljYWxseS4NCj4gDQo+ICgxYikgVGhlIFNtbU1lbW9yeUFsbG9jYXRpb25MaWIgaW5zdGFu Y2UgaW1wbGllcyB0aGF0IHRoZSBjYWxsIGNoYWluDQo+IHN0YXJ0cyB3aXRoIGEgRFhFX1NNTV9E UklWRVIgY2FsbGluZyBGcmVlUG9vbCgpIG9yIEZyZWVQYWdlcygpLg0KPiANCj4gRFhFX1NNTV9E UklWRVJzIGNhbiBvbmx5IGNhbGwgYm9vdCBzZXJ2aWNlcywgYW5kIHByb3RvY29scyBsb2NhdGVk IHdpdGgNCj4gYm9vdCBzZXJ2aWNlcywgaW4gdGhlaXIgZW50cnkgcG9pbnQgZnVuY3Rpb25zLg0K PiANCj4gQ3B1RHhlIGlzIGEgRFhFX0RSSVZFUiBhbmQgaXQgcHJvdmlkZXMgdGhlIENQVSBhcmNo IHByb3RvY29sIChhbmQgdGhlIE1QDQo+IHNlcnZpY2VzIHByb3RvY29sKS4gVGh1cywgb3VyIGNh bGwgY2hhaW4gY2FuIG9ubHkgb2NjdXIgaWY6DQo+IA0KPiAtIGEgRFhFX1NNTV9EUklWRVIgY2Fs bHMgdGhlIEZyZWVQb29sKCkgb3IgRnJlZVBhZ2VzKCkgbGlicmFyeSBBUEksDQo+IA0KPiAtIGlu IGl0cyBlbnRyeSBwb2ludCBmdW5jdGlvbiwNCj4gDQo+IC0gcmVsZWFzaW5nIG1lbW9yeSB0aGF0 J3Mgbm90IFNNUkFNLA0KPiANCj4gLSBhbmQgdGhlIGhlYXAgZ3VhcmQgZmVhdHVyZSBpcyBlbmFi bGVkLCBzbyB0aGUgRnJlZVBvb2woKSBvcg0KPiAgIEZyZWVQYWdlcygpIGJvb3Qgc2VydmljZSBl bmRzIHVwIGNhbGxpbmcNCj4gICBFRklfQ1BVX0FSQ0hfUFJPVE9DT0wuU2V0TWVtb3J5QXR0cmli dXRlcygpLg0KPiANCj4gUGxlYXNlIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgY29t bWl0IG1lc3NhZ2UuDQo+IA0KDQpTdXJlLiBJJ2xsIGFkZCBpdC4gVGhhbmtzLg0KDQo+ICgyKSBD YW4geW91IHJlbWluZCBtZSBob3cgdGhlIFNNTSBwYWdlIHRhYmxlcyBtYXAgbm9uLVNNUkFNIG1l bW9yeT8NCj4gDQo+IEJlY2F1c2UsIEkgYXNzdW1lIHRoYXQsIGFmdGVyIGEgRnJlZVBhZ2VzKCkg bGliYXJ5IEFQSSBjYWxsLCB0aGUgZnJlZWQNCj4gbWVtb3J5IHNob3VsZCBub3QgYmUgYWNjZXNz aWJsZSB0byBlaXRoZXIgU01NIGNvZGUgb3Igbm9ybWFsIERYRSBjb2RlLg0KPiBUaGlzIHNlZW1z IHRvIGltcGx5IHRoYXQgYm90aCBzZXRzIG9mIHBhZ2UgdGFibGVzIHNob3VsZCBiZSBtb2RpZmll ZC4NCj4gV2hhdCBhbSBJIG1pc3Npbmc/DQo+IA0KDQpGb3IgYm90aCBTTU0gYW5kIERYRSwgd2Ug anVzdCBkbyAxOjEgZnVsbCBtZW1vcnkgbWFwcGluZyBpbiBwYWdpbmcgYnV0IGluDQpkaWZmZXJl bnQgcGFnZSB0YWJsZXMuIEFzIGZhciBhcyBJIGtub3csIHRoZXJlJ3Mgbm8gc3VjaCBydWxlcyB0 aGF0IGZyZWVkIHBhZ2VzDQpzaG91bGQgbm90IGJlIGFjY2Vzc2libGUuIEkgdGhpbmsgaXQncyBq dXN0IGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4NCg0KPiA+DQo+ID4gVGhlIHNvbHV0aW9uIGlu IHRoaXMgcGF0Y2ggaXMgdG8gc3RvcmUgdGhlIERYRSBwYWdlIHRhYmxlIGluZm9ybWF0aW9uDQo+ ID4gKGUuZy4gdmFsdWUgb2YgQ1IwLCBDUjMgcmVnaXN0ZXJzLCBldGMuKSBpbiBhIGdsb2JhbCB2 YXJpYWJsZSBvZiBDcHVEeGUNCj4gPiBkcml2ZXIuIElmIENwdUR4ZSBkZXRlY3RzIGl0J3MgaW4g U01NIG1vZGUsIGl0IHdpbGwgdXNlIHRoaXMgZ2xvYmFsDQo+ID4gdmFyaWFibGUgdG8gYWNjZXNz IHBhZ2UgdGFibGUgaW5zdGVhZCBvZiBjdXJyZW50IHByb2Nlc3NvciByZWdpc3RlcnMuDQo+ID4N Cj4gPiBDaGFuZ2UtSWQ6IElmODEwYmIxODI4MTYwYjhiZGQ4Y2I2MTZkODZkZjI4NTljNzQ5NzFm DQo+IA0KPiAoMykgSSB0aGluayB0aGlzIGNvbWVzIGZyb20gR2Vycml0LiBEbyB5b3UgcmVhbGx5 IG5lZWQgdGhlICJDaGFuZ2UtSWQiDQo+IHRhZyBpbiB0aGUgY29tbWl0IG1lc3NhZ2U/IEl0IGRv ZXNuJ3Qgc2F5IGFueXRoaW5nIHRvIHRoZSB1cHN0cmVhbSBlZGsyDQo+IHVzZXJzLg0KPiANCj4g SWYgeW91IHJlYWxseSBuZWVkIGl0LCBJIGRvbid0IG1pbmQgaXQgdGhvdWdoOyBqdXN0IHBsZWFz ZSBsZXQncyBub3QgYWRkDQo+IGl0IGR1ZSB0byBvdmVyc2lnaHQuDQo+IA0KDQpTb3JyeSwgaXQn cyBhZGRlZCBieSBvdXIgaW50ZXJuYWwgdG9vbCBhdXRvbWF0aWNhbGx5LiBJdCBjYW4gYmUgZGVs ZXRlZC4NCg0KPiAoNCkgUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdSBkb24ndCAqcHVzaCogdGhl IHBhdGNoIHdpdGggR2Vycml0LiBHZXJyaXQNCj4gZG9lcyBiYWQgdGhpbmdzIHRvIGdpdCBtZXRh ZGF0YS4gUGxlYXNlIHNlZQ0KPiA8aHR0cDovL21pZC5tYWlsLQ0KPiBhcmNoaXZlLmNvbS80QTg5 RTJFRjNERkVEQjRDOEJGREU1MTAxNEY2MDZBMTRFMjIzNDREQFNIU01TWDEwNC5jDQo+IGNyLmNv cnAuaW50ZWwuY29tPi4NCj4gDQoNClN1cmUuDQoNCj4gPiBDYzogRXJpYyBEb25nIDxlcmljLmRv bmdAaW50ZWwuY29tPg0KPiA+IENjOiBMYXN6bG8gRXJzZWsgPGxlcnNla0ByZWRoYXQuY29tPg0K PiA+IENjOiBKaWV3ZW4gWWFvIDxqaWV3ZW4ueWFvQGludGVsLmNvbT4NCj4gPiBDYzogUnVpeXUg TmkgPHJ1aXl1Lm5pQGludGVsLmNvbT4NCj4gPiBDb250cmlidXRlZC11bmRlcjogVGlhbm9Db3Jl IENvbnRyaWJ1dGlvbiBBZ3JlZW1lbnQgMS4xDQo+ID4gU2lnbmVkLW9mZi1ieTogSmlhbiBKIFdh bmcgPGppYW4uai53YW5nQGludGVsLmNvbT4NCj4gPiAtLS0NCj4gPiAgVWVmaUNwdVBrZy9DcHVE eGUvQ3B1RHhlLmMgICAgICAgfCAgIDIgKy0NCj4gPiAgVWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhl LmluZiAgICAgfCAgIDEgKw0KPiA+ICBVZWZpQ3B1UGtnL0NwdUR4ZS9DcHVQYWdlVGFibGUuYyB8 IDEwOCArKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQ0KPiAtLS0tLS0tLS0tDQo+ID4gIDMg ZmlsZXMgY2hhbmdlZCwgNzUgaW5zZXJ0aW9ucygrKSwgMzYgZGVsZXRpb25zKC0pDQo+ID4NCj4g PiBkaWZmIC0tZ2l0IGEvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhlLmMgYi9VZWZpQ3B1UGtnL0Nw dUR4ZS9DcHVEeGUuYw0KPiA+IGluZGV4IDZhZTJkY2QxYzcuLjFmZDk5NmZjM2YgMTAwNjQ0DQo+ ID4gLS0tIGEvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhlLmMNCj4gPiArKysgYi9VZWZpQ3B1UGtn L0NwdUR4ZS9DcHVEeGUuYw0KPiA+IEBAIC00MDQsNyArNDA0LDcgQEAgQ3B1U2V0TWVtb3J5QXR0 cmlidXRlcyAoDQo+ID4gICAgLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcHV0aW5nLg0KPiA+ ICAgIC8vDQo+ID4gICAgaWYgKG1Jc0ZsdXNoaW5nR0NEKSB7DQo+ID4gLSAgICBERUJVRygoREVC VUdfSU5GTywgIiAgRmx1c2hpbmcgR0NEXG4iKSk7DQo+ID4gKyAgICBERUJVRygoREVCVUdfR0NE LCAiICBGbHVzaGluZyBHQ0RcbiIpKTsNCj4gPiAgICAgIHJldHVybiBFRklfU1VDQ0VTUzsNCj4g PiAgICB9DQo+IA0KPiAoNSkgSSB0aGluayBpdCB3b3VsZCBiZSBjbGVhbmVyIGlmIHdlIGZpeGVk IHRoZSBkZWJ1ZyBsZXZlbCBmb3IgdGhpcw0KPiBtZXNzYWdlIGluIGEgc2VwYXJhdGUgcGF0Y2gu IFlvdSBhcmUgbm90IHRvdWNoaW5nICJDcHVEeGUuYyIgZm9yIGFueQ0KPiBvdGhlciByZWFzb24u DQo+IA0KDQpNeSBmYXVsdC4gSSBmb3Jnb3QgdG8gcmVzdG9yZSBpdC4gSXQncyBqdXN0IGZvciBt eSB0ZXN0Lg0KDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvVWVmaUNwdVBrZy9DcHVEeGUvQ3B1RHhl LmluZiBiL1VlZmlDcHVQa2cvQ3B1RHhlL0NwdUR4ZS5pbmYNCj4gPiBpbmRleCAzYzkzOGNlZTUz Li44Yzg3NzNhZjkwIDEwMDY0NA0KPiA+IC0tLSBhL1VlZmlDcHVQa2cvQ3B1RHhlL0NwdUR4ZS5p bmYNCj4gPiArKysgYi9VZWZpQ3B1UGtnL0NwdUR4ZS9DcHVEeGUuaW5mDQo+ID4gQEAgLTY2LDYg KzY2LDcgQEANCj4gPiAgW1Byb3RvY29sc10NCj4gPiAgICBnRWZpQ3B1QXJjaFByb3RvY29sR3Vp ZCAgICAgICAgICAgICAgICAgICAgICAgIyMgUFJPRFVDRVMNCj4gPiAgICBnRWZpTXBTZXJ2aWNl UHJvdG9jb2xHdWlkICAgICAgICAgICAgICAgICAgICAgIyMgUFJPRFVDRVMNCj4gPiArICBnRWZp U21tQmFzZTJQcm90b2NvbEd1aWQNCj4gDQo+ICg2KSBwcm90b2NvbCB1c2FnZSBub3RlIGlzIG1p c3NpbmcgKHNob3VsZCBiZSAiIyMgU09NRVRJTUVTX0NPTlNVTUVTIiBJDQo+IHRoaW5rLikNCg0K WW91J3JlIHJpZ2h0LiBJJ2xsIGFkZCBpdC4NCg0KPiANCj4gPg0KPiA+ICBbR3VpZHNdDQo+ID4g ICAgZ0lkbGVMb29wRXZlbnRHdWlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIENPTlNV TUVTICAgICAgICAgICAjIyBFdmVudA0KPiA+IGRpZmYgLS1naXQgYS9VZWZpQ3B1UGtnL0NwdUR4 ZS9DcHVQYWdlVGFibGUuYw0KPiBiL1VlZmlDcHVQa2cvQ3B1RHhlL0NwdVBhZ2VUYWJsZS5jDQo+ ID4gaW5kZXggZTI1OTViNGQ4OS4uYmY0MjBkMzc5MiAxMDA2NDQNCj4gPiAtLS0gYS9VZWZpQ3B1 UGtnL0NwdUR4ZS9DcHVQYWdlVGFibGUuYw0KPiA+ICsrKyBiL1VlZmlDcHVQa2cvQ3B1RHhlL0Nw dVBhZ2VUYWJsZS5jDQo+ID4gQEAgLTIzLDYgKzIzLDcgQEANCj4gPiAgI2luY2x1ZGUgPExpYnJh cnkvRGVidWdMaWIuaD4NCj4gPiAgI2luY2x1ZGUgPExpYnJhcnkvVWVmaUJvb3RTZXJ2aWNlc1Rh YmxlTGliLmg+DQo+ID4gICNpbmNsdWRlIDxQcm90b2NvbC9NcFNlcnZpY2UuaD4NCj4gPiArI2lu Y2x1ZGUgPFByb3RvY29sL1NtbUJhc2UyLmg+DQo+ID4NCj4gPiAgI2luY2x1ZGUgIkNwdUR4ZS5o Ig0KPiA+ICAjaW5jbHVkZSAiQ3B1UGFnZVRhYmxlLmgiDQo+ID4gQEAgLTg3LDcgKzg4LDMzIEBA IFBBR0VfQVRUUklCVVRFX1RBQkxFIG1QYWdlQXR0cmlidXRlVGFibGVbXSA9IHsNCj4gPiAgICB7 UGFnZTFHLCAgU0laRV8xR0IsIFBBR0lOR18xR19BRERSRVNTX01BU0tfNjR9LA0KPiA+ICB9Ow0K PiA+DQo+ID4gLVBBR0VfVEFCTEVfUE9PTCAgICptUGFnZVRhYmxlUG9vbCA9IE5VTEw7DQo+ID4g K1BBR0VfVEFCTEVfUE9PTCAgICAgICAgICAgICAgICAgICAqbVBhZ2VUYWJsZVBvb2wgPSBOVUxM Ow0KPiA+ICtQQUdFX1RBQkxFX0xJQl9QQUdJTkdfQ09OVEVYVCAgICAgbVBhZ2luZ0NvbnRleHQ7 DQo+ID4gK0VGSV9TTU1fQkFTRTJfUFJPVE9DT0wgICAgICAgICAgICAqbVNtbUJhc2UyID0gTlVM TDsNCj4gPiArDQo+ID4gK0JPT0xFQU4NCj4gPiArSXNJblNtbSAoDQo+ID4gKyAgVk9JRA0KPiA+ ICsgICkNCj4gPiArew0KPiA+ICsgIEVGSV9TVEFUVVMgICAgICAgICAgICAgIFN0YXR1czsNCj4g PiArICBCT09MRUFOICAgICAgICAgICAgICAgICBJblNtbTsNCj4gPiArDQo+ID4gKyAgSW5TbW0g PSBGQUxTRTsNCj4gPiArICBpZiAobVNtbUJhc2UyID09IE5VTEwpIHsNCj4gPiArICAgIFN0YXR1 cyA9IGdCUy0+TG9jYXRlUHJvdG9jb2wgKCZnRWZpU21tQmFzZTJQcm90b2NvbEd1aWQsIE5VTEws DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVk9JRCAqKikmbVNtbUJh c2UyKTsNCj4gDQo+ICg3KSBJbmRlbnRhdGlvbiBpcyBpbmNvcnJlY3QuDQo+IA0KDQpJdCdsbCBi ZSBmaXhlZC4NCg0KPiA+ICsgICAgaWYgKEVGSV9FUlJPUiAoU3RhdHVzKSkgew0KPiA+ICsgICAg ICBtU21tQmFzZTIgPSBOVUxMOw0KPiA+ICsgICAgfQ0KPiANCj4gKDgpIEkgdGhpbmsgeW91IGNh biBzaW1wbHkgZHJvcCB0aGUgRUZJX0VSUk9SIChTdGF0dXMpIGJyYW5jaDsNCj4gIm1TbW1CYXNl MiIgd2lsbCBzaW1wbHkgcmVtYWluIE5VTEwuDQo+IA0KPiA+ICsgIH0NCj4gPiArDQo+ID4gKyAg aWYgKG1TbW1CYXNlMiAhPSBOVUxMKSB7DQo+ID4gKyAgICBtU21tQmFzZTItPkluU21tIChtU21t QmFzZTIsICZJblNtbSk7DQo+ID4gKyAgfQ0KPiA+ICsNCj4gPiArICByZXR1cm4gSW5TbW07DQo+ ID4gK30NCj4gDQo+ICg5KSBJIGRvbid0IHVuZGVyc3RhbmQgaG93IHRoZSBJblNtbSgpIG1lbWJl ciBmdW5jdGlvbiBpcyBzdXBwb3NlZCB0bw0KPiB3b3JrLiBBY2NvcmRpbmcgdG8gdGhlIFBJIHNw ZWMgKHYxLjYpOg0KPiANCj4gIiIiDQo+IEVGSV9NTV9CQVNFX1BST1RPQ09MLkluTW0oKQ0KPiBb Li4uXQ0KPiBTZXJ2aWNlIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGRyaXZlciBpcyBjdXJyZW50 bHkgZXhlY3V0aW5nIGluIHRoZSBNTQ0KPiBEcml2ZXIgSW5pdGlhbGl6YXRpb24gcGhhc2UuDQo+ IFsuLi5dDQo+IEluTW1yYW0NCj4gUG9pbnRlciB0byBhIEJvb2xlYW4gd2hpY2gsIG9uIHJldHVy biwgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBpcw0KPiBjdXJyZW50bHkgZXhlY3V0aW5nIGlu c2lkZSBvZiBNTVJBTSAoVFJVRSkgb3Igb3V0c2lkZSBvZiBNTVJBTSAoRkFMU0UpLg0KPiBbLi4u XQ0KPiBUaGlzIHNlcnZpY2UgcmV0dXJucyB3aGV0aGVyIHRoZSBjYWxsZXIgaXMgYmVpbmcgZXhl Y3V0ZWQgaW4gdGhlIE1NDQo+IERyaXZlciBJbml0aWFsaXphdGlvbiBwaGFzZS4gRm9yIE1NIERy aXZlcnMsIHRoaXMgd2lsbCByZXR1cm4gVFJVRSBpbg0KPiBJbk1tcmFtIHdoaWxlIGluc2lkZSB0 aGUgZHJpdmVy4oCZcyBlbnRyeSBwb2ludCBhbmQgb3RoZXJ3aXNlIEZBTFNFLiBGb3INCj4gY29t YmluYXRpb24gTU0vRFhFIGRyaXZlcnMsIHRoaXMgd2lsbCByZXR1cm4gRkFMU0UgaW4gdGhlIERY RSBsYXVuY2guDQo+IEZvciB0aGUgTU0gbGF1bmNoLCBpdCBiZWhhdmVzIGFzIGFuIE1NIERyaXZl ci4NCj4gIiIiDQo+IA0KPiBGaXJzdCBvZiBhbGwsIHRvIG15IGtub3dsZWRnZSwgd2UgZG9uJ3Qg aGF2ZSBhbnkgY29tYmluYXRpb24gTU0vRFhFDQo+IGRyaXZlcnMgaW4gZWRrMiAod2l0aCBkdWFs IGVudHJ5IHBvaW50IGxhdW5jaGVzLCBiaW5hcnkgdHlwZSAweDBDKS4gV2UNCj4gaGF2ZSB0cmFk aXRpb25hbCBNTSBkcml2ZXJzIChiaW5hcnkgdHlwZSAweDBBKSB0aGF0IGFyZSBsYXVuY2hlZA0K PiBkaXJlY3RseSBmcm9tIFNNUkFNLiBIb3dldmVyLCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0 IHRoZXkgYXJlDQo+IGxhdW5jaGVkIHdpdGggdGhlIHByb2Nlc3NvciBvcGVyYXRpbmcgaW4gU3lz dGVtIE1hbmFnZW1lbnQgTW9kZS4NCj4gDQo+IFNlY29uZGx5LCBmb2N1c2luZyBvbiB0cmFkaXRp b25hbCBNTSBkcml2ZXJzLCB0aGUgSW5NbSgpIHNwZWNpZmljYXRpb24NCj4gZG9lc24ndCBzZWVt IHRvIHNheSBhbnl0aGluZyBhcyB0byB3aGV0aGVyIHRoZSBwcm9jZXNzb3IgaXMgcnVubmluZyBp bg0KPiBTTU0gKHN5c3RlbSBtYW5hZ2VtZW50IG1vZGUpIG9yIG5vcm1hbCBtb2RlLiBJbml0aWFs bHksIFNNUkFNIGlzIG9wZW4sDQo+IGFuZCB0aHVzIHRoZSBwcm9jZXNzb3IgY2FuIGV4ZWN1dGUg TU0gZHJpdmVyIGNvZGUgb3V0IG9mIGl0IHdpdGhvdXQNCj4gYWN0dWFsbHkgb3BlcmF0aW5nIGlu IFNNTSAoc2VlIGFib3ZlKS4NCj4gDQo+IEZ1cnRoZXJtb3JlLCBDcHVEeGUgaXMgYSBEWEVfRFJJ VkVSLCB0aHVzIGl0IGlzIG5ldmVyIGxvYWRlZCBpbnRvIFNNUkFNLg0KPiANCj4gSSBub3RpY2Ug dGhhdCB5b3UgY2FsbCB0aGUgIkluTW1yYW0iIHBhcmFtZXRlciAiSW5TbW0iLiBBcmUgeW91IHNh eWluZw0KPiB0aGF0IHRoZSBQSSBzcGVjIGlzIHdyb25nLCBhbmQgZWRrMiBhY3R1YWxseSByZXR1 cm5zIHdoZXRoZXIgdGhlDQo+IHByb2Nlc3NvciBpcyBleGVjdXRpbmcgQ3B1RHhlIGNvZGUgaW4g TWFuYWdlbWVudCBNb2RlPyAoRHVlIHRvIGEgY2FsbA0KPiBmcm9tIHRoZSBlbnRyeSBwb2ludCBm dW5jdGlvbiBvZiBhIHRyYWRpdGlvbmFsIE1NIGRyaXZlcj8pDQo+IA0KPiBUaGlyZCwgdGhlIHNw ZWMgaXMgaW5jb25zaXN0ZW50IGV2ZW4gd2l0aCBpdHNlbGYuIFRoZSBnZW5lcmFsDQo+IGRlc2Ny aXB0aW9uIHNheXMsICJGb3IgTU0gRHJpdmVycywgdGhpcyB3aWxsIHJldHVybiBUUlVFIGluIElu TW1yYW0NCj4gd2hpbGUgaW5zaWRlIHRoZSBkcml2ZXLigJlzIGVudHJ5IHBvaW50IGFuZCBvdGhl cndpc2UgRkFMU0UiLiBCdXQgYSBEWEUNCj4gcHJvdG9jb2wgbXVzdCBub3QgZXZlbiBiZSBpbnZv a2VkIGZyb20gYSB0cmFkaXRpb25hbCBNTSBkcml2ZXIgKmV4Y2VwdCoNCj4gZnJvbSB0aGUgZW50 cnkgcG9pbnQhIFdoaWNoIHdvdWxkIGltcGx5IHRoYXQsIGZvciB0cmFkaXRpb25hbCBNTQ0KPiBk cml2ZXJzLCB0aGUgb3V0cHV0IHBhcmFtZXRlciBjb3VsZCBvbmx5IGJlIHNldCB0byBUUlVFLg0K PiANCj4gU28gYmFzaWNhbGx5IHdoYXQgSSdkIGxpa2UgdG8gc2VlIGhlcmUgaXMgZXZpZGVuY2Ug dGhhdA0KPiANCj4gKDlhKSB0aGUgSXNJblNtbSgpIGhlbHBlciBmdW5jdGlvbiBpcyBuZXZlciBj YWxsZWQgb3V0c2lkZSBvZiB0aGUgZW50cnkNCj4gICAgICBwb2ludCBvZiBhbiBNTSBkcml2ZXIs IGR1ZSB0byB0aGUgcmVzdHJpY3Rpb25zIG9uDQo+ICAgICAgZ0JTLT5Mb2NhdGVQcm90b2NvbCgp IGFuZCBtU21tQmFzZTItPkluU21tKCksDQo+IA0KPiAoOWIpIHRoZSBtU21tQmFzZTItPkluU21t KCkgcHJvdG9jb2wgbWVtYmVyIGRldGVybWluZXMgd2hldGhlciBDcHVEeGUgaXMNCj4gICAgICBi ZWluZyBleGVjdXRlZCBieSB0aGUgcHJvY2Vzc29yIGluIE1hbmFnZW1lbnQgTW9kZSwgYW5kICpu b3QqDQo+ICAgICAgd2hldGhlciB0aGUgQ3B1RHhlIGRyaXZlciBpcyBiZWluZyBleGVjdXRlZCBm cm9tIHdpdGhpbiBTTVJBTS4NCj4gDQoNClBsZWFzZSByZWZlciB0byBTdGFyJ3MgY29tbWVudHMu DQoNCj4gPg0KPiA+ICAvKioNCj4gPiAgICBSZXR1cm4gY3VycmVudCBwYWdpbmcgY29udGV4dC4N Cj4gPiBAQCAtMTAyLDQyICsxMjksNDUgQEAgR2V0Q3VycmVudFBhZ2luZ0NvbnRleHQgKA0KPiA+ ICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICBSZWdFYXg7DQo+ID4gICAgVUlOVDMy ICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0VkeDsNCj4gPg0KPiA+IC0gIFplcm9NZW0oUGFn aW5nQ29udGV4dCwgc2l6ZW9mKCpQYWdpbmdDb250ZXh0KSk7DQo+ID4gLSAgaWYgKHNpemVvZihV SU5UTikgPT0gc2l6ZW9mKFVJTlQ2NCkpIHsNCj4gPiAtICAgIFBhZ2luZ0NvbnRleHQtPk1hY2hp bmVUeXBlID0gSU1BR0VfRklMRV9NQUNISU5FX1g2NDsNCj4gPiAtICB9IGVsc2Ugew0KPiA+IC0g ICAgUGFnaW5nQ29udGV4dC0+TWFjaGluZVR5cGUgPSBJTUFHRV9GSUxFX01BQ0hJTkVfSTM4NjsN Cj4gPiAtICB9DQo+ID4gLSAgaWYgKChBc21SZWFkQ3IwICgpICYgQklUMzEpICE9IDApIHsNCj4g PiAtICAgIFBhZ2luZ0NvbnRleHQtPkNvbnRleHREYXRhLlg2NC5QYWdlVGFibGVCYXNlID0gKEFz bVJlYWRDcjMgKCkgJg0KPiBQQUdJTkdfNEtfQUREUkVTU19NQVNLXzY0KTsNCj4gPiAtICB9IGVs c2Ugew0KPiA+IC0gICAgUGFnaW5nQ29udGV4dC0+Q29udGV4dERhdGEuWDY0LlBhZ2VUYWJsZUJh c2UgPSAwOw0KPiA+IC0gIH0NCj4gPiArICBpZiAoIUlzSW5TbW0gKCkpIHsNCj4gPiArICAgIGlm IChzaXplb2YoVUlOVE4pID09IHNpemVvZihVSU5UNjQpKSB7DQo+ID4gKyAgICAgIG1QYWdpbmdD b250ZXh0Lk1hY2hpbmVUeXBlID0gSU1BR0VfRklMRV9NQUNISU5FX1g2NDsNCj4gPiArICAgIH0g ZWxzZSB7DQo+ID4gKyAgICAgIG1QYWdpbmdDb250ZXh0Lk1hY2hpbmVUeXBlID0gSU1BR0VfRklM RV9NQUNISU5FX0kzODY7DQo+ID4gKyAgICB9DQo+ID4gKyAgICBpZiAoKEFzbVJlYWRDcjAgKCkg JiBCSVQzMSkgIT0gMCkgew0KPiA+ICsgICAgICBtUGFnaW5nQ29udGV4dC5Db250ZXh0RGF0YS5Y NjQuUGFnZVRhYmxlQmFzZSA9IChBc21SZWFkQ3IzICgpICYNCj4gUEFHSU5HXzRLX0FERFJFU1Nf TUFTS182NCk7DQo+ID4gKyAgICB9IGVsc2Ugew0KPiA+ICsgICAgICBtUGFnaW5nQ29udGV4dC5D b250ZXh0RGF0YS5YNjQuUGFnZVRhYmxlQmFzZSA9IDA7DQo+ID4gKyAgICB9DQo+ID4NCj4gPiAt ICBpZiAoKEFzbVJlYWRDcjQgKCkgJiBCSVQ0KSAhPSAwKSB7DQo+ID4gLSAgICBQYWdpbmdDb250 ZXh0LT5Db250ZXh0RGF0YS5JYTMyLkF0dHJpYnV0ZXMgfD0NCj4gUEFHRV9UQUJMRV9MSUJfUEFH SU5HX0NPTlRFWFRfSUEzMl9YNjRfQVRUUklCVVRFU19QU0U7DQo+ID4gLSAgfQ0KPiA+IC0gIGlm ICgoQXNtUmVhZENyNCAoKSAmIEJJVDUpICE9IDApIHsNCj4gPiAtICAgIFBhZ2luZ0NvbnRleHQt PkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJTkdf Q09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1BBRTsNCj4gPiAtICB9DQo+ID4gLSAgaWYgKChB c21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApIHsNCj4gPiAtICAgIFBhZ2luZ0NvbnRleHQtPkNv bnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJTkdfQ09O VEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1dQX0VOQUJMRTsNCj4gPiAtICB9DQo+ID4gKyAgICBp ZiAoKEFzbVJlYWRDcjQgKCkgJiBCSVQ0KSAhPSAwKSB7DQo+ID4gKyAgICAgIG1QYWdpbmdDb250 ZXh0LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJ TkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1BTRTsNCj4gPiArICAgIH0NCj4gPiArICAg IGlmICgoQXNtUmVhZENyNCAoKSAmIEJJVDUpICE9IDApIHsNCj4gPiArICAgICAgbVBhZ2luZ0Nv bnRleHQuQ29udGV4dERhdGEuSWEzMi5BdHRyaWJ1dGVzIHw9DQo+IFBBR0VfVEFCTEVfTElCX1BB R0lOR19DT05URVhUX0lBMzJfWDY0X0FUVFJJQlVURVNfUEFFOw0KPiA+ICsgICAgfQ0KPiA+ICsg ICAgaWYgKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApIHsNCj4gPiArICAgICAgbVBhZ2lu Z0NvbnRleHQuQ29udGV4dERhdGEuSWEzMi5BdHRyaWJ1dGVzIHw9DQo+IFBBR0VfVEFCTEVfTElC X1BBR0lOR19DT05URVhUX0lBMzJfWDY0X0FUVFJJQlVURVNfV1BfRU5BQkxFOw0KPiA+ICsgICAg fQ0KPiA+DQo+ID4gLSAgQXNtQ3B1aWQgKDB4ODAwMDAwMDAsICZSZWdFYXgsIE5VTEwsIE5VTEws IE5VTEwpOw0KPiA+IC0gIGlmIChSZWdFYXggPiAweDgwMDAwMDAwKSB7DQo+ID4gLSAgICBBc21D cHVpZCAoMHg4MDAwMDAwMSwgTlVMTCwgTlVMTCwgTlVMTCwgJlJlZ0VkeCk7DQo+ID4gLSAgICBp ZiAoKFJlZ0VkeCAmIEJJVDIwKSAhPSAwKSB7DQo+ID4gLSAgICAgIC8vIFhEIHN1cHBvcnRlZA0K PiA+IC0gICAgICBpZiAoKEFzbVJlYWRNc3I2NCAoMHhDMDAwMDA4MCkgJiBCSVQxMSkgIT0gMCkg ew0KPiA+IC0gICAgICAgIC8vIFhEIGFjdGl2YXRlZA0KPiA+IC0gICAgICAgIFBhZ2luZ0NvbnRl eHQtPkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJ TkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1hEX0FDVElWQVRFRDsNCj4gPiArICAgIEFz bUNwdWlkICgweDgwMDAwMDAwLCAmUmVnRWF4LCBOVUxMLCBOVUxMLCBOVUxMKTsNCj4gPiArICAg IGlmIChSZWdFYXggPiAweDgwMDAwMDAwKSB7DQo+ID4gKyAgICAgIEFzbUNwdWlkICgweDgwMDAw MDAxLCBOVUxMLCBOVUxMLCBOVUxMLCAmUmVnRWR4KTsNCj4gPiArICAgICAgaWYgKChSZWdFZHgg JiBCSVQyMCkgIT0gMCkgew0KPiA+ICsgICAgICAgIC8vIFhEIHN1cHBvcnRlZA0KPiA+ICsgICAg ICAgIGlmICgoQXNtUmVhZE1zcjY0ICgweEMwMDAwMDgwKSAmIEJJVDExKSAhPSAwKSB7DQo+ID4g KyAgICAgICAgICAvLyBYRCBhY3RpdmF0ZWQNCj4gPiArICAgICAgICAgIG1QYWdpbmdDb250ZXh0 LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJTkdf Q09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1hEX0FDVElWQVRFRDsNCj4gPiArICAgICAgICB9 DQo+ID4gKyAgICAgIH0NCj4gPiArICAgICAgaWYgKChSZWdFZHggJiBCSVQyNikgIT0gMCkgew0K PiA+ICsgICAgICAgIG1QYWdpbmdDb250ZXh0LkNvbnRleHREYXRhLklhMzIuQXR0cmlidXRlcyB8 PQ0KPiBQQUdFX1RBQkxFX0xJQl9QQUdJTkdfQ09OVEVYVF9JQTMyX1g2NF9BVFRSSUJVVEVTX1BB R0VfMUdfU1VQUE8NCj4gUlQ7DQo+ID4gICAgICAgIH0NCj4gPiAtICAgIH0NCj4gPiAtICAgIGlm ICgoUmVnRWR4ICYgQklUMjYpICE9IDApIHsNCj4gPiAtICAgICAgUGFnaW5nQ29udGV4dC0+Q29u dGV4dERhdGEuSWEzMi5BdHRyaWJ1dGVzIHw9DQo+IFBBR0VfVEFCTEVfTElCX1BBR0lOR19DT05U RVhUX0lBMzJfWDY0X0FUVFJJQlVURVNfUEFHRV8xR19TVVBQTw0KPiBSVDsNCj4gPiAgICAgIH0N Cj4gPiAgICB9DQo+ID4gKw0KPiA+ICsgIENvcHlNZW0gKFBhZ2luZ0NvbnRleHQsICZtUGFnaW5n Q29udGV4dCwgc2l6ZW9mIChtUGFnaW5nQ29udGV4dCkpOw0KPiA+ICB9DQo+IA0KPiAoMTApIEV2 ZW4gYXNzdW1pbmcgdGhhdCBJc0luU21tKCkgYWx3YXlzIHJldHVybnMgZmFsc2UgLS0gZm9yIGV4 YW1wbGUNCj4gYmVjYXVzZSB0aGUgcGxhdGZvcm0gZG9lcyBub3QgaW5jbHVkZSB0aGUgU01NIGRy aXZlcnMgLS0sIHRoaXMgY2hhbmdlDQo+IGRvZXMgbm90IGxvb2sgbGlrZSBhIG5vLW9wIHRvIG1l Lg0KPiANCj4gVGhlIFplcm9NZW0oKSBjYWxsIGF0IHRoZSB0b3AgaXMgcmVtb3ZlZCBieSB0aGUg cGF0Y2gsIGJ1dCBhdHRyaWJ1dGVzDQo+IGxpa2UgUFNFLCBQQUUsIFdQX0VOQUJMRSwgWERfQUNU SVZBVEVEIGFuZCAxR19TVVBQT1JUIGFyZSBuZXZlcg0KPiAqY2xlYXJlZCogaW4gIm1QYWdpbmdD b250ZXh0Iiwgb25jZSB0aGV5IGFyZSBzZXQuDQo+IA0KPiBJIGd1ZXNzIHRoZSBpZGVhIGlzIHRo YXQgYSBmZXcgKGhvdyBtYW55PykgaW5pdGlhbCBjYWxscyB0bw0KPiBHZXRDdXJyZW50UGFnaW5n Q29udGV4dCgpIHNldCB1cCAibVBhZ2luZ0NvbnRleHQiLCBhbmQgYWZ0ZXIgdGhhdCwNCj4gR2V0 Q3VycmVudFBhZ2luZ0NvbnRleHQoKSBqdXN0IGtlZXBzIHJldHVybmluZyB0aGUgbGFzdCBzZXQg Y29udGV4dC4gQnV0DQo+IEkgZG9uJ3QgdGhpbmsgdGhhdCB0aG9zZSAiaW5pdGlhbCBjYWxscyIg d29yayBjb3JyZWN0bHkuDQo+IA0KDQpZb3UncmUgcmlnaHQuIFRoYW5rcyBmb3IgcG9pbnRpbmcg aXQgb3V0Lg0KIA0KPiA+DQo+ID4gIC8qKg0KPiA+IEBAIC01MDcsNyArNTM3LDEwIEBAIElzUmVh ZE9ubHlQYWdlV3JpdGVQcm90ZWN0ZWQgKA0KPiA+ICAgIFZPSUQNCj4gPiAgICApDQo+ID4gIHsN Cj4gPiAtICByZXR1cm4gKChBc21SZWFkQ3IwICgpICYgQklUMTYpICE9IDApOw0KPiA+ICsgIGlm ICghSXNJblNtbSAoKSkgew0KPiA+ICsgICAgcmV0dXJuICgoQXNtUmVhZENyMCAoKSAmIEJJVDE2 KSAhPSAwKTsNCj4gPiArICB9DQo+ID4gKyAgcmV0dXJuIEZBTFNFOw0KPiA+ICB9DQo+ID4NCj4g PiAgLyoqDQo+ID4gQEAgLTUxOCw3ICs1NTEsOSBAQCBEaXNhYmxlUmVhZE9ubHlQYWdlV3JpdGVQ cm90ZWN0ICgNCj4gPiAgICBWT0lEDQo+ID4gICAgKQ0KPiA+ICB7DQo+ID4gLSAgQXNtV3JpdGVD cjAgKEFzbVJlYWRDcjAoKSAmIH5CSVQxNik7DQo+ID4gKyAgaWYgKCFJc0luU21tICgpKSB7DQo+ ID4gKyAgICBBc21Xcml0ZUNyMCAoQXNtUmVhZENyMCAoKSAmIH5CSVQxNik7DQo+ID4gKyAgfQ0K PiA+ICB9DQo+ID4NCj4gPiAgLyoqDQo+ID4gQEAgLTUyOSw3ICs1NjQsOSBAQCBFbmFibGVSZWFk T25seVBhZ2VXcml0ZVByb3RlY3QgKA0KPiA+ICAgIFZPSUQNCj4gPiAgICApDQo+ID4gIHsNCj4g PiAtICBBc21Xcml0ZUNyMCAoQXNtUmVhZENyMCgpIHwgQklUMTYpOw0KPiA+ICsgIGlmICghSXNJ blNtbSAoKSkgew0KPiA+ICsgICAgQXNtV3JpdGVDcjAgKEFzbVJlYWRDcjAgKCkgfCBCSVQxNik7 DQo+ID4gKyAgfQ0KPiA+ICB9DQo+IA0KPiAoMTEpIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGVzZSBj aGFuZ2VzIGF0IGFsbC4gV2h5IGFyZSB0aGVzZSBmdW5jdGlvbnMNCj4gbm8tb3BzIHdoZW4gQ3B1 RHhlIGlzIGludm9rZWQgaW4gTWFuYWdlbWVudCBNb2RlPw0KPiANCg0KQ1IwLkJJVDE2IGlzIHVz ZWQgdG8gcHJvdGVjdCBjdXJyZW50IChhY3RpdmUpIHBhZ2UgdGFibGUuIEluIENwdUR4ZSwgd2Ug c2hvdWxkDQpub3QgdG91Y2ggU01NIHBhZ2UgdGFibGUgaWYgaW4gU01NIG1vZGUuIEFsdGhvdWdo IGl0IGxvb2tzIGxpa2UgdGhlcmUncyBubw0KcHJvYmxlbSB0byBzZXQgdGhpcyBiaXQgYW55d2F5 IGJlY2F1c2Ugd2UganVzdCB3YW50IHRvIGFjY2VzcyBEWEUgcGFnZSB0YWJsZSwNCkkgZG9uJ3Qg d2FudCB0byByaXNrIHRvIGV4cG9zZSBhbnkgcG90ZW50aWFsIGlzc3VlcyBoZXJlLiBTbyBJIHRo aW5rIGl0IG1heSBiZSBzYWZlcg0Kbm90IHRvIHRvdWNoIGFueSBTTU0gcGFnaW5nIHNldHRpbmdz IGZyb20gbm9uLVNNTSBjb2RlLg0KDQo+IFRoYW5rcw0KPiBMYXN6bG8NCj4gDQo+ID4NCj4gPiAg LyoqDQo+ID4gQEAgLTEwNTQsNiArMTA5MSw3IEBAIEluaXRpYWxpemVQYWdlVGFibGVMaWIgKA0K PiA+ICB7DQo+ID4gICAgUEFHRV9UQUJMRV9MSUJfUEFHSU5HX0NPTlRFWFQgICAgIEN1cnJlbnRQ YWdpbmdDb250ZXh0Ow0KPiA+DQo+ID4gKyAgWmVyb01lbSAoJm1QYWdpbmdDb250ZXh0LCBzaXpl b2YobVBhZ2luZ0NvbnRleHQpKTsNCj4gPiAgICBHZXRDdXJyZW50UGFnaW5nQ29udGV4dCAoJkN1 cnJlbnRQYWdpbmdDb250ZXh0KTsNCj4gPg0KPiA+ICAgIC8vDQo+ID4NCg0K