From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Kuehling, Felix" Subject: Re: [PATCH 2/2] drm/amdgpu: use ring buffer for fault handling on GMC 9 Date: Fri, 1 Feb 2019 16:42:28 +0000 Message-ID: <1ca341ae-1502-6c02-bac4-6bb36d687083@amd.com> References: <20190124125256.9900-1-christian.koenig@amd.com> <20190124125256.9900-2-christian.koenig@amd.com> <39534cbd-d199-8a3d-2a8b-51f9d09e06e0@amd.com> <540f3688-6382-2cd1-f24c-aa378e7f596f@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <540f3688-6382-2cd1-f24c-aa378e7f596f-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> Content-Language: en-US Content-ID: List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: "Koenig, Christian" , "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" Cc: "Yang, Philip" T24gMjAxOS0wMi0wMSA4OjIzIGEubS4sIENocmlzdGlhbiBLw7ZuaWcgd3JvdGU6DQo+IEhpIEZl bGl4LA0KPg0KPiBBbSAzMS4wMS4xOSB1bSAyMjozOCBzY2hyaWViIEt1ZWhsaW5nLCBGZWxpeDoN Cj4+IEkgZG9uJ3Qgc2VlIGhvdyB0aGlzIHNvbHZlcyBhbnl0aGluZy4gWW91J2xsIHN0aWxsIG5l ZWQgdG8gcmVtb3ZlDQo+PiBlbnRyaWVzIGZyb20gdGhpcyBmYXVsdCByaW5nIGJ1ZmZlci4gT3Ro ZXJ3aXNlIHlvdSdsbCBpZ25vcmUgZmF1bHRzIGZvcg0KPj4gYWRkcmVzc2VzIHRoYXQgaGF2ZSBm YXVsdGVkIHJlY2VudGx5LCBhbHRob3VnaCBpdCBtYXkgYmUgYSBuZXcgZmF1bHQuDQo+Pg0KPj4g QWxzbywgdGhpcyByZWludHJvZHVjZXMgaW50ZXJydXB0IHN0b3JtcyBhbmQgcmVwZWF0ZWQgcHJv Y2Vzc2luZyBvZiB0aGUNCj4+IHNhbWUgZmF1bHQgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBtb3Jl IHRoYW4gNjQgZGlzdGluY3QgYWRkcmVzc2VzDQo+PiBmYXVsdGluZyBhdCBvbmNlLg0KPg0KPiBZ ZWFoLCB0aGlzIGlzIG5vdCBtZWFudCB0byBiZSBhIHBlcmZlY3Qgc29sdXRpb24uIEl0IGp1c3Qg d29ya3MgZm9yIG5vdy4NCj4NCj4gS2V5IHBvaW50IGlzIHRoYXQgZnJvbSBteSBleHBlcmllbmNl IHRoZSBoYXJkd2FyZSBuZXZlciBmYXVsdHMgbW9yZSANCj4gdGhhbiAyNiBkaWZmZXJlbnQgYWRk cmVzc2VzIGF0IHRoZSBzYW1lIHRpbWUgKGFuZCBub3QgdGhlIHNsaWdodGVzdCANCj4gaWRlYSB3 aGVyZSB0aGlzIHJlc3RyaWN0aW9uIGNvbWVzIGZyb20pLg0KDQpUaGF0IGNvdWxkIGJlIHNwZWNp ZmljIHRvIHRoZSB0ZXN0IHlvdSdyZSBydW5uaW5nLiBJZiBpdCBvbmx5IHVzZXMgMjYgb3IgDQps ZXNzIHBhZ2VzIHBlciBkcmF3IG9wZXJhdGlvbiwgeW91IHdvbid0IGdldCBtb3JlIGFkZHJlc3Nl cyBmYXVsdGluZyBhdCANCnRoZSBzYW1lIHRpbWUuIEknbSBhbG1vc3QgY2VydGFpbiBjb21wdXRl IGFwcHMgY2FuIGNyZWF0ZSBtb3JlIA0Kb3V0c3RhbmRpbmcgcGFnZSBmYXVsdHMgd2l0aCBsYXJn ZSBkYXRhIHNldHMuDQoNCg0KPiBTbyB3aXRoIDY0IGRpc3RpbmN0IGFkZHJlc3NlcyB3ZSBzaG91 bGQgYmUgb24gdGhlIHNhZmUgc2lkZS4NCg0KSSB0aGluayBQaGlsaXAgaGFzIHNlZW4gbW9yZSBm YXVsdHMgYXQgdGhlIHNhbWUgdGltZSB3aXRoIGhpcyB0ZXN0cy4gDQpQaGlsaXAsIGNhbiB5b3Ug Y29uZmlybS4NCg0KDQo+DQo+IFdoYXQgY2FuIG9idmlvdXNseSBoYXBwZW4gaXMgdGhhdCBoYXJk d2FyZSBmYXVsdHMgYWRkcmVzcyBBLCB3ZSBzZXJ2ZSANCj4gdGhhdCBvbmUsIE9TIGV2aWN0cyBw YWdlIGF0IGFkZHJlc3MgQSwgYnV0IGFkZHJlc3MgQSBpcyBzdGlsbCBpbiB0aGUgDQo+IGZhdWx0 IGhhbmRsaW5nIGFuZCB3ZSBuZXZlciBub3RpY2UgdGhhdCBpdCBpcyBmYXVsdGVkIG9uY2UgbW9y ZS4NCg0KRXhhY3RseS4gVGhhdCdzIG15IGNvbmNlcm4uDQoNCg0KPg0KPj4gSSB0aGluayB0aGUg c29sdXRpb24gc2hvdWxkIGJlIGRpZmZlcmVudC4gV2UgZG8gbmVlZCBhIHdheSB0byBpZ25vcmUN Cj4+IGR1cGxpY2F0ZSBmYXVsdHMgZm9yIHRoZSBzYW1lIGFkZHJlc3MuIFRoZSBwcm9ibGVtIHlv dSByYW4gaW50byB3YXMgdGhhdA0KPj4gYWZ0ZXIgY2xlYXJpbmcgYW4gZW50cnksIHlvdSBnZXQg YWRkaXRpb25hbCBpbnRlcnJ1cHRzIGZvciB0aGUgc2FtZQ0KPj4gYWRkcmVzcy4gVGhpcyBjb3Vs ZCBiZSBoYW5kbGVkIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGFnZSBvZiBJSCByaW5nDQo+PiBl bnRyaWVzLiBBZnRlciB3ZSB1cGRhdGUgdGhlIHBhZ2UgdGFibGUgYW5kIGZsdXNoIFRMQnMsIHRo ZXJlIG1heSBzdGlsbA0KPj4gYmUgc3RhbGUgZW50cmllcyBpbiB0aGUgSUggcmluZy4gQnV0IG5v IG5ldyBpbnRlcnJ1cHRzIHNob3VsZCBiZQ0KPj4gZ2VuZXJhdGVkICh1bnRpbCB0aGF0IFBURSBp cyBpbnZhbGlkYXRlZCBhZ2FpbikuIFNvIHdlIGNhbiBjaGVjayB0aGUNCj4+IGN1cnJlbnQgSUgg d3B0ci4gV2hlbiBJSCBwcm9jZXNzaW5nIChycHRyKSBoYXMgY2F1Z2h0IHVwIHRvIHRoYXQgdmFs dWUsDQo+PiBhbGwgdGhlIHN0YWxlIHJldHJ5IGludGVycnVwdHMgaGF2ZSBiZWVuIGZsdXNoZWQs IGFuZCB3ZSBjYW4gcmVtb3ZlIHRoZQ0KPj4gZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSAob3Ig cmluZyBidWZmZXIpLiBBbnkgc3Vic2VxdWVudCBpbnRlcnJ1cHRzDQo+PiBmb3IgdGhlIHNhbWUg YWRkcmVzcyBhcmUgbmV3IGFuZCBzaG91bGQgYmUgaGFuZGxlZCBhZ2Fpbi4NCj4NCj4gVGhhdCdz IHdoYXQgSSB0aG91Z2h0IGluaXRpYWxseSBhcyB3ZWxsLCBidXQgdGhlIHByb2JsZW0gaXMgdGhp cyBoYXMgDQo+IGFic29sdXRlbHkgbm90aGluZyB0b2RvIHdpdGggdGhlIElIIHJpbmcgYnVmZmVy IHNpemUuDQo+DQo+IFNlZSB0aGUgSUggcmluZyBpcyBvbmx5IDMyIGVudHJpZXMsIGJ1dCBpbiBt eSB0ZXN0cyBJJ3ZlIHNvbWV0aW1lcyBnb3QgDQo+ID4yMDAgc3RhbGUgZmF1bHRzIGZyb20gdGhl IGhhcmR3YXJlLg0KPg0KPiBUaGUgZXhwbGFuYXRpb24gaXMgdGhhdCBJIHJlY2VudGx5IGxlYXJu ZWQgZnJvbSB0aGUgaGFyZHdhcmUgZ3V5cyB0aGF0IA0KPiB0aGUgVkEgZmlmbyBvZiB0aGUgU0RN QSBpcyAyNTYgZW50cmllcyBsb25nISBBbmQgSSBzdXNwZWN0IHRoYXQgdGhlIA0KPiBHRlggZmlm byBpcyBub3Qgc2hvcnRlci4NCj4NCj4gVG8gbWFrZSB0aGUgc2l0dWF0aW9uIGV2ZW4gd29yc2Ug SSBoYXZlIGEgbmljZSBsb2cgd2hlcmUgYSByZW5kZXJpbmcgDQo+IG9wZXJhdGlvbiBjb21wbGV0 ZWQgKHdpdGggaW50ZXJydXB0IGFuZCBldmVyeXRoaW5nIGZpbmlzaGVkKSwgDQo+IGFjY29yZGlu ZyB0byB0aGUgcmVnaXN0ZXJzIHRoZSBHRlggYmxvY2sgaXMgY29tcGxldGVseSBpZGxlIGFuZCB5 b3UgDQo+IGFyZSBzdGlsbCBnZXR0aW5nIGh1bmRyZWRzIG9mIHN0YWxlIGZhdWx0cyBmb3IgdGhp cyBvcGVyYXRpb24uDQo+DQo+IE5pY2UgaXNuJ3QgaXQ/IFNvIHdlIGNhbiBjZXJ0YWlubHkgbm90 IHRpZSB0aGlzIHRvIHRoZSBWTSBvciB3ZSBhcmUgDQo+IGdvaW5nIHRvIG5lZWQgc29tZSBncmFj ZSBwZXJpb2QgYmVmb3JlIGRlc3Ryb3lpbmcgVk1zIG9yIHNvbWV0aGluZyANCj4gbGlrZSB0aGlz Lg0KDQpEYW1uLiBUaGVyZSBpcyB0aGUgYXNwZWN0IG9mIGhvdyB0byBoYW5kbGUgVk0gZGVzdHJ1 Y3Rpb24uIEJ1dCBhbHNvIHRoZSANCnF1ZXN0aW9uIG9mIHdoZW4gdG8gcmVtb3ZlIGVudHJpZXMg ZnJvbSB0aGUgaGFzaCB0YWJsZSBvciBhIHJpbmcgYnVmZmVyLiANCldlIGtub3cgd2hlbiB3ZSBp bnZhbGlkYXRlIHBhZ2UgdGFibGUgZW50cmllcywgc28gdGhhdCBjb3VsZCBiZSBhIGdvb2QgDQp0 aW1lIHRvIHJlbW92ZSBlbnRyaWVzIGFuZCBhbGxvdyBuZXcgcGFnZSBmYXVsdHMgZm9yIHRoZSBh ZGRyZXNzIGluIA0KcXVlc3Rpb24uIEJ1dCBsZXRzIHRha2UgYSBzdGVwIGJhY2sgaGVyZS4NCg0K VGhlIGNvbnNlcXVlbmNlIG9mIHRob3NlIHVucHJlZGljdGFibGUgc3RhbGUgcGFnZSBmYXVsdHMg aXMsIGFuIA0KaW50ZXJydXB0IG1lYW5zIHRoYXQgdGhlcmUgbWF5IG9yIG1heSBub3QgYmUgYSB2 YWxpZCByZWFzb24gdG8gdXBkYXRlIA0KdGhlIHBhZ2UgdGFibGUuIFdoZXRoZXIgb3Igbm90IHRo ZSBkcml2ZXIgbmVlZHMgdG8gZG8gYW55dGhpbmcgd2lsbCBuZWVkIA0KdG8gYmUgZGV0ZXJtaW5l ZCBub3QganVzdCBiYXNlZCBvbiB0aGUgaW50ZXJydXB0LCBidXQgYmFzZWQgb24gdGhlIA0KZHJp dmVyJ3Mga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwYWdlIHRhYmxlLiBJ ZiB0aGVyZSBpcyBhIA0KdmFsaWQgZW50cnkgd2l0aCB0aGUgcmlnaHQgcGVybWlzc2lvbnMsIHdl IGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuIA0KVGhlIGRyaXZlciB3aWxsIG5lZWQgdG8gdHJh Y2sgZW5vdWdoIGluZm9ybWF0aW9uIHRvIG1ha2UgdGhhdCANCmRldGVybWluYXRpb24gcXVpY2ts eS4gSWYgd2UgY2FuIGRvIHRoYXQsIHdlIHByb2JhYmx5IGRvbid0IG5lZWQgYSBoYXNoIA0KdGFi bGUgb3IgYSByaW5nIGJ1ZmZlci4NCg0KV2UgZG8gbmVlZCBhIGZhc3QgcGF0aCB0byBpZ25vcmUg cmVkdW5kYW50IGludGVycnVwdHMgdG8gaGFuZGxlIHRoZSANCmludGVycnVwdCBzdG9ybS4gVGhl IGhhc2ggdGFibGUgbWF5IG5vdCBiZSB0aGUgcmlnaHQgYXBwcm9hY2guIFRoZSByaW5nIA0KYnVm ZmVyIHlvdSBhZGRlZCBpcyBkZWZpbml0ZWx5IG5vdCB0aGUgcmlnaHQgYXBwcm9hY2guIEEgcXVp Y2sgbG9va3VwIG9mIA0KdGhlIHN0YXRlIG9mIHRoZSBwYWdlIHRhYmxlIGF0IGEgZ2l2ZW4gYWRk cmVzcyBzZWVtcyBsaWtlIHRoZSByaWdodCANCmFwcHJvYWNoLiBUaGUgcGFnZSB0YWJsZSBpbiBW UkFNIGlzIHRvbyBzbG93IHRvIGFjY2Vzcy4gV2UnbGwgbmVlZCB0byANCnNoYWRvdyB0aGUgdmFs aWQgYW5kIHBlcm1pc3Npb25zIGJpdHMgb2YgYWxsIGFsbG9jYXRlZCBQVHMgaW4gdGhlIA0KZHJp dmVyLiBXaGVuIHdlIGFkZCBwYWdlIG1pZ3JhdGlvbiwgd2UnbGwgYWxzbyBuZWVkIHRvIHRyYWNr IGluZm9ybWF0aW9uIA0KYWJvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBtYXBwZWQgbWVtb3J5IChz YW1lIEdQVSwgcmVtb3RlIEdQVSwgc3lzdGVtIA0KbWVtb3J5KS4gSSB0aGluayBvbmUgYnl0ZSBw ZXIgUFRFIHNob3VsZCBjb3ZlciBpdC4NCg0KRm9yIGhhbmRsaW5nIFZNIHRlYXJkb3duLCB3ZSBu ZWVkIHRvIGlnbm9yZSBwYWdlIGZhdWx0cyBmcm9tIFZNcyB0aGF0IA0KZG9uJ3QgZXhpc3QgYW55 IG1vcmUuIFdlIG1heSBuZWVkIHNvbWUgbWVjaGFuaXNtIHRvIGF2b2lkIHJldXNlIG9mIA0KUEFT SURzIHVudGlsIHdlIGNhbiBiZSBzdXJlIHRoZXJlIHdpbGwgYmUgbm8gbW9yZSBzdGFsZSBwYWdl IGZhdWx0cyBmcm9tIA0KdGhhdCBQQVNJRC4gVGhlbiB3ZSBjYW4gc2ltcGx5IGlnbm9yZSBwYWdl IGZhdWx0cyB3aXRoIFBBU0lEcyB0aGF0IA0KYXJlbid0IGFsbG9jYXRlZC4gSSBkb24ndCBoYXZl IGEgZ29vZCBpZGVhIGhvdyBsb25nIHdlIG5lZWQgdG8gDQpxdWFyYW50aW5lIFBBU0lEcyBhZnRl ciBkZXN0cm95aW5nIFZNcyB5ZXQuIFdlJ2xsIG5lZWQgdG8gZmluZCBzb21lIA0KcmVhc29uYWJs ZSBjcml0ZXJpYSBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIElSUXMgaGFuZGxlZCwgb3IgbWF5YmUg DQp0aW1lLWJhc2VkLg0KDQpSZWdhcmRzLA0KIMKgIEZlbGl4DQoNCg0KPg0KPiBSZWdhcmRzLA0K PiBDaHJpc3RpYW4uDQo+DQo+Pg0KPj4gUmVnYXJkcywNCj4+IMKgIMKgIEZlbGl4DQo+Pg0KPj4g T24gMjAxOS0wMS0yNCA3OjUyIGEubS4sIENocmlzdGlhbiBLw7ZuaWcgd3JvdGU6DQo+Pj4gRnVy dGhlciB0ZXN0aW5nIHNob3dlZCB0aGF0IHRoZSBpZGVhIHdpdGggdGhlIGNoYXNoIGRvZXNuJ3Qg d29yayBhcyANCj4+PiBleHBlY3RlZC4NCj4+PiBFc3BlY2lhbGx5IHdlIGNhbid0IHByZWRpY3Qg d2hlbiB3ZSBjYW4gcmVtb3ZlIHRoZSBlbnRyaWVzIGZyb20gdGhlIA0KPj4+IGhhc2ggYWdhaW4u DQo+Pj4NCj4+PiBTbyByZXBsYWNlIHRoZSBjaGFzaCB3aXRoIGEgc2ltcGxlIHJpbmcgYnVmZmVy IGZvciBub3cgdG8gZmlsdGVyIG91dCANCj4+PiB0aGUNCj4+PiBhbHJlYWR5IGhhbmRsZWQgZmF1 bHRzLiBBcyBsb25nIGFzIHdlIHNlZSBsZXNzIHRoYW4gNjQgZGlzdGluY3QgDQo+Pj4gYWRkcmVz c2VzIHdlDQo+Pj4gc3RpbGwgcmVwb3J0IHRoZW0gb25seSBvbmNlIHRvIHRoZSBmb2xsb3dpbmcg aGFuZGxpbmcuDQo+Pj4NCj4+PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RpYW4gS8O2bmlnIDxjaHJp c3RpYW4ua29lbmlnQGFtZC5jb20+DQo+Pj4gLS0tDQo+Pj4gwqDCoCBkcml2ZXJzL2dwdS9kcm0v S2NvbmZpZ8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoCAyIC0NCj4+ PiDCoMKgIGRyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfMKgwqAgMSAtDQo+Pj4gwqDCoCBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9h bWRncHVfZ21jLmjCoMKgIHzCoMKgIDggKw0KPj4+IMKgwqAgZHJpdmVycy9ncHUvZHJtL2FtZC9h bWRncHUvYW1kZ3B1X3ZtLmPCoMKgwqAgfCAxMDUgLS0tLQ0KPj4+IMKgwqAgZHJpdmVycy9ncHUv ZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmjCoMKgwqAgfMKgIDE0IC0NCj4+PiDCoMKgIGRyaXZl cnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192OV8wLmPCoMKgwqDCoCB8wqAgNDAgKy0NCj4+PiDC oMKgIGRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oIHwgMzY2IC0tLS0t LS0tLS0tLS0NCj4+PiDCoMKgIGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWfCoMKgwqDC oMKgwqDCoMKgwqDCoCB8wqAgMjggLQ0KPj4+IMKgwqAgZHJpdmVycy9ncHUvZHJtL2FtZC9saWIv TWFrZWZpbGXCoMKgwqDCoMKgwqDCoMKgwqAgfMKgIDMyIC0tDQo+Pj4gwqDCoCBkcml2ZXJzL2dw dS9kcm0vYW1kL2xpYi9jaGFzaC5jwqDCoMKgwqDCoMKgwqDCoMKgwqAgfCA2MzggDQo+Pj4gLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KPj4+IMKgwqAgMTAgZmlsZXMgY2hhbmdlZCwgMTYgaW5zZXJ0 aW9ucygrKSwgMTIxOCBkZWxldGlvbnMoLSkNCj4+PiDCoMKgIGRlbGV0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1ZGUvbGludXgvY2hhc2guaA0KPj4+IMKgwqAgZGVsZXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWcNCj4+PiDCoMKgIGRl bGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9NYWtlZmlsZQ0KPj4+IMKg wqAgZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNoLmMNCj4+ Pg0KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1 L2RybS9LY29uZmlnDQo+Pj4gaW5kZXggNDM4NWYwMGUxZDA1Li45OGIwMzNlNjc1ZGIgMTAwNjQ0 DQo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL0tjb25maWcNCj4+PiArKysgYi9kcml2ZXJzL2dw dS9kcm0vS2NvbmZpZw0KPj4+IEBAIC0yMjksOCArMjI5LDYgQEAgY29uZmlnIERSTV9BTURHUFUN Cj4+PiDCoMKgIMKgwqAgc291cmNlICJkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9LY29uZmln Ig0KPj4+IMKgwqAgLXNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZyINCj4+ PiAtDQo+Pj4gwqDCoCBzb3VyY2UgImRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L0tjb25maWciDQo+ Pj4gwqDCoCDCoMKgIHNvdXJjZSAiZHJpdmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyINCj4+PiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL01h a2VmaWxlDQo+Pj4gaW5kZXggN2YzYmUzNTA2MDU3Li5hYzYyMTM1NzU2OTEgMTAwNjQ0DQo+Pj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlDQo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L01ha2VmaWxlDQo+Pj4gQEAgLTU2LDcgKzU2LDYgQEAgb2JqLSQoQ09ORklHX0RSTV9UVE0pwqDC oMKgICs9IHR0bS8NCj4+PiDCoMKgIG9iai0kKENPTkZJR19EUk1fU0NIRUQpwqDCoMKgICs9IHNj aGVkdWxlci8NCj4+PiDCoMKgIG9iai0kKENPTkZJR19EUk1fVERGWCnCoMKgwqAgKz0gdGRmeC8N Cj4+PiDCoMKgIG9iai0kKENPTkZJR19EUk1fUjEyOCnCoMKgwqAgKz0gcjEyOC8NCj4+PiAtb2Jq LXnCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICs9IGFtZC9saWIvDQo+Pj4gwqDCoCBvYmotJChDT05G SUdfSFNBX0FNRCkgKz0gYW1kL2FtZGtmZC8NCj4+PiDCoMKgIG9iai0kKENPTkZJR19EUk1fUkFE RU9OKSs9IHJhZGVvbi8NCj4+PiDCoMKgIG9iai0kKENPTkZJR19EUk1fQU1ER1BVKSs9IGFtZC9h bWRncHUvDQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdw dV9nbWMuaCANCj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaA0K Pj4+IGluZGV4IDgxZTYwNzBkMjU1Yi4uODNjNDE1ZWI0MGY0IDEwMDY0NA0KPj4+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaA0KPj4+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9nbWMuaA0KPj4+IEBAIC00Myw2ICs0MywxMSBAQA0K Pj4+IMKgwqDCoCAqLw0KPj4+IMKgwqAgI2RlZmluZSBBTURHUFVfR01DX0hPTEVfTUFTS8KgwqDC oCAweDAwMDBmZmZmZmZmZmZmZmZVTEwNCj4+PiDCoMKgICsvKg0KPj4+ICsgKiBOdW1iZXIgb2Yg ZW50cmllcyBmb3IgdGhlIGxvZyBvZiByZWNlbnQgVk0gZmF1bHRzDQo+Pj4gKyAqLw0KPj4+ICsj ZGVmaW5lIEFNREdQVV9HTUNfTlVNX1ZNX0ZBVUxUU8KgwqDCoCA2NA0KPj4+ICsNCj4+PiDCoMKg IHN0cnVjdCBmaXJtd2FyZTsNCj4+PiDCoMKgIMKgwqAgLyoNCj4+PiBAQCAtMTQ3LDYgKzE1Miw5 IEBAIHN0cnVjdCBhbWRncHVfZ21jIHsNCj4+PiDCoMKgwqDCoMKgwqAgc3RydWN0IGtmZF92bV9m YXVsdF9pbmZvICp2bV9mYXVsdF9pbmZvOw0KPj4+IMKgwqDCoMKgwqDCoCBhdG9taWNfdMKgwqDC oMKgwqDCoMKgIHZtX2ZhdWx0X2luZm9fdXBkYXRlZDsNCj4+PiDCoMKgICvCoMKgwqAgdWludDY0 X3TCoMKgwqDCoMKgwqDCoCB2bV9mYXVsdHNbQU1ER1BVX0dNQ19OVU1fVk1fRkFVTFRTXTsNCj4+ PiArwqDCoMKgIGludMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdm1fZmF1bHRfaWR4Ow0KPj4+ICsN Cj4+PiDCoMKgwqDCoMKgwqAgY29uc3Qgc3RydWN0IGFtZGdwdV9nbWNfZnVuY3PCoMKgwqAgKmdt Y19mdW5jczsNCj4+PiDCoMKgIMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3hnbWkgeGdtaTsN Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMg DQo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uYw0KPj4+IGluZGV4 IDBiYzZmNTUzZGMwOC4uMzA0MWQ3MmM1NDc4IDEwMDY0NA0KPj4+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jDQo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9hbWRncHUvYW1kZ3B1X3ZtLmMNCj4+PiBAQCAtMjk3MiwyMiArMjk3Miw2IEBAIHZvaWQgYW1k Z3B1X3ZtX2FkanVzdF9zaXplKHN0cnVjdCANCj4+PiBhbWRncHVfZGV2aWNlICphZGV2LCB1aW50 MzJfdCBtaW5fdm1fc2l6ZSwNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGFkZXYtPnZtX21h bmFnZXIuZnJhZ21lbnRfc2l6ZSk7DQo+Pj4gwqDCoCB9DQo+Pj4gwqDCoCAtc3RhdGljIHN0cnVj dCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmluaXRfZmF1bHRfaGFzaCh2b2lkKQ0KPj4+ IC17DQo+Pj4gLcKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVs dF9oYXNoOw0KPj4+IC0NCj4+PiAtwqDCoMKgIGZhdWx0X2hhc2ggPSBrbWFsbG9jKHNpemVvZigq ZmF1bHRfaGFzaCksIEdGUF9LRVJORUwpOw0KPj4+IC3CoMKgwqAgaWYgKCFmYXVsdF9oYXNoKQ0K Pj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gZmF1bHRfaGFzaDsNCj4+PiAtDQo+Pj4gLcKgwqDC oCBJTklUX0NIQVNIX1RBQkxFKGZhdWx0X2hhc2gtPmhhc2gsDQo+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgQU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMsIDgsIDApOw0KPj4+IC3CoMKgwqAg c3Bpbl9sb2NrX2luaXQoJmZhdWx0X2hhc2gtPmxvY2spOw0KPj4+IC3CoMKgwqAgZmF1bHRfaGFz aC0+Y291bnQgPSAwOw0KPj4+IC0NCj4+PiAtwqDCoMKgIHJldHVybiBmYXVsdF9oYXNoOw0KPj4+ IC19DQo+Pj4gLQ0KPj4+IMKgwqAgLyoqDQo+Pj4gwqDCoMKgICogYW1kZ3B1X3ZtX2luaXQgLSBp bml0aWFsaXplIGEgdm0gaW5zdGFuY2UNCj4+PiDCoMKgwqAgKg0KPj4+IEBAIC0zMDgwLDEyICsz MDY0LDYgQEAgaW50IGFtZGdwdV92bV9pbml0KHN0cnVjdCBhbWRncHVfZGV2aWNlIA0KPj4+ICph ZGV2LCBzdHJ1Y3QgYW1kZ3B1X3ZtICp2bSwNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCB2bS0+ cGFzaWQgPSBwYXNpZDsNCj4+PiDCoMKgwqDCoMKgwqAgfQ0KPj4+IMKgwqAgLcKgwqDCoCB2bS0+ ZmF1bHRfaGFzaCA9IGluaXRfZmF1bHRfaGFzaCgpOw0KPj4+IC3CoMKgwqAgaWYgKCF2bS0+ZmF1 bHRfaGFzaCkgew0KPj4+IC3CoMKgwqDCoMKgwqDCoCByID0gLUVOT01FTTsNCj4+PiAtwqDCoMKg wqDCoMKgwqAgZ290byBlcnJvcl9mcmVlX3Jvb3Q7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLQ0KPj4+ IMKgwqDCoMKgwqDCoCBJTklUX0tGSUZPKHZtLT5mYXVsdHMpOw0KPj4+IMKgwqAgwqDCoMKgwqDC oMKgIHJldHVybiAwOw0KPj4+IEBAIC0zMjQxLDE1ICszMjE5LDEwIEBAIHZvaWQgYW1kZ3B1X3Zt X2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZpY2UgDQo+Pj4gKmFkZXYsIHN0cnVjdCBhbWRncHVfdm0g KnZtKQ0KPj4+IMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1X2JvX3ZhX21hcHBpbmcgKm1hcHBp bmcsICp0bXA7DQo+Pj4gwqDCoMKgwqDCoMKgIGJvb2wgcHJ0X2ZpbmlfbmVlZGVkID0gISFhZGV2 LT5nbWMuZ21jX2Z1bmNzLT5zZXRfcHJ0Ow0KPj4+IMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1 X2JvICpyb290Ow0KPj4+IC3CoMKgwqAgdTY0IGZhdWx0Ow0KPj4+IMKgwqDCoMKgwqDCoCBpbnQg aSwgcjsNCj4+PiDCoMKgIMKgwqDCoMKgwqDCoCBhbWRncHVfYW1ka2ZkX2dwdXZtX2Rlc3Ryb3lf Y2IoYWRldiwgdm0pOw0KPj4+IMKgwqAgLcKgwqDCoCAvKiBDbGVhciBwZW5kaW5nIHBhZ2UgZmF1 bHRzIGZyb20gSUggd2hlbiB0aGUgVk0gaXMgDQo+Pj4gZGVzdHJveWVkICovDQo+Pj4gLcKgwqDC oCB3aGlsZSAoa2ZpZm9fZ2V0KCZ2bS0+ZmF1bHRzLCAmZmF1bHQpKQ0KPj4+IC3CoMKgwqDCoMKg wqDCoCBhbWRncHVfdm1fY2xlYXJfZmF1bHQodm0tPmZhdWx0X2hhc2gsIGZhdWx0KTsNCj4+PiAt DQo+Pj4gwqDCoMKgwqDCoMKgIGlmICh2bS0+cGFzaWQpIHsNCj4+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOw0KPj4+IMKgwqAgQEAgLTMyNTgsOSArMzIzMSw2IEBA IHZvaWQgYW1kZ3B1X3ZtX2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZpY2UgDQo+Pj4gKmFkZXYsIHN0 cnVjdCBhbWRncHVfdm0gKnZtKQ0KPj4+IHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPnZt X21hbmFnZXIucGFzaWRfbG9jaywgZmxhZ3MpOw0KPj4+IMKgwqDCoMKgwqDCoCB9DQo+Pj4gwqDC oCAtwqDCoMKgIGtmcmVlKHZtLT5mYXVsdF9oYXNoKTsNCj4+PiAtwqDCoMKgIHZtLT5mYXVsdF9o YXNoID0gTlVMTDsNCj4+PiAtDQo+Pj4gwqDCoMKgwqDCoMKgIGRybV9zY2hlZF9lbnRpdHlfZGVz dHJveSgmdm0tPmVudGl0eSk7DQo+Pj4gwqDCoCDCoMKgwqDCoMKgwqAgaWYgKCFSQl9FTVBUWV9S T09UKCZ2bS0+dmEucmJfcm9vdCkpIHsNCj4+PiBAQCAtMzQyNiw3OCArMzM5NiwzIEBAIHZvaWQg YW1kZ3B1X3ZtX3NldF90YXNrX2luZm8oc3RydWN0IGFtZGdwdV92bSANCj4+PiAqdm0pDQo+Pj4g wqDCoMKgwqDCoMKgwqDCoMKgwqAgfQ0KPj4+IMKgwqDCoMKgwqDCoCB9DQo+Pj4gwqDCoCB9DQo+ Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICogYW1kZ3B1X3ZtX2FkZF9mYXVsdCAtIEFkZCBhIHBhZ2Ug ZmF1bHQgcmVjb3JkIHRvIGZhdWx0IGhhc2ggdGFibGUNCj4+PiAtICoNCj4+PiAtICogQGZhdWx0 X2hhc2g6IGZhdWx0IGhhc2ggdGFibGUNCj4+PiAtICogQGtleTogNjQtYml0IGVuY29kaW5nIG9m IFBBU0lEIGFuZCBhZGRyZXNzDQo+Pj4gLSAqDQo+Pj4gLSAqIFRoaXMgc2hvdWxkIGJlIGNhbGxl ZCB3aGVuIGEgcmV0cnkgcGFnZSBmYXVsdCBpbnRlcnJ1cHQgaXMNCj4+PiAtICogcmVjZWl2ZWQu IElmIHRoaXMgaXMgYSBuZXcgcGFnZSBmYXVsdCwgaXQgd2lsbCBiZSBhZGRlZCB0byBhIGhhc2gN Cj4+PiAtICogdGFibGUuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBp cyBhIG5ldyBmYXVsdCwgb3INCj4+PiAtICogYSBmYXVsdCB0aGF0IHdhcyBhbHJlYWR5IGtub3du IGFuZCBpcyBhbHJlYWR5IGJlaW5nIGhhbmRsZWQuDQo+Pj4gLSAqDQo+Pj4gLSAqIElmIHRoZXJl IGFyZSB0b28gbWFueSBwZW5kaW5nIHBhZ2UgZmF1bHRzLCB0aGlzIHdpbGwgZmFpbC4gUmV0cnkN Cj4+PiAtICogaW50ZXJydXB0cyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGlzIGNhc2UgdW50aWwg dGhlcmUgaXMgZW5vdWdoDQo+Pj4gLSAqIGZyZWUgc3BhY2UuDQo+Pj4gLSAqDQo+Pj4gLSAqIFJl dHVybnMgMCBpZiB0aGUgZmF1bHQgd2FzIGFkZGVkLCAxIGlmIHRoZSBmYXVsdCB3YXMgYWxyZWFk eSBrbm93biwNCj4+PiAtICogLUVOT1NQQyBpZiB0aGVyZSBhcmUgdG9vIG1hbnkgcGVuZGluZyBm YXVsdHMuDQo+Pj4gLSAqLw0KPj4+IC1pbnQgYW1kZ3B1X3ZtX2FkZF9mYXVsdChzdHJ1Y3QgYW1k Z3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlIA0KPj4+ICpmYXVsdF9oYXNoLCB1NjQga2V5KQ0KPj4+ IC17DQo+Pj4gLcKgwqDCoCB1bnNpZ25lZCBsb25nIGZsYWdzOw0KPj4+IC3CoMKgwqAgaW50IHIg PSAtRU5PU1BDOw0KPj4+IC0NCj4+PiAtwqDCoMKgIGlmIChXQVJOX09OX09OQ0UoIWZhdWx0X2hh c2gpKQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBTaG91bGQgYmUgYWxsb2NhdGVkIGluIGFtZGdw dV92bV9pbml0DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgKi8NCj4+PiAtwqDCoMKgwqDCoMKgwqAg cmV0dXJuIHI7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgc3Bpbl9sb2NrX2lycXNhdmUoJmZhdWx0X2hh c2gtPmxvY2ssIGZsYWdzKTsNCj4+PiAtDQo+Pj4gLcKgwqDCoCAvKiBPbmx5IGxldCB0aGUgaGFz aCB0YWJsZSBmaWxsIHVwIHRvIDUwJSBmb3IgYmVzdCBwZXJmb3JtYW5jZSAqLw0KPj4+IC3CoMKg wqAgaWYgKGZhdWx0X2hhc2gtPmNvdW50ID49ICgxIDw8IChBTURHUFVfUEFHRUZBVUxUX0hBU0hf QklUUy0xKSkpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGdvdG8gdW5sb2NrX291dDsNCj4+PiAtDQo+ Pj4gLcKgwqDCoCByID0gY2hhc2hfdGFibGVfY29weV9pbigmZmF1bHRfaGFzaC0+aGFzaCwga2V5 LCBOVUxMKTsNCj4+PiAtwqDCoMKgIGlmICghcikNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZmF1bHRf aGFzaC0+Y291bnQrKzsNCj4+PiAtDQo+Pj4gLcKgwqDCoCAvKiBjaGFzaF90YWJsZV9jb3B5X2lu IHNob3VsZCBuZXZlciBmYWlsIHVubGVzcyB3ZSdyZSBsb3NpbmcgDQo+Pj4gY291bnQgKi8NCj4+ PiAtwqDCoMKgIFdBUk5fT05fT05DRShyIDwgMCk7DQo+Pj4gLQ0KPj4+IC11bmxvY2tfb3V0Og0K Pj4+IC3CoMKgwqAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmF1bHRfaGFzaC0+bG9jaywgZmxh Z3MpOw0KPj4+IC3CoMKgwqAgcmV0dXJuIHI7DQo+Pj4gLX0NCj4+PiAtDQo+Pj4gLS8qKg0KPj4+ IC0gKiBhbWRncHVfdm1fY2xlYXJfZmF1bHQgLSBSZW1vdmUgYSBwYWdlIGZhdWx0IHJlY29yZA0K Pj4+IC0gKg0KPj4+IC0gKiBAZmF1bHRfaGFzaDogZmF1bHQgaGFzaCB0YWJsZQ0KPj4+IC0gKiBA a2V5OiA2NC1iaXQgZW5jb2Rpbmcgb2YgUEFTSUQgYW5kIGFkZHJlc3MNCj4+PiAtICoNCj4+PiAt ICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBwYWdlIGZhdWx0IGhhcyBiZWVuIGhhbmRs ZWQuIEFueQ0KPj4+IC0gKiBmdXR1cmUgaW50ZXJydXB0IHdpdGggdGhpcyBrZXkgd2lsbCBiZSBw cm9jZXNzZWQgYXMgYSBuZXcNCj4+PiAtICogcGFnZSBmYXVsdC4NCj4+PiAtICovDQo+Pj4gLXZv aWQgYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFi bGUgDQo+Pj4gKmZhdWx0X2hhc2gsIHU2NCBrZXkpDQo+Pj4gLXsNCj4+PiAtwqDCoMKgIHVuc2ln bmVkIGxvbmcgZmxhZ3M7DQo+Pj4gLcKgwqDCoCBpbnQgcjsNCj4+PiAtDQo+Pj4gLcKgwqDCoCBp ZiAoIWZhdWx0X2hhc2gpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybjsNCj4+PiAtDQo+Pj4g LcKgwqDCoCBzcGluX2xvY2tfaXJxc2F2ZSgmZmF1bHRfaGFzaC0+bG9jaywgZmxhZ3MpOw0KPj4+ IC0NCj4+PiAtwqDCoMKgIHIgPSBjaGFzaF90YWJsZV9yZW1vdmUoJmZhdWx0X2hhc2gtPmhhc2gs IGtleSwgTlVMTCk7DQo+Pj4gLcKgwqDCoCBpZiAoIVdBUk5fT05fT05DRShyIDwgMCkpIHsNCj4+ PiAtwqDCoMKgwqDCoMKgwqAgZmF1bHRfaGFzaC0+Y291bnQtLTsNCj4+PiAtwqDCoMKgwqDCoMKg wqAgV0FSTl9PTl9PTkNFKGZhdWx0X2hhc2gtPmNvdW50IDwgMCk7DQo+Pj4gLcKgwqDCoCB9DQo+ Pj4gLQ0KPj4+IC3CoMKgwqAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmF1bHRfaGFzaC0+bG9j aywgZmxhZ3MpOw0KPj4+IC19DQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV92bS5oIA0KPj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1k Z3B1X3ZtLmgNCj4+PiBpbmRleCA4MWZmODE3N2YwOTIuLjdjNDkyMzViNjA2NCAxMDA2NDQNCj4+ PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfdm0uaA0KPj4+ICsrKyBi L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5oDQo+Pj4gQEAgLTMwLDcgKzMw LDYgQEANCj4+PiDCoMKgICNpbmNsdWRlIDxkcm0vZ3B1X3NjaGVkdWxlci5oPg0KPj4+IMKgwqAg I2luY2x1ZGUgPGRybS9kcm1fZmlsZS5oPg0KPj4+IMKgwqAgI2luY2x1ZGUgPGRybS90dG0vdHRt X2JvX2RyaXZlci5oPg0KPj4+IC0jaW5jbHVkZSA8bGludXgvY2hhc2guaD4NCj4+PiDCoMKgIMKg wqAgI2luY2x1ZGUgImFtZGdwdV9zeW5jLmgiDQo+Pj4gwqDCoCAjaW5jbHVkZSAiYW1kZ3B1X3Jp bmcuaCINCj4+PiBAQCAtMTc5LDEzICsxNzgsNiBAQCBzdHJ1Y3QgYW1kZ3B1X3Rhc2tfaW5mbyB7 DQo+Pj4gwqDCoMKgwqDCoMKgIHBpZF90wqDCoMKgIHRnaWQ7DQo+Pj4gwqDCoCB9Ow0KPj4+IMKg wqAgLSNkZWZpbmUgQU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMgOA0KPj4+IC1zdHJ1Y3QgYW1k Z3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlIHsNCj4+PiAtwqDCoMKgIERFQ0xBUkVfQ0hBU0hfVEFC TEUoaGFzaCwgQU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMsIDgsIDApOw0KPj4+IC3CoMKgwqAg c3BpbmxvY2tfdMKgwqDCoCBsb2NrOw0KPj4+IC3CoMKgwqAgaW50wqDCoMKgwqDCoMKgwqAgY291 bnQ7DQo+Pj4gLX07DQo+Pj4gLQ0KPj4+IMKgwqAgc3RydWN0IGFtZGdwdV92bSB7DQo+Pj4gwqDC oMKgwqDCoMKgIC8qIHRyZWUgb2YgdmlydHVhbCBhZGRyZXNzZXMgbWFwcGVkICovDQo+Pj4gwqDC oMKgwqDCoMKgIHN0cnVjdCByYl9yb290X2NhY2hlZMKgwqDCoCB2YTsNCj4+PiBAQCAtMjQ1LDcg KzIzNyw2IEBAIHN0cnVjdCBhbWRncHVfdm0gew0KPj4+IMKgwqDCoMKgwqDCoCBzdHJ1Y3QgdHRt X2xydV9idWxrX21vdmUgbHJ1X2J1bGtfbW92ZTsNCj4+PiDCoMKgwqDCoMKgwqAgLyogbWFyayB3 aGV0aGVyIGNhbiBkbyB0aGUgYnVsayBtb3ZlICovDQo+Pj4gwqDCoMKgwqDCoMKgIGJvb2zCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIGJ1bGtfbW92ZWFibGU7DQo+Pj4gLcKgwqDCoCBzdHJ1Y3QgYW1k Z3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVsdF9oYXNoOw0KPj4+IMKgwqAgfTsNCj4+PiDC oMKgIMKgwqAgc3RydWN0IGFtZGdwdV92bV9tYW5hZ2VyIHsNCj4+PiBAQCAtMzU4LDExICszNDks NiBAQCB2b2lkIGFtZGdwdV92bV9zZXRfdGFza19pbmZvKHN0cnVjdCBhbWRncHVfdm0gDQo+Pj4g KnZtKTsNCj4+PiDCoMKgIMKgwqAgdm9pZCBhbWRncHVfdm1fbW92ZV90b19scnVfdGFpbChzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgc3RydWN0IGFtZGdwdV92bSAqdm0pOw0KPj4+IC0NCj4+PiAtaW50IGFtZGdwdV92 bV9hZGRfZmF1bHQoc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSANCj4+PiAqZmF1 bHRfaGFzaCwgdTY0IGtleSk7DQo+Pj4gLQ0KPj4+IC12b2lkIGFtZGdwdV92bV9jbGVhcl9mYXVs dChzdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlIA0KPj4+ICpmYXVsdF9oYXNoLCB1 NjQga2V5KTsNCj4+PiAtDQo+Pj4gwqDCoCB2b2lkIGFtZGdwdV92bV9kZWxfZnJvbV9scnVfbm90 aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVjdCAqYm8pOw0KPj4+IMKgwqAgwqDCoCAjZW5kaWYN Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5XzAuYyAN Cj4+PiBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192OV8wLmMNCj4+PiBpbmRleCA5 YzA4MmY5YWVhMWEuLjk2NGU3ODk5MDhkNSAxMDA2NDQNCj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9k cm0vYW1kL2FtZGdwdS9nbWNfdjlfMC5jDQo+Pj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9h bWRncHUvZ21jX3Y5XzAuYw0KPj4+IEBAIC0yNTUsNDggKzI1NSwyNCBAQCBzdGF0aWMgYm9vbCBn bWNfdjlfMF9wcmVzY3JlZW5faXYoc3RydWN0IA0KPj4+IGFtZGdwdV9kZXZpY2UgKmFkZXYsDQo+ Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYW1kZ3B1 X2l2X2VudHJ5ICplbnRyeSwNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHVpbnQ2NF90IGFkZHIpDQo+Pj4gwqDCoCB7DQo+Pj4gLcKgwqDCoCBzdHJ1Y3QgYW1k Z3B1X3ZtICp2bTsNCj4+PiArwqDCoMKgIHVuc2lnbmVkIGk7DQo+Pj4gwqDCoMKgwqDCoMKgIHU2 NCBrZXk7DQo+Pj4gLcKgwqDCoCBpbnQgcjsNCj4+PiDCoMKgIMKgwqDCoMKgwqDCoCAvKiBObyBQ QVNJRCwgY2FuJ3QgaWRlbnRpZnkgZmF1bHRpbmcgcHJvY2VzcyAqLw0KPj4+IMKgwqDCoMKgwqDC oCBpZiAoIWVudHJ5LT5wYXNpZCkNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1 ZTsNCj4+PiDCoMKgIC3CoMKgwqAgLyogTm90IGEgcmV0cnkgZmF1bHQgKi8NCj4+PiAtwqDCoMKg IGlmICghKGVudHJ5LT5zcmNfZGF0YVsxXSAmIDB4ODApKQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCBy ZXR1cm4gdHJ1ZTsNCj4+PiAtDQo+Pj4gLcKgwqDCoCAvKiBUcmFjayByZXRyeSBmYXVsdHMgaW4g cGVyLVZNIGZhdWx0IEZJRk8uICovDQo+Pj4gLcKgwqDCoCBzcGluX2xvY2soJmFkZXYtPnZtX21h bmFnZXIucGFzaWRfbG9jayk7DQo+Pj4gLcKgwqDCoCB2bSA9IGlkcl9maW5kKCZhZGV2LT52bV9t YW5hZ2VyLnBhc2lkX2lkciwgZW50cnktPnBhc2lkKTsNCj4+PiAtwqDCoMKgIGlmICghdm0pIHsN Cj4+PiAtwqDCoMKgwqDCoMKgwqAgLyogVk0gbm90IGZvdW5kLCBwcm9jZXNzIGl0IG5vcm1hbGx5 ICovDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHNwaW5fdW5sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBh c2lkX2xvY2spOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsNCj4+PiAtwqDCoMKg IH0NCj4+PiAtDQo+Pj4gwqDCoMKgwqDCoMKgIGtleSA9IEFNREdQVV9WTV9GQVVMVChlbnRyeS0+ cGFzaWQsIGFkZHIpOw0KPj4+IC3CoMKgwqAgciA9IGFtZGdwdV92bV9hZGRfZmF1bHQodm0tPmZh dWx0X2hhc2gsIGtleSk7DQo+Pj4gwqDCoCAtwqDCoMKgIC8qIEhhc2ggdGFibGUgaXMgZnVsbCBv ciB0aGUgZmF1bHQgaXMgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQsDQo+Pj4gLcKgwqDCoMKgICog aWdub3JlIGZ1cnRoZXIgcGFnZSBmYXVsdHMNCj4+PiAtwqDCoMKgwqAgKi8NCj4+PiAtwqDCoMKg IGlmIChyICE9IDApIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgc3Bpbl91bmxvY2soJmFkZXYtPnZt X21hbmFnZXIucGFzaWRfbG9jayk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsN Cj4+PiAtwqDCoMKgIH0NCj4+PiAtwqDCoMKgIC8qIE5vIGxvY2tpbmcgcmVxdWlyZWQgd2l0aCBz aW5nbGUgd3JpdGVyIGFuZCBzaW5nbGUgcmVhZGVyICovDQo+Pj4gLcKgwqDCoCByID0ga2ZpZm9f cHV0KCZ2bS0+ZmF1bHRzLCBrZXkpOw0KPj4+IC3CoMKgwqAgaWYgKCFyKSB7DQo+Pj4gLcKgwqDC oMKgwqDCoMKgIC8qIEZJRk8gaXMgZnVsbC4gSWdub3JlIGl0IHVudGlsIHRoZXJlIGlzIHNwYWNl ICovDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGFtZGdwdV92bV9jbGVhcl9mYXVsdCh2bS0+ZmF1bHRf aGFzaCwga2V5KTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgc3Bpbl91bmxvY2soJmFkZXYtPnZtX21h bmFnZXIucGFzaWRfbG9jayk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsNCj4+ PiArwqDCoMKgIC8qIFRyYWNrIHRoZSBsYXN0IE4gZmF1bHRzIGFuZCBkb24ndCByZXBvcnQgdGhl bSBhZ2FpbiBvbiByZXRyeSAqLw0KPj4+ICvCoMKgwqAgZm9yIChpID0gMDsgaSA8IEFNREdQVV9H TUNfTlVNX1ZNX0ZBVUxUUzsgKytpKSB7DQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGlmIChhZGV2LT5n bWMudm1fZmF1bHRzW2ldID09IGtleSkNCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gZmFsc2U7DQo+Pj4gwqDCoMKgwqDCoMKgIH0NCj4+PiDCoMKgIC3CoMKgwqAgc3Bpbl91bmxv Y2soJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jayk7DQo+Pj4gwqDCoMKgwqDCoMKgIC8qIEl0 J3MgdGhlIGZpcnN0IGZhdWx0IGZvciB0aGlzIGFkZHJlc3MsIHByb2Nlc3MgaXQgbm9ybWFsbHkg Ki8NCj4+PiArwqDCoMKgIGFkZXYtPmdtYy52bV9mYXVsdHNbYWRldi0+Z21jLnZtX2ZhdWx0X2lk eCsrXSA9IGtleTsNCj4+PiArwqDCoMKgIGFkZXYtPmdtYy52bV9mYXVsdF9pZHggJT0gQU1ER1BV X0dNQ19OVU1fVk1fRkFVTFRTOw0KPj4+IMKgwqDCoMKgwqDCoCByZXR1cm4gdHJ1ZTsNCj4+PiDC oMKgIH0NCj4+PiDCoMKgIEBAIC0zMTIsNyArMjg4LDcgQEAgc3RhdGljIGludCBnbWNfdjlfMF9w cm9jZXNzX2ludGVycnVwdChzdHJ1Y3QgDQo+Pj4gYW1kZ3B1X2RldmljZSAqYWRldiwNCj4+PiDC oMKgwqDCoMKgwqAgYWRkciA9ICh1NjQpZW50cnktPnNyY19kYXRhWzBdIDw8IDEyOw0KPj4+IMKg wqDCoMKgwqDCoCBhZGRyIHw9ICgodTY0KWVudHJ5LT5zcmNfZGF0YVsxXSAmIDB4ZikgPDwgNDQ7 DQo+Pj4gwqDCoCAtwqDCoMKgIGlmICghZ21jX3Y5XzBfcHJlc2NyZWVuX2l2KGFkZXYsIGVudHJ5 LCBhZGRyKSkNCj4+PiArwqDCoMKgIGlmIChyZXRyeV9mYXVsdCAmJiAhZ21jX3Y5XzBfcHJlc2Ny ZWVuX2l2KGFkZXYsIGVudHJ5LCBhZGRyKSkNCj4+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1 cm4gMTsgLyogVGhpcyBhbHNvIHByZXZlbnRzIHNlbmRpbmcgaXQgdG8gS0ZEICovDQo+Pj4gwqDC oCDCoMKgwqDCoMKgwqAgaWYgKCFhbWRncHVfc3Jpb3ZfdmYoYWRldikpIHsNCj4+PiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmggDQo+Pj4gYi9k cml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1ZGUvbGludXgvY2hhc2guaA0KPj4+IGRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NA0KPj4+IGluZGV4IDZkYzE1OTkyNGVkMS4uMDAwMDAwMDAwMDAwDQo+Pj4g LS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmgNCj4+PiArKysg L2Rldi9udWxsDQo+Pj4gQEAgLTEsMzY2ICswLDAgQEANCj4+PiAtLyoNCj4+PiAtICogQ29weXJp Z2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLg0KPj4+IC0gKg0KPj4+IC0gKiBQ ZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNv biANCj4+PiBvYnRhaW5pbmcgYQ0KPj4+IC0gKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFz c29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIA0KPj4+ICJTb2Z0d2FyZSIpLA0KPj4+ IC0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRp bmcgd2l0aG91dCANCj4+PiBsaW1pdGF0aW9uDQo+Pj4gLSAqIHRoZSByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCANCj4+PiBzdWJsaWNlbnNl LA0KPj4+IC0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gDQo+Pj4gd2hvbSB0aGUNCj4+PiAtICogU29mdHdhcmUgaXMgZnVybmlz aGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgDQo+Pj4gY29uZGl0aW9uczoN Cj4+PiAtICoNCj4+PiAtICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVy bWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgDQo+Pj4gaW5jbHVkZWQgaW4NCj4+PiAtICogYWxsIGNv cGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQo+Pj4gLSAqDQo+ Pj4gLSAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZ IE9GIEFOWSBLSU5ELCANCj4+PiBFWFBSRVNTIE9SDQo+Pj4gLSAqIElNUExJRUQsIElOQ0xVRElO RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgDQo+Pj4gTUVSQ0hBTlRBQklM SVRZLA0KPj4+IC0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5G UklOR0VNRU5ULsKgIElOIE5PIA0KPj4+IEVWRU5UIFNIQUxMDQo+Pj4gLSAqIFRIRSBDT1BZUklH SFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgDQo+Pj4g REFNQUdFUyBPUg0KPj4+IC0gKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9O IE9GIENPTlRSQUNULCBUT1JUIE9SIA0KPj4+IE9USEVSV0lTRSwNCj4+PiAtICogQVJJU0lORyBG Uk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgDQo+ Pj4gVVNFIE9SDQo+Pj4gLSAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4NCj4+PiAt ICoNCj4+PiAtICovDQo+Pj4gLQ0KPj4+IC0jaWZuZGVmIF9MSU5VWF9DSEFTSF9IDQo+Pj4gLSNk ZWZpbmUgX0xJTlVYX0NIQVNIX0gNCj4+PiAtDQo+Pj4gLSNpbmNsdWRlIDxsaW51eC90eXBlcy5o Pg0KPj4+IC0jaW5jbHVkZSA8bGludXgvaGFzaC5oPg0KPj4+IC0jaW5jbHVkZSA8bGludXgvYnVn Lmg+DQo+Pj4gLSNpbmNsdWRlIDxhc20vYml0c3BlcmxvbmcuaD4NCj4+PiAtDQo+Pj4gLSNpZiBC SVRTX1BFUl9MT05HID09IDMyDQo+Pj4gLSMgZGVmaW5lIF9DSEFTSF9MT05HX1NISUZUIDUNCj4+ PiAtI2VsaWYgQklUU19QRVJfTE9ORyA9PSA2NA0KPj4+IC0jIGRlZmluZSBfQ0hBU0hfTE9OR19T SElGVCA2DQo+Pj4gLSNlbHNlDQo+Pj4gLSMgZXJyb3IgIlVuZXhwZWN0ZWQgQklUU19QRVJfTE9O RyINCj4+PiAtI2VuZGlmDQo+Pj4gLQ0KPj4+IC1zdHJ1Y3QgX19jaGFzaF90YWJsZSB7DQo+Pj4g LcKgwqDCoCB1OCBiaXRzOw0KPj4+IC3CoMKgwqAgdTgga2V5X3NpemU7DQo+Pj4gLcKgwqDCoCB1 bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTsNCj4+PiAtwqDCoMKgIHUzMiBzaXplX21hc2s7DQo+Pj4g LcKgwqDCoCB1bnNpZ25lZCBsb25nICpvY2N1cF9iaXRtYXAsICp2YWxpZF9iaXRtYXA7DQo+Pj4g LcKgwqDCoCB1bmlvbiB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHUzMiAqa2V5czMyOw0KPj4+IC3C oMKgwqDCoMKgwqDCoCB1NjQgKmtleXM2NDsNCj4+PiAtwqDCoMKgIH07DQo+Pj4gLcKgwqDCoCB1 OCAqdmFsdWVzOw0KPj4+IC0NCj4+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUw0KPj4+IC3C oMKgwqAgdTY0IGhpdHMsIGhpdHNfc3RlcHMsIGhpdHNfdGltZV9uczsNCj4+PiAtwqDCoMKgIHU2 NCBtaXNzLCBtaXNzX3N0ZXBzLCBtaXNzX3RpbWVfbnM7DQo+Pj4gLcKgwqDCoCB1NjQgcmVsb2Nz LCByZWxvY19kaXN0Ow0KPj4+IC0jZW5kaWYNCj4+PiAtfTsNCj4+PiAtDQo+Pj4gLSNkZWZpbmUg X19DSEFTSF9CSVRNQVBfU0laRShiaXRzKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBc DQo+Pj4gLcKgwqDCoCAoKCgxIDw8IChiaXRzKSkgKyBCSVRTX1BFUl9MT05HIC0gMSkgLyBCSVRT X1BFUl9MT05HKQ0KPj4+IC0jZGVmaW5lIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBzaXplKcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoCAoKCgoc2l6ZSkgPDwg KGJpdHMpKSArIHNpemVvZihsb25nKSAtIDEpIC8gc2l6ZW9mKGxvbmcpKQ0KPj4+IC0NCj4+PiAt I2RlZmluZSBfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSnCoMKg wqAgXA0KPj4+IC3CoMKgwqAgKF9fQ0hBU0hfQklUTUFQX1NJWkUoYml0cykgKiAyICvCoMKgwqDC oMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgIF9fQ0hBU0hfQVJSQVlfU0laRShiaXRzLCBrZXlfc2l6 ZSkgK8KgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqAgX19DSEFTSF9BUlJBWV9TSVpFKGJp dHMsIHZhbHVlX3NpemUpKQ0KPj4+IC0NCj4+PiAtI2RlZmluZSBTVFJVQ1RfQ0hBU0hfVEFCTEUo Yml0cywga2V5X3NpemUsIHZhbHVlX3NpemUpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4g LcKgwqDCoCBzdHJ1Y3Qge8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHN0cnVjdCBfX2NoYXNoX3RhYmxl IHRhYmxlO8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDC oMKgIHVuc2lnbmVkIGxvbmcgZGF0YcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBbX19DSEFTSF9EQVRBX1NJWkUoYml0 cywga2V5X3NpemUsIHZhbHVlX3NpemUpXTtcDQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLQ0KPj4+IC0v KioNCj4+PiAtICogc3RydWN0IGNoYXNoX3RhYmxlIC0gRHluYW1pY2FsbHkgYWxsb2NhdGVkIGNs b3NlZCBoYXNoIHRhYmxlDQo+Pj4gLSAqDQo+Pj4gLSAqIFVzZSB0aGlzIHN0cnVjdCBmb3IgZHlu YW1pY2FsbHkgYWxsb2NhdGVkIGhhc2ggdGFibGVzICh1c2luZw0KPj4+IC0gKiBjaGFzaF90YWJs ZV9hbGxvYyBhbmQgY2hhc2hfdGFibGVfZnJlZSksIHdoZXJlIHRoZSBzaXplIGlzDQo+Pj4gLSAq IGRldGVybWluZWQgYXQgcnVudGltZS4NCj4+PiAtICovDQo+Pj4gLXN0cnVjdCBjaGFzaF90YWJs ZSB7DQo+Pj4gLcKgwqDCoCBzdHJ1Y3QgX19jaGFzaF90YWJsZSB0YWJsZTsNCj4+PiAtwqDCoMKg IHVuc2lnbmVkIGxvbmcgKmRhdGE7DQo+Pj4gLX07DQo+Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICog REVDTEFSRV9DSEFTSF9UQUJMRSAtIG1hY3JvIHRvIGRlY2xhcmUgYSBjbG9zZWQgaGFzaCB0YWJs ZQ0KPj4+IC0gKiBAdGFibGU6IG5hbWUgb2YgdGhlIGRlY2xhcmVkIGhhc2ggdGFibGUNCj4+PiAt ICogQGJ0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzDQo+Pj4gLSAqIEBrZXlf c3o6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4+PiAtICogQHZhbF9zejog U2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDANCj4+PiAtICoNCj4+PiAtICog VGhpcyBkZWNsYXJlcyB0aGUgaGFzaCB0YWJsZSB2YXJpYWJsZSB3aXRoIGEgc3RhdGljIHNpemUu DQo+Pj4gLSAqDQo+Pj4gLSAqIFRoZSBjbG9zZWQgaGFzaCB0YWJsZSBzdG9yZXMga2V5LXZhbHVl IHBhaXJzIHdpdGggbG93IG1lbW9yeSBhbmQNCj4+PiAtICogbG9va3VwIG92ZXJoZWFkLiBJbiBv cGVyYXRpb24gaXQgcGVyZm9ybXMgbm8gZHluYW1pYyBtZW1vcnkNCj4+PiAtICogbWFuYWdlbWVu dC4gVGhlIGRhdGEgYmVpbmcgc3RvcmVkIGRvZXMgbm90IHJlcXVpcmUgYW55DQo+Pj4gLSAqIGxp c3RfaGVhZHMuIFRoZSBoYXNoIHRhYmxlIHBlcmZvcm1zIGJlc3Qgd2l0aCBzbWFsbCBAdmFsX3N6 IGFuZCBhcw0KPj4+IC0gKiBsb25nIGFzIHNvbWUgc3BhY2UgKGFib3V0IDUwJSkgaXMgbGVmdCBm cmVlIGluIHRoZSB0YWJsZS4gQnV0IHRoZQ0KPj4+IC0gKiB0YWJsZSBjYW4gc3RpbGwgd29yayBy ZWFzb25hYmx5IGVmZmljaWVudGx5IGV2ZW4gd2hlbiBmaWxsZWQgdXAgdG8NCj4+PiAtICogYWJv dXQgOTAlLiBJZiBiaWdnZXIgZGF0YSBpdGVtcyBuZWVkIHRvIGJlIHN0b3JlZCBhbmQgbG9va2Vk IHVwLA0KPj4+IC0gKiBzdG9yZSB0aGUgcG9pbnRlciB0byBpdCBhcyB2YWx1ZSBpbiB0aGUgaGFz aCB0YWJsZS4NCj4+PiAtICoNCj4+PiAtICogQHZhbF9zeiBtYXkgYmUgMC4gVGhpcyBjYW4gYmUg dXNlZnVsIHdoZW4gYWxsIHRoZSBzdG9yZWQNCj4+PiAtICogaW5mb3JtYXRpb24gaXMgY29udGFp bmVkIGluIHRoZSBrZXkgaXRzZWxmIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlzDQo+Pj4gLSAqIGlu IHRoZSBoYXNoIHRhYmxlIChvciBub3QpLg0KPj4+IC0gKi8NCj4+PiAtI2RlZmluZSBERUNMQVJF X0NIQVNIX1RBQkxFKHRhYmxlLCBidHMsIGtleV9zeiwgdmFsX3N6KcKgwqDCoMKgwqDCoMKgIFwN Cj4+PiAtwqDCoMKgIFNUUlVDVF9DSEFTSF9UQUJMRShidHMsIGtleV9zeiwgdmFsX3N6KSB0YWJs ZQ0KPj4+IC0NCj4+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUw0KPj4+IC0jZGVmaW5lIF9f Q0hBU0hfU1RBVFNfSU5JVChwcmVmaXgpLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDC oMKgwqAgcHJlZml4LmhpdHMgPSAwLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKg wqAgcHJlZml4LmhpdHNfc3RlcHMgPSAwLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDC oMKgwqAgcHJlZml4LmhpdHNfdGltZV9ucyA9IDAswqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKg wqAgcHJlZml4Lm1pc3MgPSAwLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqAg cHJlZml4Lm1pc3Nfc3RlcHMgPSAwLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKg wqAgcHJlZml4Lm1pc3NfdGltZV9ucyA9IDAswqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqAg cHJlZml4LnJlbG9jcyA9IDAswqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBw cmVmaXgucmVsb2NfZGlzdCA9IDANCj4+PiAtI2Vsc2UNCj4+PiAtI2RlZmluZSBfX0NIQVNIX1NU QVRTX0lOSVQocHJlZml4KQ0KPj4+IC0jZW5kaWYNCj4+PiAtDQo+Pj4gLSNkZWZpbmUgX19DSEFT SF9UQUJMRV9JTklUKHByZWZpeCwgZGF0YSwgYnRzLCBrZXlfc3osIHZhbF9zeinCoMKgwqAgXA0K Pj4+IC3CoMKgwqAgcHJlZml4LmJpdHMgPSAoYnRzKSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHByZWZpeC5rZXlfc2l6ZSA9IChr ZXlfc3opLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcmVm aXgudmFsdWVfc2l6ZSA9ICh2YWxfc3opLMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3C oMKgwqDCoMKgwqDCoCBwcmVmaXguc2l6ZV9tYXNrID0gKCgxIDw8IGJ0cykgLSAxKSzCoMKgwqDC oMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHByZWZpeC5vY2N1cF9iaXRtYXAgPSAmZGF0 YVswXSzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJlZml4 LnZhbGlkX2JpdG1hcCA9ICZkYXRhwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgW19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKV0swqDCoMKgwqDCoMKg wqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcmVmaXgua2V5czY0ID0gKHU2NCAqKSZkYXRhwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgW19fQ0hB U0hfQklUTUFQX1NJWkUoYnRzKSAqIDJdLMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDC oMKgwqAgcHJlZml4LnZhbHVlcyA9ICh1OCAqKSZkYXRhwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBc DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgW19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKSAq IDIgK8KgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fQ0hB U0hfQVJSQVlfU0laRShidHMsIGtleV9zeildwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqAg X19DSEFTSF9TVEFUU19JTklUKHByZWZpeCkNCj4+PiAtDQo+Pj4gLS8qKg0KPj4+IC0gKiBERUZJ TkVfQ0hBU0hfVEFCTEUgLSBtYWNybyB0byBkZWZpbmUgYW5kIGluaXRpYWxpemUgYSBjbG9zZWQg DQo+Pj4gaGFzaCB0YWJsZQ0KPj4+IC0gKiBAdGJsOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBoYXNo IHRhYmxlDQo+Pj4gLSAqIEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcw0K Pj4+IC0gKiBAa2V5X3N6OiBTaXplIG9mIGhhc2gga2V5cyBpbiBieXRlcywgNCBvciA4DQo+Pj4g LSAqIEB2YWxfc3o6IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwDQo+Pj4g LSAqDQo+Pj4gLSAqIE5vdGU6IHRoZSBtYWNybyBjYW4gYmUgdXNlZCBmb3IgZ2xvYmFsIGFuZCBs b2NhbCBoYXNoIHRhYmxlIA0KPj4+IHZhcmlhYmxlcy4NCj4+PiAtICovDQo+Pj4gLSNkZWZpbmUg REVGSU5FX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlfc3osIHZhbF9zeinCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgIERFQ0xBUkVfQ0hBU0hfVEFCTEUodGJsLCBidHMsIGtl eV9zeiwgdmFsX3N6KSA9IHsgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCAudGFibGUgPSB7wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgX19DSEFTSF9UQUJMRV9JTklUKCwgKHRibCkuZGF0YSwgYnRzLCBrZXlf c3osIHZhbF9zeikgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCB9LMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKg IC5kYXRhID0gezB9wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBcDQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICogSU5JVF9DSEFTSF9U QUJMRSAtIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIGRlY2xhcmVkIGJ5IA0KPj4+IERFQ0xBUkVf Q0hBU0hfVEFCTEUNCj4+PiAtICogQHRibDogbmFtZSBvZiB0aGUgZGVjbGFyZWQgaGFzaCB0YWJs ZQ0KPj4+IC0gKiBAYnRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMNCj4+PiAt ICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOA0KPj4+IC0gKiBA dmFsX3N6OiBTaXplIG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMA0KPj4+IC0gKi8N Cj4+PiAtI2RlZmluZSBJTklUX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlfc3osIHZhbF9zeikg XA0KPj4+IC3CoMKgwqAgX19DSEFTSF9UQUJMRV9JTklUKCgodGJsKS50YWJsZSksICh0YmwpLmRh dGEsIGJ0cywga2V5X3N6LCB2YWxfc3opDQo+Pj4gLQ0KPj4+IC1pbnQgY2hhc2hfdGFibGVfYWxs b2Moc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSwgdTggYml0cywgdTgga2V5X3NpemUsDQo+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHVuc2lnbmVkIGludCB2YWx1ZV9zaXplLCBnZnBf dCBnZnBfbWFzayk7DQo+Pj4gLXZvaWQgY2hhc2hfdGFibGVfZnJlZShzdHJ1Y3QgY2hhc2hfdGFi bGUgKnRhYmxlKTsNCj4+PiAtDQo+Pj4gLS8qKg0KPj4+IC0gKiBjaGFzaF90YWJsZV9kdW1wX3N0 YXRzIC0gRHVtcCBzdGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhhc2ggdGFibGUNCj4+PiAtICogQHRi bDogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlDQo+Pj4gLSAqDQo+Pj4gLSAqIER1bXBz IHNvbWUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBvZiB0aGUgdGFibGUgZ2F0aGVyZWQgaW4gDQo+ Pj4gb3BlcmF0aW9uDQo+Pj4gLSAqIGluIHRoZSBrZXJuZWwgbG9nIHVzaW5nIHByX2RlYnVnLiBJ ZiBDT05GSUdfRFlOQU1JQ19ERUJVRyBpcyANCj4+PiBlbmFibGVkLA0KPj4+IC0gKiB1c2VyIG11 c3QgdHVybiBvbiBtZXNzYWdlcyBmb3IgY2hhc2guYyAoZmlsZSBjaGFzaC5jICtwKS4NCj4+PiAt ICovDQo+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+PiAtI2RlZmluZSBjaGFzaF90 YWJsZV9kdW1wX3N0YXRzKHRibCkgDQo+Pj4gX19jaGFzaF90YWJsZV9kdW1wX3N0YXRzKCYoKnRi bCkudGFibGUpDQo+Pj4gLQ0KPj4+IC12b2lkIF9fY2hhc2hfdGFibGVfZHVtcF9zdGF0cyhzdHJ1 Y3QgX19jaGFzaF90YWJsZSAqdGFibGUpOw0KPj4+IC0jZWxzZQ0KPj4+IC0jZGVmaW5lIGNoYXNo X3RhYmxlX2R1bXBfc3RhdHModGJsKQ0KPj4+IC0jZW5kaWYNCj4+PiAtDQo+Pj4gLS8qKg0KPj4+ IC0gKiBjaGFzaF90YWJsZV9yZXNldF9zdGF0cyAtIFJlc2V0IHN0YXRpc3RpY3Mgb2YgYSBjbG9z ZWQgaGFzaCB0YWJsZQ0KPj4+IC0gKiBAdGJsOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1 cmUNCj4+PiAtICovDQo+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+PiAtI2RlZmlu ZSBjaGFzaF90YWJsZV9yZXNldF9zdGF0cyh0YmwpIA0KPj4+IF9fY2hhc2hfdGFibGVfcmVzZXRf c3RhdHMoJigqdGJsKS50YWJsZSkNCj4+PiAtDQo+Pj4gLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2No YXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHN0cnVjdCBfX2NoYXNoX3RhYmxlIA0KPj4+ICp0YWJsZSkN Cj4+PiAtew0KPj4+IC3CoMKgwqAgKHZvaWQpdGFibGUgX19DSEFTSF9TVEFUU19JTklUKCgqdGFi bGUpKTsNCj4+PiAtfQ0KPj4+IC0jZWxzZQ0KPj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jlc2V0 X3N0YXRzKHRibCkNCj4+PiAtI2VuZGlmDQo+Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICogY2hhc2hf dGFibGVfY29weV9pbiAtIENvcHkgYSBuZXcgdmFsdWUgaW50byB0aGUgaGFzaCB0YWJsZQ0KPj4+ IC0gKiBAdGJsOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1Y3R1cmUNCj4+PiAtICogQGtleTog S2V5IG9mIHRoZSBlbnRyeSB0byBhZGQgb3IgdXBkYXRlDQo+Pj4gLSAqIEB2YWx1ZTogUG9pbnRl ciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTA0KPj4+IC0gKg0KPj4+IC0gKiBJZiBAa2V5 IGFscmVhZHkgaGFzIGFuIGVudHJ5LCBpdHMgdmFsdWUgaXMgcmVwbGFjZWQuIE90aGVyd2lzZSBh DQo+Pj4gLSAqIG5ldyBlbnRyeSBpcyBhZGRlZC4gSWYgQHZhbHVlIGlzIE5VTEwsIHRoZSB2YWx1 ZSBpcyBsZWZ0IHVuY2hhbmdlZA0KPj4+IC0gKiBvciB1bmluaXRpYWxpemVkLiBSZXR1cm5zIDEg aWYgYW4gZW50cnkgYWxyZWFkeSBleGlzdGVkLCAwIGlmIGEgbmV3DQo+Pj4gLSAqIGVudHJ5IHdh cyBhZGRlZCBvciAlLUVOT01FTSBpZiB0aGVyZSB3YXMgbm8gZnJlZSBzcGFjZSBpbiB0aGUNCj4+ PiAtICogdGFibGUuDQo+Pj4gLSAqLw0KPj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX2NvcHlfaW4o dGJsLCBrZXksIHZhbHVlKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqAgX19j aGFzaF90YWJsZV9jb3B5X2luKCYoKnRibCkudGFibGUsIGtleSwgdmFsdWUpDQo+Pj4gLQ0KPj4+ IC1pbnQgX19jaGFzaF90YWJsZV9jb3B5X2luKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwg dTY0IGtleSwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29uc3Qgdm9pZCAqdmFs dWUpOw0KPj4+IC0NCj4+PiAtLyoqDQo+Pj4gLSAqIGNoYXNoX3RhYmxlX2NvcHlfb3V0IC0gQ29w eSBhIHZhbHVlIG91dCBvZiB0aGUgaGFzaCB0YWJsZQ0KPj4+IC0gKiBAdGJsOiBQb2ludGVyIHRv IHRoZSB0YWJsZSBzdHJ1Y3R1cmUNCj4+PiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBm aW5kDQo+Pj4gLSAqIEB2YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVM TA0KPj4+IC0gKg0KPj4+IC0gKiBJZiBAdmFsdWUgaXMgbm90IE5VTEwgYW5kIHRoZSB0YWJsZSBo YXMgYSBub24tMCB2YWx1ZV9zaXplLCB0aGUNCj4+PiAtICogdmFsdWUgYXQgQGtleSBpcyBjb3Bp ZWQgdG8gQHZhbHVlLiBSZXR1cm5zIHRoZSBzbG90IGluZGV4IG9mIHRoZQ0KPj4+IC0gKiBlbnRy eSBvciAlLUVJTlZBTCBpZiBAa2V5IHdhcyBub3QgZm91bmQuDQo+Pj4gLSAqLw0KPj4+IC0jZGVm aW5lIGNoYXNoX3RhYmxlX2NvcHlfb3V0KHRibCwga2V5LCB2YWx1ZSnCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIFwNCj4+PiAtwqDCoMKgIF9fY2hhc2hfdGFibGVfY29weV9vdXQoJigqdGJsKS50YWJs ZSwga2V5LCB2YWx1ZSwgZmFsc2UpDQo+Pj4gLQ0KPj4+IC1pbnQgX19jaGFzaF90YWJsZV9jb3B5 X291dChzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksDQo+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKTsNCj4+PiAtDQo+ Pj4gLS8qKg0KPj4+IC0gKiBjaGFzaF90YWJsZV9yZW1vdmUgLSBSZW1vdmUgYW4gZW50cnkgZnJv bSB0aGUgaGFzaCB0YWJsZQ0KPj4+IC0gKiBAdGJsOiBQb2ludGVyIHRvIHRoZSB0YWJsZSBzdHJ1 Y3R1cmUNCj4+PiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBmaW5kDQo+Pj4gLSAqIEB2 YWx1ZTogUG9pbnRlciB0byB2YWx1ZSB0byBjb3B5LCBtYXkgYmUgTlVMTA0KPj4+IC0gKg0KPj4+ IC0gKiBJZiBAdmFsdWUgaXMgbm90IE5VTEwgYW5kIHRoZSB0YWJsZSBoYXMgYSBub24tMCB2YWx1 ZV9zaXplLCB0aGUNCj4+PiAtICogdmFsdWUgYXQgQGtleSBpcyBjb3BpZWQgdG8gQHZhbHVlLiBU aGUgZW50cnkgaXMgcmVtb3ZlZCBmcm9tIHRoZQ0KPj4+IC0gKiB0YWJsZS4gUmV0dXJucyB0aGUg c2xvdCBpbmRleCBvZiB0aGUgcmVtb3ZlZCBlbnRyeSBvciAlLUVJTlZBTCBpZg0KPj4+IC0gKiBA a2V5IHdhcyBub3QgZm91bmQuDQo+Pj4gLSAqLw0KPj4+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jl bW92ZSh0YmwsIGtleSwgdmFsdWUpwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDC oCBfX2NoYXNoX3RhYmxlX2NvcHlfb3V0KCYoKnRibCkudGFibGUsIGtleSwgdmFsdWUsIHRydWUp DQo+Pj4gLQ0KPj4+IC0vKg0KPj4+IC0gKiBMb3cgbGV2ZWwgaXRlcmF0b3IgQVBJIHVzZWQgaW50 ZXJuYWxseSBieSB0aGUgYWJvdmUgZnVuY3Rpb25zLg0KPj4+IC0gKi8NCj4+PiAtc3RydWN0IGNo YXNoX2l0ZXIgew0KPj4+IC3CoMKgwqAgc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlOw0KPj4+ IC3CoMKgwqAgdW5zaWduZWQgbG9uZyBtYXNrOw0KPj4+IC3CoMKgwqAgaW50IHNsb3Q7DQo+Pj4g LX07DQo+Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICogQ0hBU0hfSVRFUl9JTklUIC0gSW5pdGlhbGl6 ZSBhIGhhc2ggdGFibGUgaXRlcmF0b3INCj4+PiAtICogQHRibDogUG9pbnRlciB0byBoYXNoIHRh YmxlIHRvIGl0ZXJhdGUgb3Zlcg0KPj4+IC0gKiBAczogSW5pdGlhbCBzbG90IG51bWJlcg0KPj4+ IC0gKi8NCj4+PiAtI2RlZmluZSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIHMpIHvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKgwqDCoMKgwqAgdGFibGUswqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCAxVUwgPDwgKChz KSAmIChCSVRTX1BFUl9MT05HIC0gMSkpLMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHPC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoCB9DQo+ Pj4gLS8qKg0KPj4+IC0gKiBDSEFTSF9JVEVSX1NFVCAtIFNldCBoYXNoIHRhYmxlIGl0ZXJhdG9y IHRvIG5ldyBzbG90DQo+Pj4gLSAqIEBpdGVyOiBJdGVyYXRvcg0KPj4+IC0gKiBAczogU2xvdCBu dW1iZXINCj4+PiAtICovDQo+Pj4gLSNkZWZpbmUgQ0hBU0hfSVRFUl9TRVQoaXRlciwgcynCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoCAoaXRlciku bWFzayA9IDFVTCA8PCAoKHMpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSkswqDCoMKgIFwNCj4+PiAt wqDCoMKgIChpdGVyKS5zbG90ID0gKHMpDQo+Pj4gLS8qKg0KPj4+IC0gKiBDSEFTSF9JVEVSX0lO QyAtIEluY3JlbWVudCBoYXNoIHRhYmxlIGl0ZXJhdG9yDQo+Pj4gLSAqIEB0YWJsZTogSGFzaCB0 YWJsZSB0byBpdGVyYXRlIG92ZXINCj4+PiAtICoNCj4+PiAtICogV3JhcHMgYXJvdW5kIGF0IHRo ZSBlbmQuDQo+Pj4gLSAqLw0KPj4+IC0jZGVmaW5lIENIQVNIX0lURVJfSU5DKGl0ZXIpIGRvIHvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDC oMKgIChpdGVyKS5tYXNrID0gKGl0ZXIpLm1hc2sgPDwgMSB8wqDCoMKgwqDCoMKgwqDCoMKgwqDC oCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKGl0ZXIpLm1hc2sgPj4gKEJJVFNfUEVS X0xPTkcgLSAxKTsgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCAoaXRlcikuc2xvdCA9ICgoaXRlciku c2xvdCArIDEpICYgKGl0ZXIpLnRhYmxlLT5zaXplX21hc2s7IFwNCj4+PiAtwqDCoMKgIH0gd2hp bGUgKDApDQo+Pj4gLQ0KPj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc192YWxp ZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+IC17DQo+Pj4gLcKgwqDCoCBCVUdf T04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+Pj4g LcKgwqDCoCByZXR1cm4gISEoaXRlci50YWJsZS0+dmFsaWRfYml0bWFwW2l0ZXIuc2xvdCA+PiAN Cj4+PiBfQ0hBU0hfTE9OR19TSElGVF0gJg0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqAgaXRlci5t YXNrKTsNCj4+PiAtfQ0KPj4+IC1zdGF0aWMgaW5saW5lIGJvb2wgY2hhc2hfaXRlcl9pc19lbXB0 eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+IC17DQo+Pj4gLcKgwqDCoCBCVUdf T04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+Pj4g LcKgwqDCoCByZXR1cm4gIShpdGVyLnRhYmxlLT5vY2N1cF9iaXRtYXBbaXRlci5zbG90ID4+IA0K Pj4+IF9DSEFTSF9MT05HX1NISUZUXSAmDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgaXRlci5tYXNr KTsNCj4+PiAtfQ0KPj4+IC0NCj4+PiAtc3RhdGljIGlubGluZSB2b2lkIGNoYXNoX2l0ZXJfc2V0 X3ZhbGlkKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4gLXsNCj4+PiAtwqDCoMKg IEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsN Cj4+PiAtwqDCoMKgIGl0ZXIudGFibGUtPnZhbGlkX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNI X0xPTkdfU0hJRlRdIHw9IA0KPj4+IGl0ZXIubWFzazsNCj4+PiAtwqDCoMKgIGl0ZXIudGFibGUt Pm9jY3VwX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdIHw9IA0KPj4+IGl0 ZXIubWFzazsNCj4+PiAtfQ0KPj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRf aW52YWxpZChjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciANCj4+PiBpdGVyKQ0KPj4+IC17DQo+Pj4g LcKgwqDCoCBCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5i aXRzKSk7DQo+Pj4gLcKgwqDCoCBpdGVyLnRhYmxlLT52YWxpZF9iaXRtYXBbaXRlci5zbG90ID4+ IF9DSEFTSF9MT05HX1NISUZUXSAmPSANCj4+PiB+aXRlci5tYXNrOw0KPj4+IC19DQo+Pj4gLXN0 YXRpYyBpbmxpbmUgdm9pZCBjaGFzaF9pdGVyX3NldF9lbXB0eShjb25zdCBzdHJ1Y3QgY2hhc2hf aXRlciBpdGVyKQ0KPj4+IC17DQo+Pj4gLcKgwqDCoCBCVUdfT04oKHVuc2lnbmVkKWl0ZXIuc2xv dCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+Pj4gLcKgwqDCoCBpdGVyLnRhYmxlLT5v Y2N1cF9iaXRtYXBbaXRlci5zbG90ID4+IF9DSEFTSF9MT05HX1NISUZUXSAmPSANCj4+PiB+aXRl ci5tYXNrOw0KPj4+IC19DQo+Pj4gLQ0KPj4+IC1zdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVy X2tleTMyKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4gLXsNCj4+PiAtwqDCoMKg IEJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA0KTsNCj4+PiAtwqDCoMKgIEJVR19PTigo dW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsNCj4+PiAtwqDC oMKgIHJldHVybiBpdGVyLnRhYmxlLT5rZXlzMzJbaXRlci5zbG90XTsNCj4+PiAtfQ0KPj4+IC1z dGF0aWMgaW5saW5lIHU2NCBjaGFzaF9pdGVyX2tleTY0KGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVy IGl0ZXIpDQo+Pj4gLXsNCj4+PiAtwqDCoMKgIEJVR19PTihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAh PSA4KTsNCj4+PiAtwqDCoMKgIEJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49ICgxIDw8IGl0 ZXIudGFibGUtPmJpdHMpKTsNCj4+PiAtwqDCoMKgIHJldHVybiBpdGVyLnRhYmxlLT5rZXlzNjRb aXRlci5zbG90XTsNCj4+PiAtfQ0KPj4+IC1zdGF0aWMgaW5saW5lIHU2NCBjaGFzaF9pdGVyX2tl eShjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPj4+IC17DQo+Pj4gLcKgwqDCoCBCVUdf T04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+Pj4g LcKgwqDCoCByZXR1cm4gKGl0ZXIudGFibGUtPmtleV9zaXplID09IDQpID8NCj4+PiAtwqDCoMKg wqDCoMKgwqAgaXRlci50YWJsZS0+a2V5czMyW2l0ZXIuc2xvdF0gOiBpdGVyLnRhYmxlLT5rZXlz NjRbaXRlci5zbG90XTsNCj4+PiAtfQ0KPj4+IC0NCj4+PiAtc3RhdGljIGlubGluZSB1MzIgY2hh c2hfaXRlcl9oYXNoMzIoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikNCj4+PiAtew0KPj4+ IC3CoMKgwqAgQlVHX09OKGl0ZXIudGFibGUtPmtleV9zaXplICE9IDQpOw0KPj4+IC3CoMKgwqAg cmV0dXJuIGhhc2hfMzIoY2hhc2hfaXRlcl9rZXkzMihpdGVyKSwgaXRlci50YWJsZS0+Yml0cyk7 DQo+Pj4gLX0NCj4+PiAtDQo+Pj4gLXN0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJfaGFzaDY0 KGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+Pj4gLXsNCj4+PiAtwqDCoMKgIEJVR19P TihpdGVyLnRhYmxlLT5rZXlfc2l6ZSAhPSA4KTsNCj4+PiAtwqDCoMKgIHJldHVybiBoYXNoXzY0 KGNoYXNoX2l0ZXJfa2V5NjQoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOw0KPj4+IC19DQo+Pj4g LQ0KPj4+IC1zdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2hhc2goY29uc3Qgc3RydWN0IGNo YXNoX2l0ZXIgaXRlcikNCj4+PiAtew0KPj4+IC3CoMKgwqAgcmV0dXJuIChpdGVyLnRhYmxlLT5r ZXlfc2l6ZSA9PSA0KSA/DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGhhc2hfMzIoY2hhc2hfaXRlcl9r ZXkzMihpdGVyKSwgaXRlci50YWJsZS0+Yml0cykgOg0KPj4+IC3CoMKgwqDCoMKgwqDCoCBoYXNo XzY0KGNoYXNoX2l0ZXJfa2V5NjQoaXRlciksIGl0ZXIudGFibGUtPmJpdHMpOw0KPj4+IC19DQo+ Pj4gLQ0KPj4+IC1zdGF0aWMgaW5saW5lIHZvaWQgKmNoYXNoX2l0ZXJfdmFsdWUoY29uc3Qgc3Ry dWN0IGNoYXNoX2l0ZXIgaXRlcikNCj4+PiAtew0KPj4+IC3CoMKgwqAgQlVHX09OKCh1bnNpZ25l ZClpdGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJsZS0+Yml0cykpOw0KPj4+IC3CoMKgwqAgcmV0 dXJuIGl0ZXIudGFibGUtPnZhbHVlcyArDQo+Pj4gLcKgwqDCoMKgwqDCoMKgICgodW5zaWduZWQg bG9uZylpdGVyLnNsb3QgKiBpdGVyLnRhYmxlLT52YWx1ZV9zaXplKTsNCj4+PiAtfQ0KPj4+IC0N Cj4+PiAtI2VuZGlmIC8qIF9MSU5VWF9DSEFTSF9IICovDQo+Pj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWcgDQo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2xp Yi9LY29uZmlnDQo+Pj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQo+Pj4gaW5kZXggNzc2ZWYz NDM0YzEwLi4wMDAwMDAwMDAwMDANCj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9L Y29uZmlnDQo+Pj4gKysrIC9kZXYvbnVsbA0KPj4+IEBAIC0xLDI4ICswLDAgQEANCj4+PiAtbWVu dSAiQU1EIExpYnJhcnkgcm91dGluZXMiDQo+Pj4gLQ0KPj4+IC0jDQo+Pj4gLSMgQ2xvc2VkIGhh c2ggdGFibGUNCj4+PiAtIw0KPj4+IC1jb25maWcgQ0hBU0gNCj4+PiAtwqDCoMKgIHRyaXN0YXRl DQo+Pj4gLcKgwqDCoCBkZWZhdWx0IERSTV9BTURHUFUNCj4+PiAtwqDCoMKgIGhlbHANCj4+PiAt wqDCoMKgwqAgU3RhdGljYWxseSBzaXplZCBjbG9zZWQgaGFzaCB0YWJsZSBpbXBsZW1lbnRhdGlv biB3aXRoIGxvdw0KPj4+IC3CoMKgwqDCoCBtZW1vcnkgYW5kIENQVSBvdmVyaGVhZC4NCj4+PiAt DQo+Pj4gLWNvbmZpZyBDSEFTSF9TVEFUUw0KPj4+IC3CoMKgwqAgYm9vbCAiQ2xvc2VkIGhhc2gg dGFibGUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyINCj4+PiAtwqDCoMKgIGRlcGVuZHMgb24gQ0hB U0gNCj4+PiAtwqDCoMKgIGRlZmF1bHQgbg0KPj4+IC3CoMKgwqAgaGVscA0KPj4+IC3CoMKgwqDC oCBFbmFibGUgY29sbGVjdGlvbiBvZiBwZXJmb3JtYW5jZSBzdGF0aXN0aWNzIGZvciBjbG9zZWQg aGFzaCANCj4+PiB0YWJsZXMuDQo+Pj4gLQ0KPj4+IC1jb25maWcgQ0hBU0hfU0VMRlRFU1QNCj4+ PiAtwqDCoMKgIGJvb2wgIkNsb3NlZCBoYXNoIHRhYmxlIHNlbGYgdGVzdCINCj4+PiAtwqDCoMKg IGRlcGVuZHMgb24gQ0hBU0gNCj4+PiAtwqDCoMKgIGRlZmF1bHQgbg0KPj4+IC3CoMKgwqAgaGVs cA0KPj4+IC3CoMKgwqDCoCBSdW5zIGEgc2VsZnRlc3QgZHVyaW5nIG1vZHVsZSBsb2FkLiBTZXZl cmFsIG1vZHVsZSBwYXJhbWV0ZXJzDQo+Pj4gLcKgwqDCoMKgIGFyZSBhdmFpbGFibGUgdG8gbW9k aWZ5IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHRlc3QuDQo+Pj4gLQ0KPj4+IC1lbmRtZW51DQo+Pj4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlIA0KPj4+IGIvZHJp dmVycy9ncHUvZHJtL2FtZC9saWIvTWFrZWZpbGUNCj4+PiBkZWxldGVkIGZpbGUgbW9kZSAxMDA2 NDQNCj4+PiBpbmRleCA2OTAyNDMwMDFlMWEuLjAwMDAwMDAwMDAwMA0KPj4+IC0tLSBhL2RyaXZl cnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlDQo+Pj4gKysrIC9kZXYvbnVsbA0KPj4+IEBAIC0x LDMyICswLDAgQEANCj4+PiAtIw0KPj4+IC0jIENvcHlyaWdodCAyMDE3IEFkdmFuY2VkIE1pY3Jv IERldmljZXMsIEluYy4NCj4+PiAtIw0KPj4+IC0jIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50 ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIA0KPj4+IG9idGFpbmluZyBhDQo+Pj4g LSMgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmls ZXMgKHRoZSANCj4+PiAiU29mdHdhcmUiKSwNCj4+PiAtIyB0byBkZWFsIGluIHRoZSBTb2Z0d2Fy ZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCANCj4+PiBsaW1pdGF0aW9u DQo+Pj4gLSMgdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIA0KPj4+IHN1YmxpY2Vuc2UsDQo+Pj4gLSMgYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gDQo+Pj4gdGhl DQo+Pj4gLSMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBm b2xsb3dpbmcgY29uZGl0aW9uczoNCj4+PiAtIw0KPj4+IC0jIFRoZSBhYm92ZSBjb3B5cmlnaHQg bm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIA0KPj4+IGluY2x1ZGVk IGluDQo+Pj4gLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29m dHdhcmUuDQo+Pj4gLSMNCj4+PiAtIyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwg V0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgDQo+Pj4gRVhQUkVTUyBPUg0KPj4+IC0jIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgDQo+ Pj4gTUVSQ0hBTlRBQklMSVRZLA0KPj4+IC0jIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFIEFORCBOT05JTkZSSU5HRU1FTlQuwqAgSU4gTk8gDQo+Pj4gRVZFTlQgU0hBTEwNCj4+PiAt IyBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkg Q0xBSU0sIA0KPj4+IERBTUFHRVMgT1INCj4+PiAtIyBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIA0KPj4+IE9USEVSV0lTRSwNCj4+PiAt IyBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJF IE9SIFRIRSANCj4+PiBVU0UgT1INCj4+PiAtIyBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdB UkUuDQo+Pj4gLSMNCj4+PiAtIw0KPj4+IC0jIE1ha2VmaWxlIGZvciBBTUQgbGlicmFyeSByb3V0 aW5lcywgd2hpY2ggYXJlIHVzZWQgYnkgQU1EIGRyaXZlcg0KPj4+IC0jIGNvbXBvbmVudHMuDQo+ Pj4gLSMNCj4+PiAtIyBUaGlzIGlzIGZvciBjb21tb24gbGlicmFyeSByb3V0aW5lcyB0aGF0IGNh biBiZSBzaGFyZWQgYmV0d2VlbiBBTUQNCj4+PiAtIyBkcml2ZXIgY29tcG9uZW50cyBvciBsYXRl ciBtb3ZlZCB0byBrZXJuZWwvbGliIGZvciBzaGFyaW5nIHdpdGgNCj4+PiAtIyBvdGhlciBkcml2 ZXJzLg0KPj4+IC0NCj4+PiAtY2NmbGFncy15IDo9IC1JJChzcmMpLy4uL2luY2x1ZGUNCj4+PiAt DQo+Pj4gLW9iai0kKENPTkZJR19DSEFTSCkgKz0gY2hhc2gubw0KPj4+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9jaGFzaC5jIA0KPj4+IGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9saWIvY2hhc2guYw0KPj4+IGRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NA0KPj4+IGluZGV4IGI4 ZTQ1ZjM1NmExYy4uMDAwMDAwMDAwMDAwDQo+Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9s aWIvY2hhc2guYw0KPj4+ICsrKyAvZGV2L251bGwNCj4+PiBAQCAtMSw2MzggKzAsMCBAQA0KPj4+ IC0vKg0KPj4+IC0gKiBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMu DQo+Pj4gLSAqDQo+Pj4gLSAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2Yg Y2hhcmdlLCB0byBhbnkgcGVyc29uIA0KPj4+IG9idGFpbmluZyBhDQo+Pj4gLSAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgDQo+ Pj4gIlNvZnR3YXJlIiksDQo+Pj4gLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQg cmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IA0KPj4+IGxpbWl0YXRpb24NCj4+PiAtICog dGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1 dGUsIA0KPj4+IHN1YmxpY2Vuc2UsDQo+Pj4gLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byANCj4+PiB3aG9tIHRoZQ0KPj4+IC0g KiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2lu ZyANCj4+PiBjb25kaXRpb25zOg0KPj4+IC0gKg0KPj4+IC0gKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSANCj4+PiBpbmNsdWRl ZCBpbg0KPj4+IC0gKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBT b2Z0d2FyZS4NCj4+PiAtICoNCj4+PiAtICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIA0KPj4+IEVYUFJFU1MgT1INCj4+PiAt ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiANCj4+PiBNRVJDSEFOVEFCSUxJVFksDQo+Pj4gLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB UiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuwqAgSU4gTk8gDQo+Pj4gRVZFTlQgU0hBTEwN Cj4+PiAtICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCANCj4+PiBEQU1BR0VTIE9SDQo+Pj4gLSAqIE9USEVSIExJQUJJTElUWSwg V0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgDQo+Pj4gT1RIRVJXSVNF LA0KPj4+IC0gKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFNPRlRXQVJFIE9SIFRIRSANCj4+PiBVU0UgT1INCj4+PiAtICogT1RIRVIgREVBTElOR1MgSU4g VEhFIFNPRlRXQVJFLg0KPj4+IC0gKg0KPj4+IC0gKi8NCj4+PiAtDQo+Pj4gLSNpbmNsdWRlIDxs aW51eC90eXBlcy5oPg0KPj4+IC0jaW5jbHVkZSA8bGludXgvaGFzaC5oPg0KPj4+IC0jaW5jbHVk ZSA8bGludXgvYnVnLmg+DQo+Pj4gLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+Pj4gLSNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4NCj4+PiAtI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2Nsb2NrLmg+ DQo+Pj4gLSNpbmNsdWRlIDxhc20vZGl2NjQuaD4NCj4+PiAtI2luY2x1ZGUgPGxpbnV4L2NoYXNo Lmg+DQo+Pj4gLQ0KPj4+IC0vKioNCj4+PiAtICogY2hhc2hfdGFibGVfYWxsb2MgLSBBbGxvY2F0 ZSBjbG9zZWQgaGFzaCB0YWJsZQ0KPj4+IC0gKiBAdGFibGU6IFBvaW50ZXIgdG8gdGhlIHRhYmxl IHN0cnVjdHVyZQ0KPj4+IC0gKiBAYml0czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRy aWVzDQo+Pj4gLSAqIEBrZXlfc2l6ZTogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3Ig OA0KPj4+IC0gKiBAdmFsdWVfc2l6ZTogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2Fu IGJlIDANCj4+PiAtICovDQo+Pj4gLWludCBjaGFzaF90YWJsZV9hbGxvYyhzdHJ1Y3QgY2hhc2hf dGFibGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBrZXlfc2l6ZSwNCj4+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdW5zaWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90IGdmcF9tYXNrKQ0KPj4+ IC17DQo+Pj4gLcKgwqDCoCBpZiAoYml0cyA+IDMxKQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1 cm4gLUVJTlZBTDsNCj4+PiAtDQo+Pj4gLcKgwqDCoCBpZiAoa2V5X3NpemUgIT0gNCAmJiBrZXlf c2l6ZSAhPSA4KQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+PiAtDQo+ Pj4gLcKgwqDCoCB0YWJsZS0+ZGF0YSA9IGtjYWxsb2MoX19DSEFTSF9EQVRBX1NJWkUoYml0cywg a2V5X3NpemUsIA0KPj4+IHZhbHVlX3NpemUpLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHNpemVvZihsb25nKSwgZ2ZwX21hc2spOw0KPj4+IC3CoMKgwqAgaWYgKCF0YWJsZS0+ ZGF0YSkNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07DQo+Pj4gLQ0KPj4+IC3C oMKgwqAgX19DSEFTSF9UQUJMRV9JTklUKHRhYmxlLT50YWJsZSwgdGFibGUtPmRhdGEsDQo+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgYml0cywga2V5X3NpemUsIHZhbHVlX3NpemUp Ow0KPj4+IC0NCj4+PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+IC19DQo+Pj4gLUVYUE9SVF9TWU1C T0woY2hhc2hfdGFibGVfYWxsb2MpOw0KPj4+IC0NCj4+PiAtLyoqDQo+Pj4gLSAqIGNoYXNoX3Rh YmxlX2ZyZWUgLSBGcmVlIGNsb3NlZCBoYXNoIHRhYmxlDQo+Pj4gLSAqIEB0YWJsZTogUG9pbnRl ciB0byB0aGUgdGFibGUgc3RydWN0dXJlDQo+Pj4gLSAqLw0KPj4+IC12b2lkIGNoYXNoX3RhYmxl X2ZyZWUoc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSkNCj4+PiAtew0KPj4+IC3CoMKgwqAga2Zy ZWUodGFibGUtPmRhdGEpOw0KPj4+IC19DQo+Pj4gLUVYUE9SVF9TWU1CT0woY2hhc2hfdGFibGVf ZnJlZSk7DQo+Pj4gLQ0KPj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+Pj4gLQ0KPj4+ IC0jZGVmaW5lIERJVl9GUkFDKG5vbSwgZGVub20sIHF1b3QsIGZyYWMsIGZyYWNfZGlnaXRzKSBk byB7wqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCB1NjQgX19ub20gPSAobm9t KTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKg wqDCoMKgIHU2NCBfX2Rlbm9tID0gKGRlbm9tKTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHU2NCBfX3F1b3QsIF9fZnJhYzvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKg IHUzMiBfX3JlbTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IFwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHdoaWxlIChfX2Rl bm9tID4+IDMyKSB7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+ IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIF9fbm9twqDCoCA+Pj0gMTvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgX19k ZW5vbSA+Pj0gMTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBcDQo+Pj4g LcKgwqDCoMKgwqDCoMKgIH3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBfX3F1b3QgPSBfX25vbTvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwNCj4+PiAtwqDCoMKg wqDCoMKgwqAgX19yZW3CoCA9IGRvX2RpdihfX3F1b3QsIF9fZGVub20pO8KgwqDCoMKgwqDCoMKg wqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBfX2ZyYWMgPSBfX3JlbSAqIChmcmFjX2Rp Z2l0cykgKyAoX19kZW5vbSA+PiAxKTvCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCBkb19k aXYoX19mcmFjLCBfX2Rlbm9tKTvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+ IC3CoMKgwqDCoMKgwqDCoCAocXVvdCkgPSBfX3F1b3Q7wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqDCoMKgwqDCoCAoZnJhYykgPSBfX2ZyYWM7wqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgXA0KPj4+IC3CoMKgwqAgfSB3aGls ZSAoMCkNCj4+PiAtDQo+Pj4gLXZvaWQgX19jaGFzaF90YWJsZV9kdW1wX3N0YXRzKHN0cnVjdCBf X2NoYXNoX3RhYmxlICp0YWJsZSkNCj4+PiAtew0KPj4+IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0 ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7DQo+Pj4gLcKgwqDCoCB1MzIgZmls bGVkID0gMCwgZW1wdHkgPSAwLCB0b21ic3RvbmVzID0gMDsNCj4+PiAtwqDCoMKgIHU2NCBxdW90 MSwgcXVvdDI7DQo+Pj4gLcKgwqDCoCB1MzIgZnJhYzEsIGZyYWMyOw0KPj4+IC0NCj4+PiAtwqDC oMKgIGRvIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKGNoYXNoX2l0ZXJfaXNfdmFsaWQoaXRl cikpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmlsbGVkKys7DQo+Pj4gLcKgwqDCoMKg wqDCoMKgIGVsc2UgaWYgKGNoYXNoX2l0ZXJfaXNfZW1wdHkoaXRlcikpDQo+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgZW1wdHkrKzsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZWxzZQ0KPj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgIHRvbWJzdG9uZXMrKzsNCj4+PiAtwqDCoMKgwqDCoMKgwqAg Q0hBU0hfSVRFUl9JTkMoaXRlcik7DQo+Pj4gLcKgwqDCoCB9IHdoaWxlIChpdGVyLnNsb3QpOw0K Pj4+IC0NCj4+PiAtwqDCoMKgIHByX2RlYnVnKCJjaGFzaDoga2V5IHNpemUgJXUsIHZhbHVlIHNp emUgJXVcbiIsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgdGFibGUtPmtleV9zaXplLCB0YWJsZS0+ dmFsdWVfc2l6ZSk7DQo+Pj4gLcKgwqDCoCBwcl9kZWJ1ZygiwqAgU2xvdHMgdG90YWwvZmlsbGVk L2VtcHR5L3RvbWJzdG9uZXM6ICV1IC8gJXUgLyAldSAvIA0KPj4+ICV1XG4iLA0KPj4+IC3CoMKg wqDCoMKgwqDCoMKgIDEgPDwgdGFibGUtPmJpdHMsIGZpbGxlZCwgZW1wdHksIHRvbWJzdG9uZXMp Ow0KPj4+IC3CoMKgwqAgaWYgKHRhYmxlLT5oaXRzID4gMCkgew0KPj4+IC3CoMKgwqDCoMKgwqDC oCBESVZfRlJBQyh0YWJsZS0+aGl0c19zdGVwcywgdGFibGUtPmhpdHMsIHF1b3QxLCBmcmFjMSwg MTAwMCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxlLT5oaXRzICogMTAwMCwg dGFibGUtPmhpdHNfdGltZV9ucywNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHF1b3Qy LCBmcmFjMiwgMTAwMCk7DQo+Pj4gLcKgwqDCoCB9IGVsc2Ugew0KPj4+IC3CoMKgwqDCoMKgwqDC oCBxdW90MSA9IHF1b3QyID0gMDsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZnJhYzEgPSBmcmFjMiA9 IDA7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLcKgwqDCoCBwcl9kZWJ1ZygiwqAgSGl0c8KgwqAgKGF2 Zy5jb3N0LCByYXRlKTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgDQo+Pj4gTS9zKVxuIiwN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoCB0YWJsZS0+aGl0cywgcXVvdDEsIGZyYWMxLCBxdW90Miwg ZnJhYzIpOw0KPj4+IC3CoMKgwqAgaWYgKHRhYmxlLT5taXNzID4gMCkgew0KPj4+IC3CoMKgwqDC oMKgwqDCoCBESVZfRlJBQyh0YWJsZS0+bWlzc19zdGVwcywgdGFibGUtPm1pc3MsIHF1b3QxLCBm cmFjMSwgMTAwMCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxlLT5taXNzICog MTAwMCwgdGFibGUtPm1pc3NfdGltZV9ucywNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHF1b3QyLCBmcmFjMiwgMTAwMCk7DQo+Pj4gLcKgwqDCoCB9IGVsc2Ugew0KPj4+IC3CoMKgwqDC oMKgwqDCoCBxdW90MSA9IHF1b3QyID0gMDsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZnJhYzEgPSBm cmFjMiA9IDA7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLcKgwqDCoCBwcl9kZWJ1ZygiwqAgTWlzc2Vz IChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVsbHUuJTAzdSwgJWxsdS4lMDN1IA0KPj4+IE0vcylc biIsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgdGFibGUtPm1pc3MsIHF1b3QxLCBmcmFjMSwgcXVv dDIsIGZyYWMyKTsNCj4+PiAtwqDCoMKgIGlmICh0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzID4g MCkgew0KPj4+IC3CoMKgwqDCoMKgwqDCoCBESVZfRlJBQyh0YWJsZS0+aGl0c19zdGVwcyArIHRh YmxlLT5taXNzX3N0ZXBzLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgdGFibGUtPmhp dHMgKyB0YWJsZS0+bWlzcywgcXVvdDEsIGZyYWMxLCAxMDAwKTsNCj4+PiAtwqDCoMKgwqDCoMKg wqAgRElWX0ZSQUMoKHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MpICogMTAwMCwNCj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgICh0YWJsZS0+aGl0c190aW1lX25zICsgdGFibGUtPm1pc3Nf dGltZV9ucyksDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBxdW90MiwgZnJhYzIsIDEw MDApOw0KPj4+IC3CoMKgwqAgfSBlbHNlIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcXVvdDEgPSBx dW90MiA9IDA7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGZyYWMxID0gZnJhYzIgPSAwOw0KPj4+IC3C oMKgwqAgfQ0KPj4+IC3CoMKgwqAgcHJfZGVidWcoIsKgIFRvdGFswqAgKGF2Zy5jb3N0LCByYXRl KTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgDQo+Pj4gTS9zKVxuIiwNCj4+PiAtwqDCoMKg wqDCoMKgwqDCoCB0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzLCBxdW90MSwgZnJhYzEsIHF1b3Qy LCBmcmFjMik7DQo+Pj4gLcKgwqDCoCBpZiAodGFibGUtPnJlbG9jcyA+IDApIHsNCj4+PiAtwqDC oMKgwqDCoMKgwqAgRElWX0ZSQUModGFibGUtPmhpdHMgKyB0YWJsZS0+bWlzcywgdGFibGUtPnJl bG9jcywNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHF1b3QxLCBmcmFjMSwgMTAwMCk7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIERJVl9GUkFDKHRhYmxlLT5yZWxvY19kaXN0LCB0YWJsZS0+ cmVsb2NzLCBxdW90MiwgZnJhYzIsIA0KPj4+IDEwMDApOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCBw cl9kZWJ1ZygiwqAgUmVsb2NhdGlvbnMgKGZyZXEsIGF2Zy5kaXN0KTogJWxsdSANCj4+PiAoMTol bGx1LiUwM3UsICVsbHUuJTAzdSlcbiIsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0 YWJsZS0+cmVsb2NzLCBxdW90MSwgZnJhYzEsIHF1b3QyLCBmcmFjMik7DQo+Pj4gLcKgwqDCoCB9 IGVsc2Ugew0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9kZWJ1ZygiwqAgTm8gcmVsb2NhdGlvbnNc biIpOw0KPj4+IC3CoMKgwqAgfQ0KPj4+IC19DQo+Pj4gLUVYUE9SVF9TWU1CT0woX19jaGFzaF90 YWJsZV9kdW1wX3N0YXRzKTsNCj4+PiAtDQo+Pj4gLSN1bmRlZiBESVZfRlJBQw0KPj4+IC0jZW5k aWYNCj4+PiAtDQo+Pj4gLSNkZWZpbmUgQ0hBU0hfSU5DKHRhYmxlLCBhKSAoKGEpID0gKChhKSAr IDEpICYgKHRhYmxlKS0+c2l6ZV9tYXNrKQ0KPj4+IC0jZGVmaW5lIENIQVNIX0FERCh0YWJsZSwg YSwgYikgKCgoYSkgKyAoYikpICYgKHRhYmxlKS0+c2l6ZV9tYXNrKQ0KPj4+IC0jZGVmaW5lIENI QVNIX1NVQih0YWJsZSwgYSwgYikgKCgoYSkgLSAoYikpICYgKHRhYmxlKS0+c2l6ZV9tYXNrKQ0K Pj4+IC0jZGVmaW5lIENIQVNIX0lOX1JBTkdFKHRhYmxlLCBzbG90LCBmaXJzdCwgbGFzdCkgXA0K Pj4+IC3CoMKgwqAgKENIQVNIX1NVQih0YWJsZSwgc2xvdCwgZmlyc3QpIDw9IENIQVNIX1NVQih0 YWJsZSwgbGFzdCwgZmlyc3QpKQ0KPj4+IC0NCj4+PiAtLyojZGVmaW5lIENIQVNIX0RFQlVHIFVu Y29tbWVudCB0aGlzIHRvIGVuYWJsZSB2ZXJib3NlIGRlYnVnIG91dHB1dCovDQo+Pj4gLSNpZmRl ZiBDSEFTSF9ERUJVRw0KPj4+IC1zdGF0aWMgdm9pZCBjaGFzaF90YWJsZV9kdW1wKHN0cnVjdCBf X2NoYXNoX3RhYmxlICp0YWJsZSkNCj4+PiAtew0KPj4+IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0 ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAg ZG8gew0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoKGl0ZXIuc2xvdCAmIDMpID09IDApDQo+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIiUwNHg6ICIsIGl0ZXIuc2xvdCk7DQo+ Pj4gLQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoY2hhc2hfaXRlcl9pc192YWxpZChpdGVyKSkN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9kZWJ1ZygiWyUwMTZsbHhdICIsIGNoYXNo X2l0ZXJfa2V5KGl0ZXIpKTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAoY2hhc2hfaXRl cl9pc19lbXB0eShpdGVyKSkNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9kZWJ1Zygi W8KgwqDCoCA8ZW1wdHk+wqDCoMKgwqAgXSAiKTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgZWxzZQ0K Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2RlYnVnKCJbwqAgPHRvbWJzdG9uZT7CoMKg IF0gIik7DQo+Pj4gLQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAoKGl0ZXIuc2xvdCAmIDMpID09 IDMpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZGVidWcoIlxuIik7DQo+Pj4gLQ0K Pj4+IC3CoMKgwqDCoMKgwqDCoCBDSEFTSF9JVEVSX0lOQyhpdGVyKTsNCj4+PiAtwqDCoMKgIH0g d2hpbGUgKGl0ZXIuc2xvdCk7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgaWYgKChpdGVyLnNsb3QgJiAz KSAhPSAwKQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9kZWJ1ZygiXG4iKTsNCj4+PiAtfQ0KPj4+ IC0NCj4+PiAtc3RhdGljIGludCBjaGFzaF90YWJsZV9jaGVjayhzdHJ1Y3QgX19jaGFzaF90YWJs ZSAqdGFibGUpDQo+Pj4gLXsNCj4+PiAtwqDCoMKgIHUzMiBoYXNoOw0KPj4+IC3CoMKgwqAgc3Ry dWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7DQo+Pj4gLcKg wqDCoCBzdHJ1Y3QgY2hhc2hfaXRlciBjdXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIDApOw0K Pj4+IC0NCj4+PiAtwqDCoMKgIGRvIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgaWYgKCFjaGFzaF9p dGVyX2lzX3ZhbGlkKGl0ZXIpKSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hf SVRFUl9JTkMoaXRlcik7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY29udGludWU7DQo+ Pj4gLcKgwqDCoMKgwqDCoMKgIH0NCj4+PiAtDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGhhc2ggPSBj aGFzaF9pdGVyX2hhc2goaXRlcik7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIENIQVNIX0lURVJfU0VU KGN1ciwgaGFzaCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHdoaWxlIChjdXIuc2xvdCAhPSBpdGVy LnNsb3QpIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoY2hhc2hfaXRlcl9pc19l bXB0eShjdXIpKSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIo IlBhdGggdG8gZWxlbWVudCBhdCAleCB3aXRoIGhhc2ggJXggYnJva2VuIA0KPj4+IGF0IHNsb3Qg JXhcbiIsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IGl0ZXIuc2xvdCwgaGFzaCwgY3VyLnNsb3QpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgY2hhc2hfdGFibGVfZHVtcCh0YWJsZSk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCByZXR1cm4gLUVJTlZBTDsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB9DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTkMoY3VyKTsNCj4+ PiAtwqDCoMKgwqDCoMKgwqAgfQ0KPj4+IC0NCj4+PiAtwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRF Ul9JTkMoaXRlcik7DQo+Pj4gLcKgwqDCoCB9IHdoaWxlIChpdGVyLnNsb3QpOw0KPj4+IC0NCj4+ PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+IC19DQo+Pj4gLSNlbmRpZg0KPj4+IC0NCj4+PiAtc3Rh dGljIHZvaWQgY2hhc2hfaXRlcl9yZWxvY2F0ZShzdHJ1Y3QgY2hhc2hfaXRlciBkc3QsIHN0cnVj dCANCj4+PiBjaGFzaF9pdGVyIHNyYykNCj4+PiAtew0KPj4+IC3CoMKgwqAgQlVHX09OKHNyYy50 YWJsZSA9PSBkc3QudGFibGUgJiYgc3JjLnNsb3QgPT0gZHN0LnNsb3QpOw0KPj4+IC3CoMKgwqAg QlVHX09OKHNyYy50YWJsZS0+a2V5X3NpemUgIT0gZHN0LnRhYmxlLT5rZXlfc2l6ZSk7DQo+Pj4g LcKgwqDCoCBCVUdfT04oc3JjLnRhYmxlLT52YWx1ZV9zaXplICE9IGRzdC50YWJsZS0+dmFsdWVf c2l6ZSk7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgaWYgKGRzdC50YWJsZS0+a2V5X3NpemUgPT0gNCkN Cj4+PiAtwqDCoMKgwqDCoMKgwqAgZHN0LnRhYmxlLT5rZXlzMzJbZHN0LnNsb3RdID0gc3JjLnRh YmxlLT5rZXlzMzJbc3JjLnNsb3RdOw0KPj4+IC3CoMKgwqAgZWxzZQ0KPj4+IC3CoMKgwqDCoMKg wqDCoCBkc3QudGFibGUtPmtleXM2NFtkc3Quc2xvdF0gPSBzcmMudGFibGUtPmtleXM2NFtzcmMu c2xvdF07DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgaWYgKGRzdC50YWJsZS0+dmFsdWVfc2l6ZSkNCj4+ PiAtwqDCoMKgwqDCoMKgwqAgbWVtY3B5KGNoYXNoX2l0ZXJfdmFsdWUoZHN0KSwgY2hhc2hfaXRl cl92YWx1ZShzcmMpLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRzdC50YWJs ZS0+dmFsdWVfc2l6ZSk7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgY2hhc2hfaXRlcl9zZXRfdmFsaWQo ZHN0KTsNCj4+PiAtwqDCoMKgIGNoYXNoX2l0ZXJfc2V0X2ludmFsaWQoc3JjKTsNCj4+PiAtDQo+ Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4+PiAtwqDCoMKgIGlmIChzcmMudGFibGUg PT0gZHN0LnRhYmxlKSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGRzdC50YWJsZS0+cmVsb2NzKys7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGRzdC50YWJsZS0+cmVsb2NfZGlzdCArPQ0KPj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgIENIQVNIX1NVQihkc3QudGFibGUsIHNyYy5zbG90LCBkc3Quc2xv dCk7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLSNlbmRpZg0KPj4+IC19DQo+Pj4gLQ0KPj4+IC0vKioN Cj4+PiAtICogX19jaGFzaF90YWJsZV9maW5kIC0gSGVscGVyIGZvciBsb29raW5nIHVwIGEgaGFz aCB0YWJsZSBlbnRyeQ0KPj4+IC0gKiBAaXRlcjogUG9pbnRlciB0byBoYXNoIHRhYmxlIGl0ZXJh dG9yDQo+Pj4gLSAqIEBrZXk6IEtleSBvZiB0aGUgZW50cnkgdG8gZmluZA0KPj4+IC0gKiBAZm9y X3JlbW92YWw6IHNldCB0byB0cnVlIGlmIHRoZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBzb29u DQo+Pj4gLSAqDQo+Pj4gLSAqIFNlYXJjaGVzIGZvciBhbiBlbnRyeSBpbiB0aGUgaGFzaCB0YWJs ZSB3aXRoIGEgZ2l2ZW4ga2V5LiBpdGVyIG11c3QNCj4+PiAtICogYmUgaW5pdGlhbGl6ZWQgYnkg dGhlIGNhbGxlciB0byBwb2ludCB0byB0aGUgaG9tZSBwb3NpdGlvbiBvZiB0aGUNCj4+PiAtICog aHlwb3RoZXRpY2FsIGVudHJ5LCBpLmUuIGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUg aGFzaCB0YWJsZQ0KPj4+IC0gKiBhbmQgdGhlIGtleSdzIGhhc2ggYXMgdGhlIGluaXRpYWwgc2xv dCBmb3IgdGhlIHNlYXJjaC4NCj4+PiAtICoNCj4+PiAtICogVGhpcyBmdW5jdGlvbiBhbHNvIGRv ZXMgc29tZSBsb2NhbCBjbGVhbi11cCB0byBzcGVlZCB1cCBmdXR1cmUNCj4+PiAtICogbG9vay11 cHMgYnkgcmVsb2NhdGluZyBlbnRyaWVzIHRvIGJldHRlciBzbG90cyBhbmQgcmVtb3ZpbmcNCj4+ PiAtICogdG9tYnN0b25lcyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkLg0KPj4+IC0gKg0KPj4+ IC0gKiBJZiBAZm9yX3JlbW92YWwgaXMgdHJ1ZSwgdGhlIGZ1bmN0aW9uIGF2b2lkcyByZWxvY2F0 aW5nIHRoZSBlbnRyeQ0KPj4+IC0gKiB0aGF0IGlzIGJlaW5nIHJldHVybmVkLg0KPj4+IC0gKg0K Pj4+IC0gKiBSZXR1cm5zIDAgaWYgdGhlIHNlYXJjaCBpcyBzdWNjZXNzZnVsLiBJbiB0aGlzIGNh c2UgaXRlciBpcyB1cGRhdGVkDQo+Pj4gLSAqIHRvIHBvaW50IHRvIHRoZSBmb3VuZCBlbnRyeS4g T3RoZXJ3aXNlICUtRUlOVkFMIGlzIHJldHVybmVkIGFuZCB0aGUNCj4+PiAtICogaXRlciBpcyB1 cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBhdmFpbGFibGUgc2xvdCBmb3IgdGhlIGdpdmVu DQo+Pj4gLSAqIGtleS4gSWYgdGhlIHRhYmxlIGlzIGZ1bGwsIHRoZSBzbG90IGlzIHNldCB0byAt MS4NCj4+PiAtICovDQo+Pj4gLXN0YXRpYyBpbnQgY2hhc2hfdGFibGVfZmluZChzdHJ1Y3QgY2hh c2hfaXRlciAqaXRlciwgdTY0IGtleSwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGJvb2wgZm9yX3JlbW92YWwpDQo+Pj4gLXsNCj4+PiAtI2lmZGVmIENPTkZJR19DSEFTSF9T VEFUUw0KPj4+IC3CoMKgwqAgdTY0IHRzMSA9IGxvY2FsX2Nsb2NrKCk7DQo+Pj4gLSNlbmRpZg0K Pj4+IC3CoMKgwqAgdTMyIGhhc2ggPSBpdGVyLT5zbG90Ow0KPj4+IC3CoMKgwqAgc3RydWN0IGNo YXNoX2l0ZXIgZmlyc3RfcmVkdW5kYW50ID0gDQo+Pj4gQ0hBU0hfSVRFUl9JTklUKGl0ZXItPnRh YmxlLCAtMSk7DQo+Pj4gLcKgwqDCoCBpbnQgZmlyc3RfYXZhaWwgPSAoZm9yX3JlbW92YWwgPyAt MiA6IC0xKTsNCj4+PiAtDQo+Pj4gLcKgwqDCoCB3aGlsZSAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQo Kml0ZXIpIHx8IGNoYXNoX2l0ZXJfa2V5KCppdGVyKSAhPSANCj4+PiBrZXkpIHsNCj4+PiAtwqDC oMKgwqDCoMKgwqAgaWYgKGNoYXNoX2l0ZXJfaXNfZW1wdHkoKml0ZXIpKSB7DQo+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgLyogRm91bmQgYW4gZW1wdHkgc2xvdCwgd2hpY2ggZW5kcyB0aGUN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogc2VhcmNoLiBDbGVhbiB1cCBhbnkgcHJl Y2VkaW5nIHRvbWJzdG9uZXMNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogdGhhdCBh cmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNlIHRoZXkgbGVhZA0KPj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgKiB0byBuby13aGVyZQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Ki8NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoKGludClmaXJzdF9yZWR1bmRhbnQu c2xvdCA8IDApDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5vdF9m b3VuZDsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB3aGlsZSAoZmlyc3RfcmVkdW5kYW50 LnNsb3QgIT0gaXRlci0+c2xvdCkgew0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgaWYgKCFjaGFzaF9pdGVyX2lzX3ZhbGlkKGZpcnN0X3JlZHVuZGFudCkpDQo+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNoYXNoX2l0ZXJfc2V0X2VtcHR5KGZp cnN0X3JlZHVuZGFudCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBDSEFT SF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg IH0NCj4+PiAtI2lmZGVmIENIQVNIX0RFQlVHDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg Y2hhc2hfdGFibGVfY2hlY2soaXRlci0+dGFibGUpOw0KPj4+IC0jZW5kaWYNCj4+PiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5vdF9mb3VuZDsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgfSBl bHNlIGlmICghY2hhc2hfaXRlcl9pc192YWxpZCgqaXRlcikpIHsNCj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAvKiBGb3VuZCBhIHRvbWJzdG9uZS4gUmVtZW1iZXIgaXQgYXMgY2FuZGlkYXRl DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGZvciByZWxvY2F0aW5nIHRoZSBlbnRy eSB3ZSdyZSBsb29raW5nIGZvcg0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBvciBm b3IgYWRkaW5nIGEgbmV3IGVudHJ5IHdpdGggdGhlIGdpdmVuIGtleQ0KPj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKi8NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpZiAoZmlyc3Rf YXZhaWwgPT0gLTEpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmaXJzdF9h dmFpbCA9IGl0ZXItPnNsb3Q7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogT3IgbWFy ayBpdCBhcyB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgICogcG90ZW50aWFsbHkgcmVkdW5kYW50IHRvbWJzdG9uZXMNCj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgICovDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZWxzZSBpZiAo Zmlyc3RfcmVkdW5kYW50LnNsb3QgPT0gLTEpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBDSEFTSF9JVEVSX1NFVChmaXJzdF9yZWR1bmRhbnQsIGl0ZXItPnNsb3QpOw0KPj4+ IC3CoMKgwqDCoMKgwqDCoCB9IGVsc2UgaWYgKGZpcnN0X3JlZHVuZGFudC5zbG90ID49IDApIHsN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBGb3VuZCBhIHZhbGlkLCBvY2N1cGllZCBz bG90IHdpdGggYQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiBwcmVjZWRpbmcgc2Vy aWVzIG9mIHRvbWJzdG9uZXMuIFJlbG9jYXRlIGl0DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoCAqIHRvIGEgYmV0dGVyIHBvc2l0aW9uIHRoYXQgbm8gbG9uZ2VyIGRlcGVuZHMNCj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogb24gdGhvc2UgdG9tYnN0b25lcw0KPj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgKi8NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1MzIg Y3VyX2hhc2ggPSBjaGFzaF9pdGVyX2hhc2goKml0ZXIpOw0KPj4+IC0NCj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAoIUNIQVNIX0lOX1JBTkdFKGl0ZXItPnRhYmxlLCBjdXJfaGFzaCwN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmaXJz dF9yZWR1bmRhbnQuc2xvdCArIDEsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgaXRlci0+c2xvdCkpIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIC8qIFRoaXMgZW50cnkgaGFzIGEgaGFzaCBhdCBvciBiZWZvcmUNCj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgKiB0aGUgZmlyc3QgdG9tYnN0b25lIHdl IGZvdW5kLiBXZQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIGNhbiBy ZWxvY2F0ZSBpdCB0byB0aGF0IHRvbWJzdG9uZQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCAqIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IHRvbWJzdG9uZQ0KPj4+IC3CoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqLw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgY2hhc2hfaXRlcl9yZWxvY2F0ZShmaXJzdF9yZWR1bmRhbnQsICppdGVyKTsN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGRvIHsNCj4+PiAtwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTkMoZmlyc3RfcmVkdW5k YW50KTsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIH0gd2hpbGUgKGNoYXNo X2l0ZXJfaXNfdmFsaWQoZmlyc3RfcmVkdW5kYW50KSk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfSBlbHNlIGlmIChjdXJfaGFzaCAhPSBpdGVyLT5zbG90KSB7DQo+Pj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAvKiBSZWxvY2F0ZSBlbnRyeSB0byBpdHMgaG9tZSBwb3Np dGlvbg0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAqIG9yIGFzIGNsb3Nl IGFzIHBvc3NpYmxlIHNvIGl0IG5vDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICogbG9uZ2VyIGRlcGVuZHMgb24gYW55IHByZWNlZGluZw0KPj4+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAqIHRvbWJzdG9uZXMNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgKi8NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCBjaGFzaF9pdGVyIG5ld19pdGVyID0NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTklUKGl0ZXItPnRhYmxlLCBjdXJfaGFzaCk7DQo+ Pj4gLQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgd2hpbGUgKG5ld19pdGVy LnNsb3QgIT0gaXRlci0+c2xvdCAmJg0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBjaGFzaF9pdGVyX2lzX3ZhbGlkKG5ld19pdGVyKSkNCj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9JTkMobmV3X2l0 ZXIpOw0KPj4+IC0NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChuZXdf aXRlci5zbG90ICE9IGl0ZXItPnNsb3QpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIGNoYXNoX2l0ZXJfcmVsb2NhdGUobmV3X2l0ZXIsICppdGVyKTsNCj4+PiAt wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIH0NCj4+PiAtDQo+ Pj4gLcKgwqDCoMKgwqDCoMKgIENIQVNIX0lURVJfSU5DKCppdGVyKTsNCj4+PiAtwqDCoMKgwqDC oMKgwqAgaWYgKGl0ZXItPnNsb3QgPT0gaGFzaCkgew0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGl0ZXItPnNsb3QgPSAtMTsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG5v dF9mb3VuZDsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgfQ0KPj4+IC3CoMKgwqAgfQ0KPj4+IC0NCj4+ PiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUw0KPj4+IC3CoMKgwqAgaXRlci0+dGFibGUtPmhp dHMrKzsNCj4+PiAtwqDCoMKgIGl0ZXItPnRhYmxlLT5oaXRzX3N0ZXBzICs9IENIQVNIX1NVQihp dGVyLT50YWJsZSwgaXRlci0+c2xvdCwgDQo+Pj4gaGFzaCkgKyAxOw0KPj4+IC0jZW5kaWYNCj4+ PiAtDQo+Pj4gLcKgwqDCoCBpZiAoZmlyc3RfYXZhaWwgPj0gMCkgew0KPj4+IC3CoMKgwqDCoMKg wqDCoCBDSEFTSF9JVEVSX1NFVChmaXJzdF9yZWR1bmRhbnQsIGZpcnN0X2F2YWlsKTsNCj4+PiAt wqDCoMKgwqDCoMKgwqAgY2hhc2hfaXRlcl9yZWxvY2F0ZShmaXJzdF9yZWR1bmRhbnQsICppdGVy KTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgaXRlci0+c2xvdCA9IGZpcnN0X3JlZHVuZGFudC5zbG90 Ow0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpdGVyLT5tYXNrID0gZmlyc3RfcmVkdW5kYW50Lm1hc2s7 DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLQ0KPj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+ Pj4gLcKgwqDCoCBpdGVyLT50YWJsZS0+aGl0c190aW1lX25zICs9IGxvY2FsX2Nsb2NrKCkgLSB0 czE7DQo+Pj4gLSNlbmRpZg0KPj4+IC0NCj4+PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+IC0NCj4+ PiAtbm90X2ZvdW5kOg0KPj4+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+Pj4gLcKgwqDC oCBpdGVyLT50YWJsZS0+bWlzcysrOw0KPj4+IC3CoMKgwqAgaXRlci0+dGFibGUtPm1pc3Nfc3Rl cHMgKz0gKGl0ZXItPnNsb3QgPCAwKSA/DQo+Pj4gLcKgwqDCoMKgwqDCoMKgICgxIDw8IGl0ZXIt PnRhYmxlLT5iaXRzKSA6DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIENIQVNIX1NVQihpdGVyLT50YWJs ZSwgaXRlci0+c2xvdCwgaGFzaCkgKyAxOw0KPj4+IC0jZW5kaWYNCj4+PiAtDQo+Pj4gLcKgwqDC oCBpZiAoZmlyc3RfYXZhaWwgPj0gMCkNCj4+PiAtwqDCoMKgwqDCoMKgwqAgQ0hBU0hfSVRFUl9T RVQoKml0ZXIsIGZpcnN0X2F2YWlsKTsNCj4+PiAtDQo+Pj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hf U1RBVFMNCj4+PiAtwqDCoMKgIGl0ZXItPnRhYmxlLT5taXNzX3RpbWVfbnMgKz0gbG9jYWxfY2xv Y2soKSAtIHRzMTsNCj4+PiAtI2VuZGlmDQo+Pj4gLQ0KPj4+IC3CoMKgwqAgcmV0dXJuIC1FSU5W QUw7DQo+Pj4gLX0NCj4+PiAtDQo+Pj4gLWludCBfX2NoYXNoX3RhYmxlX2NvcHlfaW4oc3RydWN0 IF9fY2hhc2hfdGFibGUgKnRhYmxlLCB1NjQga2V5LA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBjb25zdCB2b2lkICp2YWx1ZSkNCj4+PiAtew0KPj4+IC3CoMKgwqAgdTMyIGhhc2gg PSAodGFibGUtPmtleV9zaXplID09IDQpID8NCj4+PiAtwqDCoMKgwqDCoMKgwqAgaGFzaF8zMihr ZXksIHRhYmxlLT5iaXRzKSA6IGhhc2hfNjQoa2V5LCB0YWJsZS0+Yml0cyk7DQo+Pj4gLcKgwqDC oCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyID0gQ0hBU0hfSVRFUl9JTklUKHRhYmxlLCBoYXNoKTsN Cj4+PiAtwqDCoMKgIGludCByID0gY2hhc2hfdGFibGVfZmluZCgmaXRlciwga2V5LCBmYWxzZSk7 DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgLyogRm91bmQgYW4gZXhpc3RpbmcgZW50cnkgKi8NCj4+PiAt wqDCoMKgIGlmICghcikgew0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAodmFsdWUgJiYgdGFibGUt PnZhbHVlX3NpemUpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtY3B5KGNoYXNoX2l0 ZXJfdmFsdWUoaXRlciksIHZhbHVlLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgdGFibGUtPnZhbHVlX3NpemUpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCByZXR1cm4g MTsNCj4+PiAtwqDCoMKgIH0NCj4+PiAtDQo+Pj4gLcKgwqDCoCAvKiBJcyB0aGVyZSBhIHBsYWNl IHRvIGFkZCBhIG5ldyBlbnRyeT8gKi8NCj4+PiAtwqDCoMKgIGlmIChpdGVyLnNsb3QgPCAwKSB7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHByX2VycigiSGFzaCB0YWJsZSBvdmVyZmxvd1xuIik7DQo+ Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOw0KPj4+IC3CoMKgwqAgfQ0KPj4+IC0N Cj4+PiAtwqDCoMKgIGNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGl0ZXIpOw0KPj4+IC0NCj4+PiAtwqDC oMKgIGlmICh0YWJsZS0+a2V5X3NpemUgPT0gNCkNCj4+PiAtwqDCoMKgwqDCoMKgwqAgdGFibGUt PmtleXMzMltpdGVyLnNsb3RdID0ga2V5Ow0KPj4+IC3CoMKgwqAgZWxzZQ0KPj4+IC3CoMKgwqDC oMKgwqDCoCB0YWJsZS0+a2V5czY0W2l0ZXIuc2xvdF0gPSBrZXk7DQo+Pj4gLcKgwqDCoCBpZiAo dmFsdWUgJiYgdGFibGUtPnZhbHVlX3NpemUpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIG1lbWNweShj aGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB2YWx1ZSwgdGFibGUtPnZhbHVlX3NpemUpOw0KPj4+IC0N Cj4+PiAtwqDCoMKgIHJldHVybiAwOw0KPj4+IC19DQo+Pj4gLUVYUE9SVF9TWU1CT0woX19jaGFz aF90YWJsZV9jb3B5X2luKTsNCj4+PiAtDQo+Pj4gLWludCBfX2NoYXNoX3RhYmxlX2NvcHlfb3V0 KHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtleSwNCj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB2b2lkICp2YWx1ZSwgYm9vbCByZW1vdmUpDQo+Pj4gLXsNCj4+PiAt wqDCoMKgIHUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/DQo+Pj4gLcKgwqDCoMKg wqDCoMKgIGhhc2hfMzIoa2V5LCB0YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJp dHMpOw0KPj4+IC3CoMKgwqAgc3RydWN0IGNoYXNoX2l0ZXIgaXRlciA9IENIQVNIX0lURVJfSU5J VCh0YWJsZSwgaGFzaCk7DQo+Pj4gLcKgwqDCoCBpbnQgciA9IGNoYXNoX3RhYmxlX2ZpbmQoJml0 ZXIsIGtleSwgcmVtb3ZlKTsNCj4+PiAtDQo+Pj4gLcKgwqDCoCBpZiAociA8IDApDQo+Pj4gLcKg wqDCoMKgwqDCoMKgIHJldHVybiByOw0KPj4+IC0NCj4+PiAtwqDCoMKgIGlmICh2YWx1ZSAmJiB0 YWJsZS0+dmFsdWVfc2l6ZSkNCj4+PiAtwqDCoMKgwqDCoMKgwqAgbWVtY3B5KHZhbHVlLCBjaGFz aF9pdGVyX3ZhbHVlKGl0ZXIpLCB0YWJsZS0+dmFsdWVfc2l6ZSk7DQo+Pj4gLQ0KPj4+IC3CoMKg wqAgaWYgKHJlbW92ZSkNCj4+PiAtwqDCoMKgwqDCoMKgwqAgY2hhc2hfaXRlcl9zZXRfaW52YWxp ZChpdGVyKTsNCj4+PiAtDQo+Pj4gLcKgwqDCoCByZXR1cm4gaXRlci5zbG90Ow0KPj4+IC19DQo+ Pj4gLUVYUE9SVF9TWU1CT0woX19jaGFzaF90YWJsZV9jb3B5X291dCk7DQo+Pj4gLQ0KPj4+IC0j aWZkZWYgQ09ORklHX0NIQVNIX1NFTEZURVNUDQo+Pj4gLS8qKg0KPj4+IC0gKiBjaGFzaF9zZWxm X3Rlc3QgLSBSdW4gYSBzZWxmLXRlc3Qgb2YgdGhlIGhhc2ggdGFibGUgaW1wbGVtZW50YXRpb24N Cj4+PiAtICogQGJpdHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50cmllcw0KPj4+IC0g KiBAa2V5X3NpemU6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4+PiAtICog QG1pbl9maWxsOiBNaW5pbXVtIGZpbGwgbGV2ZWwgZHVyaW5nIHRoZSB0ZXN0DQo+Pj4gLSAqIEBt YXhfZmlsbDogTWF4aW11bSBmaWxsIGxldmVsIGR1cmluZyB0aGUgdGVzdA0KPj4+IC0gKiBAaXRl cmF0aW9uczogTnVtYmVyIG9mIHRlc3QgaXRlcmF0aW9ucw0KPj4+IC0gKg0KPj4+IC0gKiBUaGUg dGVzdCBhZGRzIGFuZCByZW1vdmVzIGVudHJpZXMgZnJvbSBhIGhhc2ggdGFibGUsIGN5Y2xpbmcg dGhlDQo+Pj4gLSAqIGZpbGwgbGV2ZWwgYmV0d2VlbiBtaW5fZmlsbCBhbmQgbWF4X2ZpbGwgZW50 cmllcy4gQWxzbyB0ZXN0cyBsb29rdXANCj4+PiAtICogYW5kIHZhbHVlIHJldHJpZXZhbC4NCj4+ PiAtICovDQo+Pj4gLXN0YXRpYyBpbnQgX19pbml0IGNoYXNoX3NlbGZfdGVzdCh1OCBiaXRzLCB1 OCBrZXlfc2l6ZSwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbnQg bWluX2ZpbGwsIGludCBtYXhfZmlsbCwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB1NjQgaXRlcmF0aW9ucykNCj4+PiAtew0KPj4+IC3CoMKgwqAgc3RydWN0IGNoYXNo X3RhYmxlIHRhYmxlOw0KPj4+IC3CoMKgwqAgaW50IHJldDsNCj4+PiAtwqDCoMKgIHU2NCBhZGRf Y291bnQsIHJtdl9jb3VudDsNCj4+PiAtwqDCoMKgIHU2NCB2YWx1ZTsNCj4+PiAtDQo+Pj4gLcKg wqDCoCBpZiAoa2V5X3NpemUgPT0gNCAmJiBpdGVyYXRpb25zID4gMHhmZmZmZmZmZikNCj4+PiAt wqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7DQo+Pj4gLcKgwqDCoCBpZiAobWluX2ZpbGwg Pj0gbWF4X2ZpbGwpDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAtRUlOVkFMOw0KPj4+IC0N Cj4+PiAtwqDCoMKgIHJldCA9IGNoYXNoX3RhYmxlX2FsbG9jKCZ0YWJsZSwgYml0cywga2V5X3Np emUsIHNpemVvZih1NjQpLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgR0ZQ X0tFUk5FTCk7DQo+Pj4gLcKgwqDCoCBpZiAocmV0KSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHBy X2VycigiY2hhc2hfdGFibGVfYWxsb2MgZmFpbGVkOiAlZFxuIiwgcmV0KTsNCj4+PiAtwqDCoMKg wqDCoMKgwqAgcmV0dXJuIHJldDsNCj4+PiAtwqDCoMKgIH0NCj4+PiAtDQo+Pj4gLcKgwqDCoCBm b3IgKGFkZF9jb3VudCA9IDAsIHJtdl9jb3VudCA9IDA7IGFkZF9jb3VudCA8IGl0ZXJhdGlvbnM7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgYWRkX2NvdW50KyspIHsNCj4+PiAtwqDCoMKgwqDCoMKg wqAgLyogV2hlbiB3ZSBoaXQgdGhlIG1heF9maWxsIGxldmVsLCByZW1vdmUgZW50cmllcyBkb3du DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqAgKiB0byBtaW5fZmlsbA0KPj4+IC3CoMKgwqDCoMKgwqDC oMKgICovDQo+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmIChhZGRfY291bnQgLSBybXZfY291bnQgPT0g bWF4X2ZpbGwpIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB1NjQgZmluZF9jb3VudCA9 IHJtdl9jb3VudDsNCj4+PiAtDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgLyogRmlyc3Qg dHJ5IHRvIGZpbmQgYWxsIGVudHJpZXMgdGhhdCB3ZSdyZQ0KPj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgKiBhYm91dCB0byByZW1vdmUsIGNvbmZpcm0gdGhlaXIgdmFsdWUsIHRlc3QNCj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICogd3JpdGluZyB0aGVtIGJhY2sgYSBzZWNvbmQg dGltZS4NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICovDQo+Pj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgZm9yICg7IGFkZF9jb3VudCAtIGZpbmRfY291bnQgPiBtaW5fZmlsbDsNCj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmluZF9jb3VudCsrKSB7DQo+Pj4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBjaGFzaF90YWJsZV9jb3B5X291 dCgmdGFibGUsIGZpbmRfY291bnQsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAmdmFsdWUpOw0KPj4+IC3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCA8IDApIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFzaF90YWJsZV9jb3B5X291dCBmYWls ZWQ6ICVkXG4iLA0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHJldCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIGdvdG8gb3V0Ow0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQ0K Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaWYgKHZhbHVlICE9IH5maW5kX2Nv dW50KSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2Vy cigiV3JvbmcgdmFsdWUgcmV0cmlldmVkIGZvciBrZXkgMHglbGx4LCANCj4+PiBleHBlY3RlZCAw eCVsbHggZ290IDB4JWxseFxuIiwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBmaW5kX2NvdW50LCB+ZmluZF9jb3VudCwgdmFsdWUpOw0K Pj4+IC0jaWZkZWYgQ0hBU0hfREVCVUcNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgY2hhc2hfdGFibGVfZHVtcCgmdGFibGUudGFibGUpOw0KPj4+IC0jZW5kaWYN Cj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVGQVVM VDsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gLcKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCByZXQgPSBjaGFzaF90YWJsZV9jb3B5X2luKCZ0YWJsZSwgZmlu ZF9jb3VudCwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCAmdmFsdWUpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgaWYgKHJldCAhPSAxKSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHByX2VycigiY29weV9pbiBzZWNvbmQgdGltZSByZXR1cm5lZCAlZCwgDQo+Pj4g ZXhwZWN0ZWQgMVxuIiwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXQpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXQgPSAtRUZBVUxUOw0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBnb3RvIG91dDsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIH0NCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgLyogUmVtb3ZlIHRoZW0gdW50aWwgd2UgaGl0IG1pbl9maWxsIGxldmVsICovDQo+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZm9yICg7IGFkZF9jb3VudCAtIHJtdl9jb3VudCA+ IG1pbl9maWxsOyBybXZfY291bnQrKykgew0KPj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcmV0ID0gY2hhc2hfdGFibGVfcmVtb3ZlKCZ0YWJsZSwgcm12X2NvdW50LA0KPj4+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBO VUxMKTsNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGlmIChyZXQgPCAwKSB7 DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHByX2VycigiY2hh c2hfdGFibGVfcmVtb3ZlIGZhaWxlZDogJWRcbiIsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0KTsNCj4+PiAtwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7DQo+Pj4gLcKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCB9DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfQ0KPj4+IC3C oMKgwqDCoMKgwqDCoCB9DQo+Pj4gLQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCAvKiBBZGQgYSBuZXcg dmFsdWUgKi8NCj4+PiAtwqDCoMKgwqDCoMKgwqAgdmFsdWUgPSB+YWRkX2NvdW50Ow0KPj4+IC3C oMKgwqDCoMKgwqDCoCByZXQgPSBjaGFzaF90YWJsZV9jb3B5X2luKCZ0YWJsZSwgYWRkX2NvdW50 LCAmdmFsdWUpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCBpZiAocmV0ICE9IDApIHsNCj4+PiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBwcl9lcnIoImNvcHlfaW4gZmlyc3QgdGltZSByZXR1cm5lZCAl ZCwgZXhwZWN0ZWQgMFxuIiwNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHJldCk7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gLUVGQVVMVDsNCj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBnb3RvIG91dDsNCj4+PiAtwqDCoMKgwqDCoMKgwqAg fQ0KPj4+IC3CoMKgwqAgfQ0KPj4+IC0NCj4+PiAtwqDCoMKgIGNoYXNoX3RhYmxlX2R1bXBfc3Rh dHMoJnRhYmxlKTsNCj4+PiAtwqDCoMKgIGNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKCZ0YWJsZSk7 DQo+Pj4gLQ0KPj4+IC1vdXQ6DQo+Pj4gLcKgwqDCoCBjaGFzaF90YWJsZV9mcmVlKCZ0YWJsZSk7 DQo+Pj4gLcKgwqDCoCByZXR1cm4gcmV0Ow0KPj4+IC19DQo+Pj4gLQ0KPj4+IC1zdGF0aWMgdW5z aWduZWQgaW50IGNoYXNoX3Rlc3RfYml0cyA9IDEwOw0KPj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRl c3RfYml0cywNCj4+PiAtwqDCoMKgwqDCoMKgwqDCoCAiU2VsZnRlc3QgbnVtYmVyIG9mIGhhc2gg Yml0cyAoWzQuLjIwXSwgZGVmYXVsdD0xMCkiKTsNCj4+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRl c3RfYml0cywgY2hhc2hfdGVzdF9iaXRzLCB1aW50LCAwNDQ0KTsNCj4+PiAtDQo+Pj4gLXN0YXRp YyB1bnNpZ25lZCBpbnQgY2hhc2hfdGVzdF9rZXlzaXplID0gODsNCj4+PiAtTU9EVUxFX1BBUk1f REVTQyh0ZXN0X2tleXNpemUsICJTZWxmdGVzdCBrZXlzaXplICg0IG9yIDgsIA0KPj4+IGRlZmF1 bHQ9OCkiKTsNCj4+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3Rfa2V5c2l6ZSwgY2hhc2hfdGVz dF9rZXlzaXplLCB1aW50LCAwNDQ0KTsNCj4+PiAtDQo+Pj4gLXN0YXRpYyB1bnNpZ25lZCBpbnQg Y2hhc2hfdGVzdF9taW5maWxsOw0KPj4+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfbWluZmlsbCwg IlNlbGZ0ZXN0IG1pbmltdW0gI2VudHJpZXMgDQo+Pj4gKGRlZmF1bHQ9NTAlKSIpOw0KPj4+IC1t b2R1bGVfcGFyYW1fbmFtZWQodGVzdF9taW5maWxsLCBjaGFzaF90ZXN0X21pbmZpbGwsIHVpbnQs IDA0NDQpOw0KPj4+IC0NCj4+PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X21heGZp bGw7DQo+Pj4gLU1PRFVMRV9QQVJNX0RFU0ModGVzdF9tYXhmaWxsLCAiU2VsZnRlc3QgbWF4aW11 bSAjZW50cmllcyANCj4+PiAoZGVmYXVsdD04MCUpIik7DQo+Pj4gLW1vZHVsZV9wYXJhbV9uYW1l ZCh0ZXN0X21heGZpbGwsIGNoYXNoX3Rlc3RfbWF4ZmlsbCwgdWludCwgMDQ0NCk7DQo+Pj4gLQ0K Pj4+IC1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGFzaF90ZXN0X2l0ZXJzOw0KPj4+IC1NT0RVTEVf UEFSTV9ERVNDKHRlc3RfaXRlcnMsICJTZWxmdGVzdCBpdGVyYXRpb25zIChkZWZhdWx0PTEwMDAg eCANCj4+PiAjZW50cmllcykiKTsNCj4+PiAtbW9kdWxlX3BhcmFtX25hbWVkKHRlc3RfaXRlcnMs IGNoYXNoX3Rlc3RfaXRlcnMsIHVsb25nLCAwNDQ0KTsNCj4+PiAtDQo+Pj4gLXN0YXRpYyBpbnQg X19pbml0IGNoYXNoX2luaXQodm9pZCkNCj4+PiAtew0KPj4+IC3CoMKgwqAgaW50IHJldDsNCj4+ PiAtwqDCoMKgIHU2NCB0czFfbnM7DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgLyogU2tpcCBzZWxmIHRl c3Qgb24gdXNlciBlcnJvcnMgKi8NCj4+PiAtwqDCoMKgIGlmIChjaGFzaF90ZXN0X2JpdHMgPCA0 IHx8IGNoYXNoX3Rlc3RfYml0cyA+IDIwKSB7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHByX2Vycigi Y2hhc2g6IHRlc3RfYml0cyBvdXQgb2YgcmFuZ2UgWzQuLjIwXS5cbiIpOw0KPj4+IC3CoMKgwqDC oMKgwqDCoCByZXR1cm4gMDsNCj4+PiAtwqDCoMKgIH0NCj4+PiAtwqDCoMKgIGlmIChjaGFzaF90 ZXN0X2tleXNpemUgIT0gNCAmJiBjaGFzaF90ZXN0X2tleXNpemUgIT0gOCkgew0KPj4+IC3CoMKg wqDCoMKgwqDCoCBwcl9lcnIoImNoYXNoOiB0ZXN0X2tleXNpemUgaW52YWxpZC4gTXVzdCBiZSA0 IG9yIDguXG4iKTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7DQo+Pj4gLcKgwqDCoCB9 DQo+Pj4gLQ0KPj4+IC3CoMKgwqAgaWYgKCFjaGFzaF90ZXN0X21pbmZpbGwpDQo+Pj4gLcKgwqDC oMKgwqDCoMKgIGNoYXNoX3Rlc3RfbWluZmlsbCA9ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykgLyAy Ow0KPj4+IC3CoMKgwqAgaWYgKCFjaGFzaF90ZXN0X21heGZpbGwpDQo+Pj4gLcKgwqDCoMKgwqDC oMKgIGNoYXNoX3Rlc3RfbWF4ZmlsbCA9ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykgKiA0IC8gNTsN Cj4+PiAtwqDCoMKgIGlmICghY2hhc2hfdGVzdF9pdGVycykNCj4+PiAtwqDCoMKgwqDCoMKgwqAg Y2hhc2hfdGVzdF9pdGVycyA9ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykgKiAxMDAwOw0KPj4+IC0N Cj4+PiAtwqDCoMKgIGlmIChjaGFzaF90ZXN0X21pbmZpbGwgPj0gKDEgPDwgY2hhc2hfdGVzdF9i aXRzKSkgew0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9lcnIoImNoYXNoOiB0ZXN0X21pbmZpbGwg dG9vIGJpZy4gTXVzdCBiZSA8IHRhYmxlIA0KPj4+IHNpemUuXG4iKTsNCj4+PiAtwqDCoMKgwqDC oMKgwqAgcmV0dXJuIDA7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLcKgwqDCoCBpZiAoY2hhc2hfdGVz dF9tYXhmaWxsID49ICgxIDw8IGNoYXNoX3Rlc3RfYml0cykpIHsNCj4+PiAtwqDCoMKgwqDCoMKg wqAgcHJfZXJyKCJjaGFzaDogdGVzdF9tYXhmaWxsIHRvbyBiaWcuIE11c3QgYmUgPCB0YWJsZSAN Cj4+PiBzaXplLlxuIik7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAwOw0KPj4+IC3CoMKg wqAgfQ0KPj4+IC3CoMKgwqAgaWYgKGNoYXNoX3Rlc3RfbWluZmlsbCA+PSBjaGFzaF90ZXN0X21h eGZpbGwpIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFzaDogdGVzdF9taW5maWxs IG11c3QgYmUgPCB0ZXN0X21heGZpbGwuXG4iKTsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcmV0dXJu IDA7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLcKgwqDCoCBpZiAoY2hhc2hfdGVzdF9rZXlzaXplID09 IDQgJiYgY2hhc2hfdGVzdF9pdGVycyA+IDB4ZmZmZmZmZmYpIHsNCj4+PiAtwqDCoMKgwqDCoMKg wqAgcHJfZXJyKCJjaGFzaDogdGVzdF9pdGVycyBtdXN0IGJlIDwgNEcgZm9yIDQgYnl0ZSBrZXlz LlxuIik7DQo+Pj4gLcKgwqDCoMKgwqDCoMKgIHJldHVybiAwOw0KPj4+IC3CoMKgwqAgfQ0KPj4+ IC0NCj4+PiAtwqDCoMKgIHRzMV9ucyA9IGxvY2FsX2Nsb2NrKCk7DQo+Pj4gLcKgwqDCoCByZXQg PSBjaGFzaF9zZWxmX3Rlc3QoY2hhc2hfdGVzdF9iaXRzLCBjaGFzaF90ZXN0X2tleXNpemUsDQo+ Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgY2hhc2hfdGVzdF9taW5maWxs LCBjaGFzaF90ZXN0X21heGZpbGwsDQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgY2hhc2hfdGVzdF9pdGVycyk7DQo+Pj4gLcKgwqDCoCBpZiAoIXJldCkgew0KPj4+IC3C oMKgwqDCoMKgwqDCoCB1NjQgdHNfZGVsdGFfdXMgPSBsb2NhbF9jbG9jaygpIC0gdHMxX25zOw0K Pj4+IC3CoMKgwqDCoMKgwqDCoCB1NjQgaXRlcnNfcGVyX3NlY29uZCA9ICh1NjQpY2hhc2hfdGVz dF9pdGVycyAqIDEwMDAwMDA7DQo+Pj4gLQ0KPj4+IC3CoMKgwqDCoMKgwqDCoCBkb19kaXYodHNf ZGVsdGFfdXMsIDEwMDApOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCBkb19kaXYoaXRlcnNfcGVyX3Nl Y29uZCwgdHNfZGVsdGFfdXMpOw0KPj4+IC3CoMKgwqDCoMKgwqDCoCBwcl9pbmZvKCJjaGFzaDog c2VsZiB0ZXN0IHRvb2sgJWxsdSB1cywgJWxsdSBpdGVyYXRpb25zL3NcbiIsDQo+Pj4gLcKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgdHNfZGVsdGFfdXMsIGl0ZXJzX3Blcl9zZWNvbmQpOw0KPj4+IC3C oMKgwqAgfSBlbHNlIHsNCj4+PiAtwqDCoMKgwqDCoMKgwqAgcHJfZXJyKCJjaGFzaDogc2VsZiB0 ZXN0IGZhaWxlZDogJWRcbiIsIHJldCk7DQo+Pj4gLcKgwqDCoCB9DQo+Pj4gLQ0KPj4+IC3CoMKg wqAgcmV0dXJuIHJldDsNCj4+PiAtfQ0KPj4+IC0NCj4+PiAtbW9kdWxlX2luaXQoY2hhc2hfaW5p dCk7DQo+Pj4gLQ0KPj4+IC0jZW5kaWYgLyogQ09ORklHX0NIQVNIX1NFTEZURVNUICovDQo+Pj4g LQ0KPj4+IC1NT0RVTEVfREVTQ1JJUFRJT04oIkNsb3NlZCBoYXNoIHRhYmxlIik7DQo+Pj4gLU1P RFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7DQo+DQpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphbWQtZ2Z4IG1haWxpbmcgbGlz dAphbWQtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9w Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2FtZC1nZngK