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: Thu, 31 Jan 2019 21:38:50 +0000 Message-ID: <39534cbd-d199-8a3d-2a8b-51f9d09e06e0@amd.com> References: <20190124125256.9900-1-christian.koenig@amd.com> <20190124125256.9900-2-christian.koenig@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190124125256.9900-2-christian.koenig-5C7GfCeVMHo@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: =?utf-8?B?Q2hyaXN0aWFuIEvDtm5pZw==?= , "amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org" Cc: "Yang, Philip" SSBkb24ndCBzZWUgaG93IHRoaXMgc29sdmVzIGFueXRoaW5nLiBZb3UnbGwgc3RpbGwgbmVlZCB0 byByZW1vdmUgDQplbnRyaWVzIGZyb20gdGhpcyBmYXVsdCByaW5nIGJ1ZmZlci4gT3RoZXJ3aXNl IHlvdSdsbCBpZ25vcmUgZmF1bHRzIGZvciANCmFkZHJlc3NlcyB0aGF0IGhhdmUgZmF1bHRlZCBy ZWNlbnRseSwgYWx0aG91Z2ggaXQgbWF5IGJlIGEgbmV3IGZhdWx0Lg0KDQpBbHNvLCB0aGlzIHJl aW50cm9kdWNlcyBpbnRlcnJ1cHQgc3Rvcm1zIGFuZCByZXBlYXRlZCBwcm9jZXNzaW5nIG9mIHRo ZSANCnNhbWUgZmF1bHQgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBtb3JlIHRoYW4gNjQgZGlzdGlu Y3QgYWRkcmVzc2VzIA0KZmF1bHRpbmcgYXQgb25jZS4NCg0KSSB0aGluayB0aGUgc29sdXRpb24g c2hvdWxkIGJlIGRpZmZlcmVudC4gV2UgZG8gbmVlZCBhIHdheSB0byBpZ25vcmUgDQpkdXBsaWNh dGUgZmF1bHRzIGZvciB0aGUgc2FtZSBhZGRyZXNzLiBUaGUgcHJvYmxlbSB5b3UgcmFuIGludG8g d2FzIHRoYXQgDQphZnRlciBjbGVhcmluZyBhbiBlbnRyeSwgeW91IGdldCBhZGRpdGlvbmFsIGlu dGVycnVwdHMgZm9yIHRoZSBzYW1lIA0KYWRkcmVzcy4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJ5 IGtlZXBpbmcgdHJhY2sgb2YgdGhlIGFnZSBvZiBJSCByaW5nIA0KZW50cmllcy4gQWZ0ZXIgd2Ug dXBkYXRlIHRoZSBwYWdlIHRhYmxlIGFuZCBmbHVzaCBUTEJzLCB0aGVyZSBtYXkgc3RpbGwgDQpi ZSBzdGFsZSBlbnRyaWVzIGluIHRoZSBJSCByaW5nLiBCdXQgbm8gbmV3IGludGVycnVwdHMgc2hv dWxkIGJlIA0KZ2VuZXJhdGVkICh1bnRpbCB0aGF0IFBURSBpcyBpbnZhbGlkYXRlZCBhZ2Fpbiku IFNvIHdlIGNhbiBjaGVjayB0aGUgDQpjdXJyZW50IElIIHdwdHIuIFdoZW4gSUggcHJvY2Vzc2lu ZyAocnB0cikgaGFzIGNhdWdodCB1cCB0byB0aGF0IHZhbHVlLCANCmFsbCB0aGUgc3RhbGUgcmV0 cnkgaW50ZXJydXB0cyBoYXZlIGJlZW4gZmx1c2hlZCwgYW5kIHdlIGNhbiByZW1vdmUgdGhlIA0K ZW50cnkgZnJvbSB0aGUgaGFzaCB0YWJsZSAob3IgcmluZyBidWZmZXIpLiBBbnkgc3Vic2VxdWVu dCBpbnRlcnJ1cHRzIA0KZm9yIHRoZSBzYW1lIGFkZHJlc3MgYXJlIG5ldyBhbmQgc2hvdWxkIGJl IGhhbmRsZWQgYWdhaW4uDQoNClJlZ2FyZHMsDQogwqAgRmVsaXgNCg0KT24gMjAxOS0wMS0yNCA3 OjUyIGEubS4sIENocmlzdGlhbiBLw7ZuaWcgd3JvdGU6DQo+IEZ1cnRoZXIgdGVzdGluZyBzaG93 ZWQgdGhhdCB0aGUgaWRlYSB3aXRoIHRoZSBjaGFzaCBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQu DQo+IEVzcGVjaWFsbHkgd2UgY2FuJ3QgcHJlZGljdCB3aGVuIHdlIGNhbiByZW1vdmUgdGhlIGVu dHJpZXMgZnJvbSB0aGUgaGFzaCBhZ2Fpbi4NCj4NCj4gU28gcmVwbGFjZSB0aGUgY2hhc2ggd2l0 aCBhIHNpbXBsZSByaW5nIGJ1ZmZlciBmb3Igbm93IHRvIGZpbHRlciBvdXQgdGhlDQo+IGFscmVh ZHkgaGFuZGxlZCBmYXVsdHMuIEFzIGxvbmcgYXMgd2Ugc2VlIGxlc3MgdGhhbiA2NCBkaXN0aW5j dCBhZGRyZXNzZXMgd2UNCj4gc3RpbGwgcmVwb3J0IHRoZW0gb25seSBvbmNlIHRvIHRoZSBmb2xs b3dpbmcgaGFuZGxpbmcuDQo+DQo+IFNpZ25lZC1vZmYtYnk6IENocmlzdGlhbiBLw7ZuaWcgPGNo cmlzdGlhbi5rb2VuaWdAYW1kLmNvbT4NCj4gLS0tDQo+ICAgZHJpdmVycy9ncHUvZHJtL0tjb25m aWcgICAgICAgICAgICAgICAgICAgfCAgIDIgLQ0KPiAgIGRyaXZlcnMvZ3B1L2RybS9NYWtlZmls ZSAgICAgICAgICAgICAgICAgIHwgICAxIC0NCj4gICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfZ21jLmggICB8ICAgOCArDQo+ICAgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv YW1kZ3B1X3ZtLmMgICAgfCAxMDUgLS0tLQ0KPiAgIGRyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1 L2FtZGdwdV92bS5oICAgIHwgIDE0IC0NCj4gICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9n bWNfdjlfMC5jICAgICB8ICA0MCArLQ0KPiAgIGRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9s aW51eC9jaGFzaC5oIHwgMzY2IC0tLS0tLS0tLS0tLS0NCj4gICBkcml2ZXJzL2dwdS9kcm0vYW1k L2xpYi9LY29uZmlnICAgICAgICAgICB8ICAyOCAtDQo+ICAgZHJpdmVycy9ncHUvZHJtL2FtZC9s aWIvTWFrZWZpbGUgICAgICAgICAgfCAgMzIgLS0NCj4gICBkcml2ZXJzL2dwdS9kcm0vYW1kL2xp Yi9jaGFzaC5jICAgICAgICAgICB8IDYzOCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ICAgMTAg ZmlsZXMgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygrKSwgMTIxOCBkZWxldGlvbnMoLSkNCj4gICBk ZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2xpbnV4L2NoYXNo LmgNCj4gICBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZp Zw0KPiAgIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9NYWtlZmls ZQ0KPiAgIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9jaGFzaC5j DQo+DQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1 L2RybS9LY29uZmlnDQo+IGluZGV4IDQzODVmMDBlMWQwNS4uOThiMDMzZTY3NWRiIDEwMDY0NA0K PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZw0KPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v S2NvbmZpZw0KPiBAQCAtMjI5LDggKzIyOSw2IEBAIGNvbmZpZyBEUk1fQU1ER1BVDQo+ICAgDQo+ ICAgc291cmNlICJkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9LY29uZmlnIg0KPiAgIA0KPiAt c291cmNlICJkcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9LY29uZmlnIg0KPiAtDQo+ICAgc291cmNl ICJkcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9LY29uZmlnIg0KPiAgIA0KPiAgIHNvdXJjZSAiZHJp dmVycy9ncHUvZHJtL2k5MTUvS2NvbmZpZyINCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQ0KPiBpbmRleCA3ZjNiZTM1MDYw NTcuLmFjNjIxMzU3NTY5MSAxMDA2NDQNCj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxl DQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQ0KPiBAQCAtNTYsNyArNTYsNiBAQCBv YmotJChDT05GSUdfRFJNX1RUTSkJKz0gdHRtLw0KPiAgIG9iai0kKENPTkZJR19EUk1fU0NIRUQp CSs9IHNjaGVkdWxlci8NCj4gICBvYmotJChDT05GSUdfRFJNX1RERlgpCSs9IHRkZngvDQo+ICAg b2JqLSQoQ09ORklHX0RSTV9SMTI4KQkrPSByMTI4Lw0KPiAtb2JqLXkJCQkrPSBhbWQvbGliLw0K PiAgIG9iai0kKENPTkZJR19IU0FfQU1EKSArPSBhbWQvYW1ka2ZkLw0KPiAgIG9iai0kKENPTkZJ R19EUk1fUkFERU9OKSs9IHJhZGVvbi8NCj4gICBvYmotJChDT05GSUdfRFJNX0FNREdQVSkrPSBh bWQvYW1kZ3B1Lw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1k Z3B1X2dtYy5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X2dtYy5oDQo+IGlu ZGV4IDgxZTYwNzBkMjU1Yi4uODNjNDE1ZWI0MGY0IDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZ21jLmgNCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9hbWRncHUvYW1kZ3B1X2dtYy5oDQo+IEBAIC00Myw2ICs0MywxMSBAQA0KPiAgICAqLw0KPiAg ICNkZWZpbmUgQU1ER1BVX0dNQ19IT0xFX01BU0sJMHgwMDAwZmZmZmZmZmZmZmZmVUxMDQo+ICAg DQo+ICsvKg0KPiArICogTnVtYmVyIG9mIGVudHJpZXMgZm9yIHRoZSBsb2cgb2YgcmVjZW50IFZN IGZhdWx0cw0KPiArICovDQo+ICsjZGVmaW5lIEFNREdQVV9HTUNfTlVNX1ZNX0ZBVUxUUwk2NA0K PiArDQo+ICAgc3RydWN0IGZpcm13YXJlOw0KPiAgIA0KPiAgIC8qDQo+IEBAIC0xNDcsNiArMTUy LDkgQEAgc3RydWN0IGFtZGdwdV9nbWMgew0KPiAgIAlzdHJ1Y3Qga2ZkX3ZtX2ZhdWx0X2luZm8g KnZtX2ZhdWx0X2luZm87DQo+ICAgCWF0b21pY190CQl2bV9mYXVsdF9pbmZvX3VwZGF0ZWQ7DQo+ ICAgDQo+ICsJdWludDY0X3QJCXZtX2ZhdWx0c1tBTURHUFVfR01DX05VTV9WTV9GQVVMVFNdOw0K PiArCWludAkJCXZtX2ZhdWx0X2lkeDsNCj4gKw0KPiAgIAljb25zdCBzdHJ1Y3QgYW1kZ3B1X2dt Y19mdW5jcwkqZ21jX2Z1bmNzOw0KPiAgIA0KPiAgIAlzdHJ1Y3QgYW1kZ3B1X3hnbWkgeGdtaTsN Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92bS5jIGIv ZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmMNCj4gaW5kZXggMGJjNmY1NTNk YzA4Li4zMDQxZDcyYzU0NzggMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1k Z3B1L2FtZGdwdV92bS5jDQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdw dV92bS5jDQo+IEBAIC0yOTcyLDIyICsyOTcyLDYgQEAgdm9pZCBhbWRncHVfdm1fYWRqdXN0X3Np emUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHVpbnQzMl90IG1pbl92bV9zaXplLA0KPiAg IAkJIGFkZXYtPnZtX21hbmFnZXIuZnJhZ21lbnRfc2l6ZSk7DQo+ICAgfQ0KPiAgIA0KPiAtc3Rh dGljIHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmluaXRfZmF1bHRfaGFzaCh2 b2lkKQ0KPiAtew0KPiAtCXN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFibGUgKmZhdWx0 X2hhc2g7DQo+IC0NCj4gLQlmYXVsdF9oYXNoID0ga21hbGxvYyhzaXplb2YoKmZhdWx0X2hhc2gp LCBHRlBfS0VSTkVMKTsNCj4gLQlpZiAoIWZhdWx0X2hhc2gpDQo+IC0JCXJldHVybiBmYXVsdF9o YXNoOw0KPiAtDQo+IC0JSU5JVF9DSEFTSF9UQUJMRShmYXVsdF9oYXNoLT5oYXNoLA0KPiAtCQkJ QU1ER1BVX1BBR0VGQVVMVF9IQVNIX0JJVFMsIDgsIDApOw0KPiAtCXNwaW5fbG9ja19pbml0KCZm YXVsdF9oYXNoLT5sb2NrKTsNCj4gLQlmYXVsdF9oYXNoLT5jb3VudCA9IDA7DQo+IC0NCj4gLQly ZXR1cm4gZmF1bHRfaGFzaDsNCj4gLX0NCj4gLQ0KPiAgIC8qKg0KPiAgICAqIGFtZGdwdV92bV9p bml0IC0gaW5pdGlhbGl6ZSBhIHZtIGluc3RhbmNlDQo+ICAgICoNCj4gQEAgLTMwODAsMTIgKzMw NjQsNiBAQCBpbnQgYW1kZ3B1X3ZtX2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHN0 cnVjdCBhbWRncHVfdm0gKnZtLA0KPiAgIAkJdm0tPnBhc2lkID0gcGFzaWQ7DQo+ICAgCX0NCj4g ICANCj4gLQl2bS0+ZmF1bHRfaGFzaCA9IGluaXRfZmF1bHRfaGFzaCgpOw0KPiAtCWlmICghdm0t PmZhdWx0X2hhc2gpIHsNCj4gLQkJciA9IC1FTk9NRU07DQo+IC0JCWdvdG8gZXJyb3JfZnJlZV9y b290Ow0KPiAtCX0NCj4gLQ0KPiAgIAlJTklUX0tGSUZPKHZtLT5mYXVsdHMpOw0KPiAgIA0KPiAg IAlyZXR1cm4gMDsNCj4gQEAgLTMyNDEsMTUgKzMyMTksMTAgQEAgdm9pZCBhbWRncHVfdm1fZmlu aShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgc3RydWN0IGFtZGdwdV92bSAqdm0pDQo+ICAg CXN0cnVjdCBhbWRncHVfYm9fdmFfbWFwcGluZyAqbWFwcGluZywgKnRtcDsNCj4gICAJYm9vbCBw cnRfZmluaV9uZWVkZWQgPSAhIWFkZXYtPmdtYy5nbWNfZnVuY3MtPnNldF9wcnQ7DQo+ICAgCXN0 cnVjdCBhbWRncHVfYm8gKnJvb3Q7DQo+IC0JdTY0IGZhdWx0Ow0KPiAgIAlpbnQgaSwgcjsNCj4g ICANCj4gICAJYW1kZ3B1X2FtZGtmZF9ncHV2bV9kZXN0cm95X2NiKGFkZXYsIHZtKTsNCj4gICAN Cj4gLQkvKiBDbGVhciBwZW5kaW5nIHBhZ2UgZmF1bHRzIGZyb20gSUggd2hlbiB0aGUgVk0gaXMg ZGVzdHJveWVkICovDQo+IC0Jd2hpbGUgKGtmaWZvX2dldCgmdm0tPmZhdWx0cywgJmZhdWx0KSkN Cj4gLQkJYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHZtLT5mYXVsdF9oYXNoLCBmYXVsdCk7DQo+IC0N Cj4gICAJaWYgKHZtLT5wYXNpZCkgew0KPiAgIAkJdW5zaWduZWQgbG9uZyBmbGFnczsNCj4gICAN Cj4gQEAgLTMyNTgsOSArMzIzMSw2IEBAIHZvaWQgYW1kZ3B1X3ZtX2Zpbmkoc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYsIHN0cnVjdCBhbWRncHVfdm0gKnZtKQ0KPiAgIAkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmYWRldi0+dm1fbWFuYWdlci5wYXNpZF9sb2NrLCBmbGFncyk7DQo+ICAgCX0N Cj4gICANCj4gLQlrZnJlZSh2bS0+ZmF1bHRfaGFzaCk7DQo+IC0Jdm0tPmZhdWx0X2hhc2ggPSBO VUxMOw0KPiAtDQo+ICAgCWRybV9zY2hlZF9lbnRpdHlfZGVzdHJveSgmdm0tPmVudGl0eSk7DQo+ ICAgDQo+ICAgCWlmICghUkJfRU1QVFlfUk9PVCgmdm0tPnZhLnJiX3Jvb3QpKSB7DQo+IEBAIC0z NDI2LDc4ICszMzk2LDMgQEAgdm9pZCBhbWRncHVfdm1fc2V0X3Rhc2tfaW5mbyhzdHJ1Y3QgYW1k Z3B1X3ZtICp2bSkNCj4gICAJCX0NCj4gICAJfQ0KPiAgIH0NCj4gLQ0KPiAtLyoqDQo+IC0gKiBh bWRncHVfdm1fYWRkX2ZhdWx0IC0gQWRkIGEgcGFnZSBmYXVsdCByZWNvcmQgdG8gZmF1bHQgaGFz aCB0YWJsZQ0KPiAtICoNCj4gLSAqIEBmYXVsdF9oYXNoOiBmYXVsdCBoYXNoIHRhYmxlDQo+IC0g KiBAa2V5OiA2NC1iaXQgZW5jb2Rpbmcgb2YgUEFTSUQgYW5kIGFkZHJlc3MNCj4gLSAqDQo+IC0g KiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHJldHJ5IHBhZ2UgZmF1bHQgaW50ZXJydXB0 IGlzDQo+IC0gKiByZWNlaXZlZC4gSWYgdGhpcyBpcyBhIG5ldyBwYWdlIGZhdWx0LCBpdCB3aWxs IGJlIGFkZGVkIHRvIGEgaGFzaA0KPiAtICogdGFibGUuIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNh dGVzIHdoZXRoZXIgdGhpcyBpcyBhIG5ldyBmYXVsdCwgb3INCj4gLSAqIGEgZmF1bHQgdGhhdCB3 YXMgYWxyZWFkeSBrbm93biBhbmQgaXMgYWxyZWFkeSBiZWluZyBoYW5kbGVkLg0KPiAtICoNCj4g LSAqIElmIHRoZXJlIGFyZSB0b28gbWFueSBwZW5kaW5nIHBhZ2UgZmF1bHRzLCB0aGlzIHdpbGwg ZmFpbC4gUmV0cnkNCj4gLSAqIGludGVycnVwdHMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhpcyBj YXNlIHVudGlsIHRoZXJlIGlzIGVub3VnaA0KPiAtICogZnJlZSBzcGFjZS4NCj4gLSAqDQo+IC0g KiBSZXR1cm5zIDAgaWYgdGhlIGZhdWx0IHdhcyBhZGRlZCwgMSBpZiB0aGUgZmF1bHQgd2FzIGFs cmVhZHkga25vd24sDQo+IC0gKiAtRU5PU1BDIGlmIHRoZXJlIGFyZSB0b28gbWFueSBwZW5kaW5n IGZhdWx0cy4NCj4gLSAqLw0KPiAtaW50IGFtZGdwdV92bV9hZGRfZmF1bHQoc3RydWN0IGFtZGdw dV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRfaGFzaCwgdTY0IGtleSkNCj4gLXsNCj4gLQl1 bnNpZ25lZCBsb25nIGZsYWdzOw0KPiAtCWludCByID0gLUVOT1NQQzsNCj4gLQ0KPiAtCWlmIChX QVJOX09OX09OQ0UoIWZhdWx0X2hhc2gpKQ0KPiAtCQkvKiBTaG91bGQgYmUgYWxsb2NhdGVkIGlu IGFtZGdwdV92bV9pbml0DQo+IC0JCSAqLw0KPiAtCQlyZXR1cm4gcjsNCj4gLQ0KPiAtCXNwaW5f bG9ja19pcnFzYXZlKCZmYXVsdF9oYXNoLT5sb2NrLCBmbGFncyk7DQo+IC0NCj4gLQkvKiBPbmx5 IGxldCB0aGUgaGFzaCB0YWJsZSBmaWxsIHVwIHRvIDUwJSBmb3IgYmVzdCBwZXJmb3JtYW5jZSAq Lw0KPiAtCWlmIChmYXVsdF9oYXNoLT5jb3VudCA+PSAoMSA8PCAoQU1ER1BVX1BBR0VGQVVMVF9I QVNIX0JJVFMtMSkpKQ0KPiAtCQlnb3RvIHVubG9ja19vdXQ7DQo+IC0NCj4gLQlyID0gY2hhc2hf dGFibGVfY29weV9pbigmZmF1bHRfaGFzaC0+aGFzaCwga2V5LCBOVUxMKTsNCj4gLQlpZiAoIXIp DQo+IC0JCWZhdWx0X2hhc2gtPmNvdW50Kys7DQo+IC0NCj4gLQkvKiBjaGFzaF90YWJsZV9jb3B5 X2luIHNob3VsZCBuZXZlciBmYWlsIHVubGVzcyB3ZSdyZSBsb3NpbmcgY291bnQgKi8NCj4gLQlX QVJOX09OX09OQ0UociA8IDApOw0KPiAtDQo+IC11bmxvY2tfb3V0Og0KPiAtCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmZhdWx0X2hhc2gtPmxvY2ssIGZsYWdzKTsNCj4gLQlyZXR1cm4gcjsNCj4g LX0NCj4gLQ0KPiAtLyoqDQo+IC0gKiBhbWRncHVfdm1fY2xlYXJfZmF1bHQgLSBSZW1vdmUgYSBw YWdlIGZhdWx0IHJlY29yZA0KPiAtICoNCj4gLSAqIEBmYXVsdF9oYXNoOiBmYXVsdCBoYXNoIHRh YmxlDQo+IC0gKiBAa2V5OiA2NC1iaXQgZW5jb2Rpbmcgb2YgUEFTSUQgYW5kIGFkZHJlc3MNCj4g LSAqDQo+IC0gKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiBhIHBhZ2UgZmF1bHQgaGFzIGJl ZW4gaGFuZGxlZC4gQW55DQo+IC0gKiBmdXR1cmUgaW50ZXJydXB0IHdpdGggdGhpcyBrZXkgd2ls bCBiZSBwcm9jZXNzZWQgYXMgYSBuZXcNCj4gLSAqIHBhZ2UgZmF1bHQuDQo+IC0gKi8NCj4gLXZv aWQgYW1kZ3B1X3ZtX2NsZWFyX2ZhdWx0KHN0cnVjdCBhbWRncHVfcmV0cnlmYXVsdF9oYXNodGFi bGUgKmZhdWx0X2hhc2gsIHU2NCBrZXkpDQo+IC17DQo+IC0JdW5zaWduZWQgbG9uZyBmbGFnczsN Cj4gLQlpbnQgcjsNCj4gLQ0KPiAtCWlmICghZmF1bHRfaGFzaCkNCj4gLQkJcmV0dXJuOw0KPiAt DQo+IC0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZhdWx0X2hhc2gtPmxvY2ssIGZsYWdzKTsNCj4gLQ0K PiAtCXIgPSBjaGFzaF90YWJsZV9yZW1vdmUoJmZhdWx0X2hhc2gtPmhhc2gsIGtleSwgTlVMTCk7 DQo+IC0JaWYgKCFXQVJOX09OX09OQ0UociA8IDApKSB7DQo+IC0JCWZhdWx0X2hhc2gtPmNvdW50 LS07DQo+IC0JCVdBUk5fT05fT05DRShmYXVsdF9oYXNoLT5jb3VudCA8IDApOw0KPiAtCX0NCj4g LQ0KPiAtCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZhdWx0X2hhc2gtPmxvY2ssIGZsYWdzKTsN Cj4gLX0NCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV92 bS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3ZtLmgNCj4gaW5kZXggODFm ZjgxNzdmMDkyLi43YzQ5MjM1YjYwNjQgMTAwNjQ0DQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L2FtZGdwdV92bS5oDQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1 L2FtZGdwdV92bS5oDQo+IEBAIC0zMCw3ICszMCw2IEBADQo+ICAgI2luY2x1ZGUgPGRybS9ncHVf c2NoZWR1bGVyLmg+DQo+ICAgI2luY2x1ZGUgPGRybS9kcm1fZmlsZS5oPg0KPiAgICNpbmNsdWRl IDxkcm0vdHRtL3R0bV9ib19kcml2ZXIuaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9jaGFzaC5oPg0K PiAgIA0KPiAgICNpbmNsdWRlICJhbWRncHVfc3luYy5oIg0KPiAgICNpbmNsdWRlICJhbWRncHVf cmluZy5oIg0KPiBAQCAtMTc5LDEzICsxNzgsNiBAQCBzdHJ1Y3QgYW1kZ3B1X3Rhc2tfaW5mbyB7 DQo+ICAgCXBpZF90CXRnaWQ7DQo+ICAgfTsNCj4gICANCj4gLSNkZWZpbmUgQU1ER1BVX1BBR0VG QVVMVF9IQVNIX0JJVFMgOA0KPiAtc3RydWN0IGFtZGdwdV9yZXRyeWZhdWx0X2hhc2h0YWJsZSB7 DQo+IC0JREVDTEFSRV9DSEFTSF9UQUJMRShoYXNoLCBBTURHUFVfUEFHRUZBVUxUX0hBU0hfQklU UywgOCwgMCk7DQo+IC0Jc3BpbmxvY2tfdAlsb2NrOw0KPiAtCWludAkJY291bnQ7DQo+IC19Ow0K PiAtDQo+ICAgc3RydWN0IGFtZGdwdV92bSB7DQo+ICAgCS8qIHRyZWUgb2YgdmlydHVhbCBhZGRy ZXNzZXMgbWFwcGVkICovDQo+ICAgCXN0cnVjdCByYl9yb290X2NhY2hlZAl2YTsNCj4gQEAgLTI0 NSw3ICsyMzcsNiBAQCBzdHJ1Y3QgYW1kZ3B1X3ZtIHsNCj4gICAJc3RydWN0IHR0bV9scnVfYnVs a19tb3ZlIGxydV9idWxrX21vdmU7DQo+ICAgCS8qIG1hcmsgd2hldGhlciBjYW4gZG8gdGhlIGJ1 bGsgbW92ZSAqLw0KPiAgIAlib29sCQkJYnVsa19tb3ZlYWJsZTsNCj4gLQlzdHJ1Y3QgYW1kZ3B1 X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVsdF9oYXNoOw0KPiAgIH07DQo+ICAgDQo+ICAgc3Ry dWN0IGFtZGdwdV92bV9tYW5hZ2VyIHsNCj4gQEAgLTM1OCwxMSArMzQ5LDYgQEAgdm9pZCBhbWRn cHVfdm1fc2V0X3Rhc2tfaW5mbyhzdHJ1Y3QgYW1kZ3B1X3ZtICp2bSk7DQo+ICAgDQo+ICAgdm9p ZCBhbWRncHVfdm1fbW92ZV90b19scnVfdGFpbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwN Cj4gICAJCQkJc3RydWN0IGFtZGdwdV92bSAqdm0pOw0KPiAtDQo+IC1pbnQgYW1kZ3B1X3ZtX2Fk ZF9mYXVsdChzdHJ1Y3QgYW1kZ3B1X3JldHJ5ZmF1bHRfaGFzaHRhYmxlICpmYXVsdF9oYXNoLCB1 NjQga2V5KTsNCj4gLQ0KPiAtdm9pZCBhbWRncHVfdm1fY2xlYXJfZmF1bHQoc3RydWN0IGFtZGdw dV9yZXRyeWZhdWx0X2hhc2h0YWJsZSAqZmF1bHRfaGFzaCwgdTY0IGtleSk7DQo+IC0NCj4gICB2 b2lkIGFtZGdwdV92bV9kZWxfZnJvbV9scnVfbm90aWZ5KHN0cnVjdCB0dG1fYnVmZmVyX29iamVj dCAqYm8pOw0KPiAgIA0KPiAgICNlbmRpZg0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2FtZC9hbWRncHUvZ21jX3Y5XzAuYyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192 OV8wLmMNCj4gaW5kZXggOWMwODJmOWFlYTFhLi45NjRlNzg5OTA4ZDUgMTAwNjQ0DQo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192OV8wLmMNCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y5XzAuYw0KPiBAQCAtMjU1LDQ4ICsyNTUsMjQgQEAgc3Rh dGljIGJvb2wgZ21jX3Y5XzBfcHJlc2NyZWVuX2l2KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 LA0KPiAgIAkJCQkgIHN0cnVjdCBhbWRncHVfaXZfZW50cnkgKmVudHJ5LA0KPiAgIAkJCQkgIHVp bnQ2NF90IGFkZHIpDQo+ICAgew0KPiAtCXN0cnVjdCBhbWRncHVfdm0gKnZtOw0KPiArCXVuc2ln bmVkIGk7DQo+ICAgCXU2NCBrZXk7DQo+IC0JaW50IHI7DQo+ICAgDQo+ICAgCS8qIE5vIFBBU0lE LCBjYW4ndCBpZGVudGlmeSBmYXVsdGluZyBwcm9jZXNzICovDQo+ICAgCWlmICghZW50cnktPnBh c2lkKQ0KPiAgIAkJcmV0dXJuIHRydWU7DQo+ICAgDQo+IC0JLyogTm90IGEgcmV0cnkgZmF1bHQg Ki8NCj4gLQlpZiAoIShlbnRyeS0+c3JjX2RhdGFbMV0gJiAweDgwKSkNCj4gLQkJcmV0dXJuIHRy dWU7DQo+IC0NCj4gLQkvKiBUcmFjayByZXRyeSBmYXVsdHMgaW4gcGVyLVZNIGZhdWx0IEZJRk8u ICovDQo+IC0Jc3Bpbl9sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOw0KPiAtCXZt ID0gaWRyX2ZpbmQoJmFkZXYtPnZtX21hbmFnZXIucGFzaWRfaWRyLCBlbnRyeS0+cGFzaWQpOw0K PiAtCWlmICghdm0pIHsNCj4gLQkJLyogVk0gbm90IGZvdW5kLCBwcm9jZXNzIGl0IG5vcm1hbGx5 ICovDQo+IC0JCXNwaW5fdW5sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOw0KPiAt CQlyZXR1cm4gdHJ1ZTsNCj4gLQl9DQo+IC0NCj4gICAJa2V5ID0gQU1ER1BVX1ZNX0ZBVUxUKGVu dHJ5LT5wYXNpZCwgYWRkcik7DQo+IC0JciA9IGFtZGdwdV92bV9hZGRfZmF1bHQodm0tPmZhdWx0 X2hhc2gsIGtleSk7DQo+ICAgDQo+IC0JLyogSGFzaCB0YWJsZSBpcyBmdWxsIG9yIHRoZSBmYXVs dCBpcyBhbHJlYWR5IGJlaW5nIHByb2Nlc3NlZCwNCj4gLQkgKiBpZ25vcmUgZnVydGhlciBwYWdl IGZhdWx0cw0KPiAtCSAqLw0KPiAtCWlmIChyICE9IDApIHsNCj4gLQkJc3Bpbl91bmxvY2soJmFk ZXYtPnZtX21hbmFnZXIucGFzaWRfbG9jayk7DQo+IC0JCXJldHVybiBmYWxzZTsNCj4gLQl9DQo+ IC0JLyogTm8gbG9ja2luZyByZXF1aXJlZCB3aXRoIHNpbmdsZSB3cml0ZXIgYW5kIHNpbmdsZSBy ZWFkZXIgKi8NCj4gLQlyID0ga2ZpZm9fcHV0KCZ2bS0+ZmF1bHRzLCBrZXkpOw0KPiAtCWlmICgh cikgew0KPiAtCQkvKiBGSUZPIGlzIGZ1bGwuIElnbm9yZSBpdCB1bnRpbCB0aGVyZSBpcyBzcGFj ZSAqLw0KPiAtCQlhbWRncHVfdm1fY2xlYXJfZmF1bHQodm0tPmZhdWx0X2hhc2gsIGtleSk7DQo+ IC0JCXNwaW5fdW5sb2NrKCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOw0KPiAtCQlyZXR1 cm4gZmFsc2U7DQo+ICsJLyogVHJhY2sgdGhlIGxhc3QgTiBmYXVsdHMgYW5kIGRvbid0IHJlcG9y dCB0aGVtIGFnYWluIG9uIHJldHJ5ICovDQo+ICsJZm9yIChpID0gMDsgaSA8IEFNREdQVV9HTUNf TlVNX1ZNX0ZBVUxUUzsgKytpKSB7DQo+ICsJCWlmIChhZGV2LT5nbWMudm1fZmF1bHRzW2ldID09 IGtleSkNCj4gKwkJCXJldHVybiBmYWxzZTsNCj4gICAJfQ0KPiAgIA0KPiAtCXNwaW5fdW5sb2Nr KCZhZGV2LT52bV9tYW5hZ2VyLnBhc2lkX2xvY2spOw0KPiAgIAkvKiBJdCdzIHRoZSBmaXJzdCBm YXVsdCBmb3IgdGhpcyBhZGRyZXNzLCBwcm9jZXNzIGl0IG5vcm1hbGx5ICovDQo+ICsJYWRldi0+ Z21jLnZtX2ZhdWx0c1thZGV2LT5nbWMudm1fZmF1bHRfaWR4KytdID0ga2V5Ow0KPiArCWFkZXYt PmdtYy52bV9mYXVsdF9pZHggJT0gQU1ER1BVX0dNQ19OVU1fVk1fRkFVTFRTOw0KPiAgIAlyZXR1 cm4gdHJ1ZTsNCj4gICB9DQo+ICAgDQo+IEBAIC0zMTIsNyArMjg4LDcgQEAgc3RhdGljIGludCBn bWNfdjlfMF9wcm9jZXNzX2ludGVycnVwdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwNCj4g ICAJYWRkciA9ICh1NjQpZW50cnktPnNyY19kYXRhWzBdIDw8IDEyOw0KPiAgIAlhZGRyIHw9ICgo dTY0KWVudHJ5LT5zcmNfZGF0YVsxXSAmIDB4ZikgPDwgNDQ7DQo+ICAgDQo+IC0JaWYgKCFnbWNf djlfMF9wcmVzY3JlZW5faXYoYWRldiwgZW50cnksIGFkZHIpKQ0KPiArCWlmIChyZXRyeV9mYXVs dCAmJiAhZ21jX3Y5XzBfcHJlc2NyZWVuX2l2KGFkZXYsIGVudHJ5LCBhZGRyKSkNCj4gICAJCXJl dHVybiAxOyAvKiBUaGlzIGFsc28gcHJldmVudHMgc2VuZGluZyBpdCB0byBLRkQgKi8NCj4gICAN Cj4gICAJaWYgKCFhbWRncHVfc3Jpb3ZfdmYoYWRldikpIHsNCj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9saW51eC9jaGFzaC5oIGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9pbmNsdWRlL2xpbnV4L2NoYXNoLmgNCj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQo+IGlu ZGV4IDZkYzE1OTkyNGVkMS4uMDAwMDAwMDAwMDAwDQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9h bWQvaW5jbHVkZS9saW51eC9jaGFzaC5oDQo+ICsrKyAvZGV2L251bGwNCj4gQEAgLTEsMzY2ICsw LDAgQEANCj4gLS8qDQo+IC0gKiBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZpY2Vz LCBJbmMuDQo+IC0gKg0KPiAtICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBv ZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGENCj4gLSAqIGNvcHkgb2YgdGhpcyBz b2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJl IiksDQo+IC0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBp bmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQo+IC0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCj4gLSAq IGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29u cyB0byB3aG9tIHRoZQ0KPiAtICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCj4gLSAqDQo+IC0gKiBUaGUgYWJvdmUg Y29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNs dWRlZCBpbg0KPiAtICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUg U29mdHdhcmUuDQo+IC0gKg0KPiAtICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCj4gLSAqIElNUExJRUQs IElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB QklMSVRZLA0KPiAtICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklO RlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMDQo+IC0gKiBUSEUgQ09QWVJJR0hUIEhPTERF UihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1INCj4g LSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRP UlQgT1IgT1RIRVJXSVNFLA0KPiAtICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQo+IC0gKiBPVEhFUiBERUFMSU5H UyBJTiBUSEUgU09GVFdBUkUuDQo+IC0gKg0KPiAtICovDQo+IC0NCj4gLSNpZm5kZWYgX0xJTlVY X0NIQVNIX0gNCj4gLSNkZWZpbmUgX0xJTlVYX0NIQVNIX0gNCj4gLQ0KPiAtI2luY2x1ZGUgPGxp bnV4L3R5cGVzLmg+DQo+IC0jaW5jbHVkZSA8bGludXgvaGFzaC5oPg0KPiAtI2luY2x1ZGUgPGxp bnV4L2J1Zy5oPg0KPiAtI2luY2x1ZGUgPGFzbS9iaXRzcGVybG9uZy5oPg0KPiAtDQo+IC0jaWYg QklUU19QRVJfTE9ORyA9PSAzMg0KPiAtIyBkZWZpbmUgX0NIQVNIX0xPTkdfU0hJRlQgNQ0KPiAt I2VsaWYgQklUU19QRVJfTE9ORyA9PSA2NA0KPiAtIyBkZWZpbmUgX0NIQVNIX0xPTkdfU0hJRlQg Ng0KPiAtI2Vsc2UNCj4gLSMgZXJyb3IgIlVuZXhwZWN0ZWQgQklUU19QRVJfTE9ORyINCj4gLSNl bmRpZg0KPiAtDQo+IC1zdHJ1Y3QgX19jaGFzaF90YWJsZSB7DQo+IC0JdTggYml0czsNCj4gLQl1 OCBrZXlfc2l6ZTsNCj4gLQl1bnNpZ25lZCBpbnQgdmFsdWVfc2l6ZTsNCj4gLQl1MzIgc2l6ZV9t YXNrOw0KPiAtCXVuc2lnbmVkIGxvbmcgKm9jY3VwX2JpdG1hcCwgKnZhbGlkX2JpdG1hcDsNCj4g LQl1bmlvbiB7DQo+IC0JCXUzMiAqa2V5czMyOw0KPiAtCQl1NjQgKmtleXM2NDsNCj4gLQl9Ow0K PiAtCXU4ICp2YWx1ZXM7DQo+IC0NCj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4gLQl1 NjQgaGl0cywgaGl0c19zdGVwcywgaGl0c190aW1lX25zOw0KPiAtCXU2NCBtaXNzLCBtaXNzX3N0 ZXBzLCBtaXNzX3RpbWVfbnM7DQo+IC0JdTY0IHJlbG9jcywgcmVsb2NfZGlzdDsNCj4gLSNlbmRp Zg0KPiAtfTsNCj4gLQ0KPiAtI2RlZmluZSBfX0NIQVNIX0JJVE1BUF9TSVpFKGJpdHMpCQkJCVwN Cj4gLQkoKCgxIDw8IChiaXRzKSkgKyBCSVRTX1BFUl9MT05HIC0gMSkgLyBCSVRTX1BFUl9MT05H KQ0KPiAtI2RlZmluZSBfX0NIQVNIX0FSUkFZX1NJWkUoYml0cywgc2l6ZSkJCQkJXA0KPiAtCSgo KChzaXplKSA8PCAoYml0cykpICsgc2l6ZW9mKGxvbmcpIC0gMSkgLyBzaXplb2YobG9uZykpDQo+ IC0NCj4gLSNkZWZpbmUgX19DSEFTSF9EQVRBX1NJWkUoYml0cywga2V5X3NpemUsIHZhbHVlX3Np emUpCVwNCj4gLQkoX19DSEFTSF9CSVRNQVBfU0laRShiaXRzKSAqIDIgKwkJXA0KPiAtCSBfX0NI QVNIX0FSUkFZX1NJWkUoYml0cywga2V5X3NpemUpICsJCVwNCj4gLQkgX19DSEFTSF9BUlJBWV9T SVpFKGJpdHMsIHZhbHVlX3NpemUpKQ0KPiAtDQo+IC0jZGVmaW5lIFNUUlVDVF9DSEFTSF9UQUJM RShiaXRzLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSkJCQlcDQo+IC0Jc3RydWN0IHsJCQkJCQkJXA0K PiAtCQlzdHJ1Y3QgX19jaGFzaF90YWJsZSB0YWJsZTsJCQkJXA0KPiAtCQl1bnNpZ25lZCBsb25n IGRhdGEJCQkJCVwNCj4gLQkJCVtfX0NIQVNIX0RBVEFfU0laRShiaXRzLCBrZXlfc2l6ZSwgdmFs dWVfc2l6ZSldO1wNCj4gLQl9DQo+IC0NCj4gLS8qKg0KPiAtICogc3RydWN0IGNoYXNoX3RhYmxl IC0gRHluYW1pY2FsbHkgYWxsb2NhdGVkIGNsb3NlZCBoYXNoIHRhYmxlDQo+IC0gKg0KPiAtICog VXNlIHRoaXMgc3RydWN0IGZvciBkeW5hbWljYWxseSBhbGxvY2F0ZWQgaGFzaCB0YWJsZXMgKHVz aW5nDQo+IC0gKiBjaGFzaF90YWJsZV9hbGxvYyBhbmQgY2hhc2hfdGFibGVfZnJlZSksIHdoZXJl IHRoZSBzaXplIGlzDQo+IC0gKiBkZXRlcm1pbmVkIGF0IHJ1bnRpbWUuDQo+IC0gKi8NCj4gLXN0 cnVjdCBjaGFzaF90YWJsZSB7DQo+IC0Jc3RydWN0IF9fY2hhc2hfdGFibGUgdGFibGU7DQo+IC0J dW5zaWduZWQgbG9uZyAqZGF0YTsNCj4gLX07DQo+IC0NCj4gLS8qKg0KPiAtICogREVDTEFSRV9D SEFTSF9UQUJMRSAtIG1hY3JvIHRvIGRlY2xhcmUgYSBjbG9zZWQgaGFzaCB0YWJsZQ0KPiAtICog QHRhYmxlOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBoYXNoIHRhYmxlDQo+IC0gKiBAYnRzOiBUYWJs ZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMNCj4gLSAqIEBrZXlfc3o6IFNpemUgb2YgaGFz aCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4gLSAqIEB2YWxfc3o6IFNpemUgb2YgZGF0YSB2YWx1 ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwDQo+IC0gKg0KPiAtICogVGhpcyBkZWNsYXJlcyB0aGUgaGFz aCB0YWJsZSB2YXJpYWJsZSB3aXRoIGEgc3RhdGljIHNpemUuDQo+IC0gKg0KPiAtICogVGhlIGNs b3NlZCBoYXNoIHRhYmxlIHN0b3JlcyBrZXktdmFsdWUgcGFpcnMgd2l0aCBsb3cgbWVtb3J5IGFu ZA0KPiAtICogbG9va3VwIG92ZXJoZWFkLiBJbiBvcGVyYXRpb24gaXQgcGVyZm9ybXMgbm8gZHlu YW1pYyBtZW1vcnkNCj4gLSAqIG1hbmFnZW1lbnQuIFRoZSBkYXRhIGJlaW5nIHN0b3JlZCBkb2Vz IG5vdCByZXF1aXJlIGFueQ0KPiAtICogbGlzdF9oZWFkcy4gVGhlIGhhc2ggdGFibGUgcGVyZm9y bXMgYmVzdCB3aXRoIHNtYWxsIEB2YWxfc3ogYW5kIGFzDQo+IC0gKiBsb25nIGFzIHNvbWUgc3Bh Y2UgKGFib3V0IDUwJSkgaXMgbGVmdCBmcmVlIGluIHRoZSB0YWJsZS4gQnV0IHRoZQ0KPiAtICog dGFibGUgY2FuIHN0aWxsIHdvcmsgcmVhc29uYWJseSBlZmZpY2llbnRseSBldmVuIHdoZW4gZmls bGVkIHVwIHRvDQo+IC0gKiBhYm91dCA5MCUuIElmIGJpZ2dlciBkYXRhIGl0ZW1zIG5lZWQgdG8g YmUgc3RvcmVkIGFuZCBsb29rZWQgdXAsDQo+IC0gKiBzdG9yZSB0aGUgcG9pbnRlciB0byBpdCBh cyB2YWx1ZSBpbiB0aGUgaGFzaCB0YWJsZS4NCj4gLSAqDQo+IC0gKiBAdmFsX3N6IG1heSBiZSAw LiBUaGlzIGNhbiBiZSB1c2VmdWwgd2hlbiBhbGwgdGhlIHN0b3JlZA0KPiAtICogaW5mb3JtYXRp b24gaXMgY29udGFpbmVkIGluIHRoZSBrZXkgaXRzZWxmIGFuZCB0aGUgZmFjdCB0aGF0IGl0IGlz DQo+IC0gKiBpbiB0aGUgaGFzaCB0YWJsZSAob3Igbm90KS4NCj4gLSAqLw0KPiAtI2RlZmluZSBE RUNMQVJFX0NIQVNIX1RBQkxFKHRhYmxlLCBidHMsIGtleV9zeiwgdmFsX3N6KQkJXA0KPiAtCVNU UlVDVF9DSEFTSF9UQUJMRShidHMsIGtleV9zeiwgdmFsX3N6KSB0YWJsZQ0KPiAtDQo+IC0jaWZk ZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+IC0jZGVmaW5lIF9fQ0hBU0hfU1RBVFNfSU5JVChwcmVm aXgpLAkJXA0KPiAtCQlwcmVmaXguaGl0cyA9IDAsCQlcDQo+IC0JCXByZWZpeC5oaXRzX3N0ZXBz ID0gMCwJCVwNCj4gLQkJcHJlZml4LmhpdHNfdGltZV9ucyA9IDAsCVwNCj4gLQkJcHJlZml4Lm1p c3MgPSAwLAkJXA0KPiAtCQlwcmVmaXgubWlzc19zdGVwcyA9IDAsCQlcDQo+IC0JCXByZWZpeC5t aXNzX3RpbWVfbnMgPSAwLAlcDQo+IC0JCXByZWZpeC5yZWxvY3MgPSAwLAkJXA0KPiAtCQlwcmVm aXgucmVsb2NfZGlzdCA9IDANCj4gLSNlbHNlDQo+IC0jZGVmaW5lIF9fQ0hBU0hfU1RBVFNfSU5J VChwcmVmaXgpDQo+IC0jZW5kaWYNCj4gLQ0KPiAtI2RlZmluZSBfX0NIQVNIX1RBQkxFX0lOSVQo cHJlZml4LCBkYXRhLCBidHMsIGtleV9zeiwgdmFsX3N6KQlcDQo+IC0JcHJlZml4LmJpdHMgPSAo YnRzKSwJCQkJCVwNCj4gLQkJcHJlZml4LmtleV9zaXplID0gKGtleV9zeiksCQkJXA0KPiAtCQlw cmVmaXgudmFsdWVfc2l6ZSA9ICh2YWxfc3opLAkJCVwNCj4gLQkJcHJlZml4LnNpemVfbWFzayA9 ICgoMSA8PCBidHMpIC0gMSksCQlcDQo+IC0JCXByZWZpeC5vY2N1cF9iaXRtYXAgPSAmZGF0YVsw XSwJCQlcDQo+IC0JCXByZWZpeC52YWxpZF9iaXRtYXAgPSAmZGF0YQkJCVwNCj4gLQkJCVtfX0NI QVNIX0JJVE1BUF9TSVpFKGJ0cyldLAkJXA0KPiAtCQlwcmVmaXgua2V5czY0ID0gKHU2NCAqKSZk YXRhCQkJXA0KPiAtCQkJW19fQ0hBU0hfQklUTUFQX1NJWkUoYnRzKSAqIDJdLAkJXA0KPiAtCQlw cmVmaXgudmFsdWVzID0gKHU4ICopJmRhdGEJCQlcDQo+IC0JCQlbX19DSEFTSF9CSVRNQVBfU0la RShidHMpICogMiArCQlcDQo+IC0JCQkgX19DSEFTSF9BUlJBWV9TSVpFKGJ0cywga2V5X3N6KV0J XA0KPiAtCQlfX0NIQVNIX1NUQVRTX0lOSVQocHJlZml4KQ0KPiAtDQo+IC0vKioNCj4gLSAqIERF RklORV9DSEFTSF9UQUJMRSAtIG1hY3JvIHRvIGRlZmluZSBhbmQgaW5pdGlhbGl6ZSBhIGNsb3Nl ZCBoYXNoIHRhYmxlDQo+IC0gKiBAdGJsOiBuYW1lIG9mIHRoZSBkZWNsYXJlZCBoYXNoIHRhYmxl DQo+IC0gKiBAYnRzOiBUYWJsZSBzaXplIHdpbGwgYmUgMl5iaXRzIGVudHJpZXMNCj4gLSAqIEBr ZXlfc3o6IFNpemUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4gLSAqIEB2YWxfc3o6 IFNpemUgb2YgZGF0YSB2YWx1ZXMgaW4gYnl0ZXMsIGNhbiBiZSAwDQo+IC0gKg0KPiAtICogTm90 ZTogdGhlIG1hY3JvIGNhbiBiZSB1c2VkIGZvciBnbG9iYWwgYW5kIGxvY2FsIGhhc2ggdGFibGUg dmFyaWFibGVzLg0KPiAtICovDQo+IC0jZGVmaW5lIERFRklORV9DSEFTSF9UQUJMRSh0YmwsIGJ0 cywga2V5X3N6LCB2YWxfc3opCQkJXA0KPiAtCURFQ0xBUkVfQ0hBU0hfVEFCTEUodGJsLCBidHMs IGtleV9zeiwgdmFsX3N6KSA9IHsJCVwNCj4gLQkJLnRhYmxlID0gewkJCQkJCVwNCj4gLQkJCV9f Q0hBU0hfVEFCTEVfSU5JVCgsICh0YmwpLmRhdGEsIGJ0cywga2V5X3N6LCB2YWxfc3opIFwNCj4g LQkJfSwJCQkJCQkJXA0KPiAtCQkuZGF0YSA9IHswfQkJCQkJCVwNCj4gLQl9DQo+IC0NCj4gLS8q Kg0KPiAtICogSU5JVF9DSEFTSF9UQUJMRSAtIEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIGRlY2xh cmVkIGJ5IERFQ0xBUkVfQ0hBU0hfVEFCTEUNCj4gLSAqIEB0Ymw6IG5hbWUgb2YgdGhlIGRlY2xh cmVkIGhhc2ggdGFibGUNCj4gLSAqIEBidHM6IFRhYmxlIHNpemUgd2lsbCBiZSAyXmJpdHMgZW50 cmllcw0KPiAtICogQGtleV9zejogU2l6ZSBvZiBoYXNoIGtleXMgaW4gYnl0ZXMsIDQgb3IgOA0K PiAtICogQHZhbF9zejogU2l6ZSBvZiBkYXRhIHZhbHVlcyBpbiBieXRlcywgY2FuIGJlIDANCj4g LSAqLw0KPiAtI2RlZmluZSBJTklUX0NIQVNIX1RBQkxFKHRibCwgYnRzLCBrZXlfc3osIHZhbF9z eikJCQlcDQo+IC0JX19DSEFTSF9UQUJMRV9JTklUKCgodGJsKS50YWJsZSksICh0YmwpLmRhdGEs IGJ0cywga2V5X3N6LCB2YWxfc3opDQo+IC0NCj4gLWludCBjaGFzaF90YWJsZV9hbGxvYyhzdHJ1 Y3QgY2hhc2hfdGFibGUgKnRhYmxlLCB1OCBiaXRzLCB1OCBrZXlfc2l6ZSwNCj4gLQkJICAgICAg dW5zaWduZWQgaW50IHZhbHVlX3NpemUsIGdmcF90IGdmcF9tYXNrKTsNCj4gLXZvaWQgY2hhc2hf dGFibGVfZnJlZShzdHJ1Y3QgY2hhc2hfdGFibGUgKnRhYmxlKTsNCj4gLQ0KPiAtLyoqDQo+IC0g KiBjaGFzaF90YWJsZV9kdW1wX3N0YXRzIC0gRHVtcCBzdGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhh c2ggdGFibGUNCj4gLSAqIEB0Ymw6IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAt ICoNCj4gLSAqIER1bXBzIHNvbWUgcGVyZm9ybWFuY2Ugc3RhdGlzdGljcyBvZiB0aGUgdGFibGUg Z2F0aGVyZWQgaW4gb3BlcmF0aW9uDQo+IC0gKiBpbiB0aGUga2VybmVsIGxvZyB1c2luZyBwcl9k ZWJ1Zy4gSWYgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgZW5hYmxlZCwNCj4gLSAqIHVzZXIgbXVz dCB0dXJuIG9uIG1lc3NhZ2VzIGZvciBjaGFzaC5jIChmaWxlIGNoYXNoLmMgK3ApLg0KPiAtICov DQo+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX2R1 bXBfc3RhdHModGJsKSBfX2NoYXNoX3RhYmxlX2R1bXBfc3RhdHMoJigqdGJsKS50YWJsZSkNCj4g LQ0KPiAtdm9pZCBfX2NoYXNoX3RhYmxlX2R1bXBfc3RhdHMoc3RydWN0IF9fY2hhc2hfdGFibGUg KnRhYmxlKTsNCj4gLSNlbHNlDQo+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX2R1bXBfc3RhdHModGJs KQ0KPiAtI2VuZGlmDQo+IC0NCj4gLS8qKg0KPiAtICogY2hhc2hfdGFibGVfcmVzZXRfc3RhdHMg LSBSZXNldCBzdGF0aXN0aWNzIG9mIGEgY2xvc2VkIGhhc2ggdGFibGUNCj4gLSAqIEB0Ymw6IFBv aW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAtICovDQo+IC0jaWZkZWYgQ09ORklHX0NI QVNIX1NUQVRTDQo+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHRibCkgX19jaGFz aF90YWJsZV9yZXNldF9zdGF0cygmKCp0YmwpLnRhYmxlKQ0KPiAtDQo+IC1zdGF0aWMgaW5saW5l IHZvaWQgX19jaGFzaF90YWJsZV9yZXNldF9zdGF0cyhzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFi bGUpDQo+IC17DQo+IC0JKHZvaWQpdGFibGUgX19DSEFTSF9TVEFUU19JTklUKCgqdGFibGUpKTsN Cj4gLX0NCj4gLSNlbHNlDQo+IC0jZGVmaW5lIGNoYXNoX3RhYmxlX3Jlc2V0X3N0YXRzKHRibCkN Cj4gLSNlbmRpZg0KPiAtDQo+IC0vKioNCj4gLSAqIGNoYXNoX3RhYmxlX2NvcHlfaW4gLSBDb3B5 IGEgbmV3IHZhbHVlIGludG8gdGhlIGhhc2ggdGFibGUNCj4gLSAqIEB0Ymw6IFBvaW50ZXIgdG8g dGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRyeSB0byBhZGQg b3IgdXBkYXRlDQo+IC0gKiBAdmFsdWU6IFBvaW50ZXIgdG8gdmFsdWUgdG8gY29weSwgbWF5IGJl IE5VTEwNCj4gLSAqDQo+IC0gKiBJZiBAa2V5IGFscmVhZHkgaGFzIGFuIGVudHJ5LCBpdHMgdmFs dWUgaXMgcmVwbGFjZWQuIE90aGVyd2lzZSBhDQo+IC0gKiBuZXcgZW50cnkgaXMgYWRkZWQuIElm IEB2YWx1ZSBpcyBOVUxMLCB0aGUgdmFsdWUgaXMgbGVmdCB1bmNoYW5nZWQNCj4gLSAqIG9yIHVu aW5pdGlhbGl6ZWQuIFJldHVybnMgMSBpZiBhbiBlbnRyeSBhbHJlYWR5IGV4aXN0ZWQsIDAgaWYg YSBuZXcNCj4gLSAqIGVudHJ5IHdhcyBhZGRlZCBvciAlLUVOT01FTSBpZiB0aGVyZSB3YXMgbm8g ZnJlZSBzcGFjZSBpbiB0aGUNCj4gLSAqIHRhYmxlLg0KPiAtICovDQo+IC0jZGVmaW5lIGNoYXNo X3RhYmxlX2NvcHlfaW4odGJsLCBrZXksIHZhbHVlKQkJCVwNCj4gLQlfX2NoYXNoX3RhYmxlX2Nv cHlfaW4oJigqdGJsKS50YWJsZSwga2V5LCB2YWx1ZSkNCj4gLQ0KPiAtaW50IF9fY2hhc2hfdGFi bGVfY29weV9pbihzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksDQo+IC0JCQkg IGNvbnN0IHZvaWQgKnZhbHVlKTsNCj4gLQ0KPiAtLyoqDQo+IC0gKiBjaGFzaF90YWJsZV9jb3B5 X291dCAtIENvcHkgYSB2YWx1ZSBvdXQgb2YgdGhlIGhhc2ggdGFibGUNCj4gLSAqIEB0Ymw6IFBv aW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAtICogQGtleTogS2V5IG9mIHRoZSBlbnRy eSB0byBmaW5kDQo+IC0gKiBAdmFsdWU6IFBvaW50ZXIgdG8gdmFsdWUgdG8gY29weSwgbWF5IGJl IE5VTEwNCj4gLSAqDQo+IC0gKiBJZiBAdmFsdWUgaXMgbm90IE5VTEwgYW5kIHRoZSB0YWJsZSBo YXMgYSBub24tMCB2YWx1ZV9zaXplLCB0aGUNCj4gLSAqIHZhbHVlIGF0IEBrZXkgaXMgY29waWVk IHRvIEB2YWx1ZS4gUmV0dXJucyB0aGUgc2xvdCBpbmRleCBvZiB0aGUNCj4gLSAqIGVudHJ5IG9y ICUtRUlOVkFMIGlmIEBrZXkgd2FzIG5vdCBmb3VuZC4NCj4gLSAqLw0KPiAtI2RlZmluZSBjaGFz aF90YWJsZV9jb3B5X291dCh0YmwsIGtleSwgdmFsdWUpCQkJXA0KPiAtCV9fY2hhc2hfdGFibGVf Y29weV9vdXQoJigqdGJsKS50YWJsZSwga2V5LCB2YWx1ZSwgZmFsc2UpDQo+IC0NCj4gLWludCBf X2NoYXNoX3RhYmxlX2NvcHlfb3V0KHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZSwgdTY0IGtl eSwNCj4gLQkJCSAgIHZvaWQgKnZhbHVlLCBib29sIHJlbW92ZSk7DQo+IC0NCj4gLS8qKg0KPiAt ICogY2hhc2hfdGFibGVfcmVtb3ZlIC0gUmVtb3ZlIGFuIGVudHJ5IGZyb20gdGhlIGhhc2ggdGFi bGUNCj4gLSAqIEB0Ymw6IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAtICogQGtl eTogS2V5IG9mIHRoZSBlbnRyeSB0byBmaW5kDQo+IC0gKiBAdmFsdWU6IFBvaW50ZXIgdG8gdmFs dWUgdG8gY29weSwgbWF5IGJlIE5VTEwNCj4gLSAqDQo+IC0gKiBJZiBAdmFsdWUgaXMgbm90IE5V TEwgYW5kIHRoZSB0YWJsZSBoYXMgYSBub24tMCB2YWx1ZV9zaXplLCB0aGUNCj4gLSAqIHZhbHVl IGF0IEBrZXkgaXMgY29waWVkIHRvIEB2YWx1ZS4gVGhlIGVudHJ5IGlzIHJlbW92ZWQgZnJvbSB0 aGUNCj4gLSAqIHRhYmxlLiBSZXR1cm5zIHRoZSBzbG90IGluZGV4IG9mIHRoZSByZW1vdmVkIGVu dHJ5IG9yICUtRUlOVkFMIGlmDQo+IC0gKiBAa2V5IHdhcyBub3QgZm91bmQuDQo+IC0gKi8NCj4g LSNkZWZpbmUgY2hhc2hfdGFibGVfcmVtb3ZlKHRibCwga2V5LCB2YWx1ZSkJCQlcDQo+IC0JX19j aGFzaF90YWJsZV9jb3B5X291dCgmKCp0YmwpLnRhYmxlLCBrZXksIHZhbHVlLCB0cnVlKQ0KPiAt DQo+IC0vKg0KPiAtICogTG93IGxldmVsIGl0ZXJhdG9yIEFQSSB1c2VkIGludGVybmFsbHkgYnkg dGhlIGFib3ZlIGZ1bmN0aW9ucy4NCj4gLSAqLw0KPiAtc3RydWN0IGNoYXNoX2l0ZXIgew0KPiAt CXN0cnVjdCBfX2NoYXNoX3RhYmxlICp0YWJsZTsNCj4gLQl1bnNpZ25lZCBsb25nIG1hc2s7DQo+ IC0JaW50IHNsb3Q7DQo+IC19Ow0KPiAtDQo+IC0vKioNCj4gLSAqIENIQVNIX0lURVJfSU5JVCAt IEluaXRpYWxpemUgYSBoYXNoIHRhYmxlIGl0ZXJhdG9yDQo+IC0gKiBAdGJsOiBQb2ludGVyIHRv IGhhc2ggdGFibGUgdG8gaXRlcmF0ZSBvdmVyDQo+IC0gKiBAczogSW5pdGlhbCBzbG90IG51bWJl cg0KPiAtICovDQo+IC0jZGVmaW5lIENIQVNIX0lURVJfSU5JVCh0YWJsZSwgcykgewkJCVwNCj4g LQkJdGFibGUsCQkJCQlcDQo+IC0JCTFVTCA8PCAoKHMpICYgKEJJVFNfUEVSX0xPTkcgLSAxKSks CVwNCj4gLQkJcwkJCQkJXA0KPiAtCX0NCj4gLS8qKg0KPiAtICogQ0hBU0hfSVRFUl9TRVQgLSBT ZXQgaGFzaCB0YWJsZSBpdGVyYXRvciB0byBuZXcgc2xvdA0KPiAtICogQGl0ZXI6IEl0ZXJhdG9y DQo+IC0gKiBAczogU2xvdCBudW1iZXINCj4gLSAqLw0KPiAtI2RlZmluZSBDSEFTSF9JVEVSX1NF VChpdGVyLCBzKQkJCQkJXA0KPiAtCShpdGVyKS5tYXNrID0gMVVMIDw8ICgocykgJiAoQklUU19Q RVJfTE9ORyAtIDEpKSwJXA0KPiAtCShpdGVyKS5zbG90ID0gKHMpDQo+IC0vKioNCj4gLSAqIENI QVNIX0lURVJfSU5DIC0gSW5jcmVtZW50IGhhc2ggdGFibGUgaXRlcmF0b3INCj4gLSAqIEB0YWJs ZTogSGFzaCB0YWJsZSB0byBpdGVyYXRlIG92ZXINCj4gLSAqDQo+IC0gKiBXcmFwcyBhcm91bmQg YXQgdGhlIGVuZC4NCj4gLSAqLw0KPiAtI2RlZmluZSBDSEFTSF9JVEVSX0lOQyhpdGVyKSBkbyB7 CQkJCQlcDQo+IC0JCShpdGVyKS5tYXNrID0gKGl0ZXIpLm1hc2sgPDwgMSB8CQkJXA0KPiAtCQkJ KGl0ZXIpLm1hc2sgPj4gKEJJVFNfUEVSX0xPTkcgLSAxKTsJCVwNCj4gLQkJKGl0ZXIpLnNsb3Qg PSAoKGl0ZXIpLnNsb3QgKyAxKSAmIChpdGVyKS50YWJsZS0+c2l6ZV9tYXNrOyBcDQo+IC0JfSB3 aGlsZSAoMCkNCj4gLQ0KPiAtc3RhdGljIGlubGluZSBib29sIGNoYXNoX2l0ZXJfaXNfdmFsaWQo Y29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikNCj4gLXsNCj4gLQlCVUdfT04oKHVuc2lnbmVk KWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+IC0JcmV0dXJuICEhKGl0 ZXIudGFibGUtPnZhbGlkX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdICYN Cj4gLQkJICBpdGVyLm1hc2spOw0KPiAtfQ0KPiAtc3RhdGljIGlubGluZSBib29sIGNoYXNoX2l0 ZXJfaXNfZW1wdHkoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikNCj4gLXsNCj4gLQlCVUdf T04oKHVuc2lnbmVkKWl0ZXIuc2xvdCA+PSAoMSA8PCBpdGVyLnRhYmxlLT5iaXRzKSk7DQo+IC0J cmV0dXJuICEoaXRlci50YWJsZS0+b2NjdXBfYml0bWFwW2l0ZXIuc2xvdCA+PiBfQ0hBU0hfTE9O R19TSElGVF0gJg0KPiAtCQkgaXRlci5tYXNrKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlubGlu ZSB2b2lkIGNoYXNoX2l0ZXJfc2V0X3ZhbGlkKGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIp DQo+IC17DQo+IC0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJs ZS0+Yml0cykpOw0KPiAtCWl0ZXIudGFibGUtPnZhbGlkX2JpdG1hcFtpdGVyLnNsb3QgPj4gX0NI QVNIX0xPTkdfU0hJRlRdIHw9IGl0ZXIubWFzazsNCj4gLQlpdGVyLnRhYmxlLT5vY2N1cF9iaXRt YXBbaXRlci5zbG90ID4+IF9DSEFTSF9MT05HX1NISUZUXSB8PSBpdGVyLm1hc2s7DQo+IC19DQo+ IC1zdGF0aWMgaW5saW5lIHZvaWQgY2hhc2hfaXRlcl9zZXRfaW52YWxpZChjb25zdCBzdHJ1Y3Qg Y2hhc2hfaXRlciBpdGVyKQ0KPiAtew0KPiAtCUJVR19PTigodW5zaWduZWQpaXRlci5zbG90ID49 ICgxIDw8IGl0ZXIudGFibGUtPmJpdHMpKTsNCj4gLQlpdGVyLnRhYmxlLT52YWxpZF9iaXRtYXBb aXRlci5zbG90ID4+IF9DSEFTSF9MT05HX1NISUZUXSAmPSB+aXRlci5tYXNrOw0KPiAtfQ0KPiAt c3RhdGljIGlubGluZSB2b2lkIGNoYXNoX2l0ZXJfc2V0X2VtcHR5KGNvbnN0IHN0cnVjdCBjaGFz aF9pdGVyIGl0ZXIpDQo+IC17DQo+IC0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0gKDEg PDwgaXRlci50YWJsZS0+Yml0cykpOw0KPiAtCWl0ZXIudGFibGUtPm9jY3VwX2JpdG1hcFtpdGVy LnNsb3QgPj4gX0NIQVNIX0xPTkdfU0hJRlRdICY9IH5pdGVyLm1hc2s7DQo+IC19DQo+IC0NCj4g LXN0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJfa2V5MzIoY29uc3Qgc3RydWN0IGNoYXNoX2l0 ZXIgaXRlcikNCj4gLXsNCj4gLQlCVUdfT04oaXRlci50YWJsZS0+a2V5X3NpemUgIT0gNCk7DQo+ IC0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJsZS0+Yml0cykp Ow0KPiAtCXJldHVybiBpdGVyLnRhYmxlLT5rZXlzMzJbaXRlci5zbG90XTsNCj4gLX0NCj4gLXN0 YXRpYyBpbmxpbmUgdTY0IGNoYXNoX2l0ZXJfa2V5NjQoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIg aXRlcikNCj4gLXsNCj4gLQlCVUdfT04oaXRlci50YWJsZS0+a2V5X3NpemUgIT0gOCk7DQo+IC0J QlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJsZS0+Yml0cykpOw0K PiAtCXJldHVybiBpdGVyLnRhYmxlLT5rZXlzNjRbaXRlci5zbG90XTsNCj4gLX0NCj4gLXN0YXRp YyBpbmxpbmUgdTY0IGNoYXNoX2l0ZXJfa2V5KGNvbnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIp DQo+IC17DQo+IC0JQlVHX09OKCh1bnNpZ25lZClpdGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJs ZS0+Yml0cykpOw0KPiAtCXJldHVybiAoaXRlci50YWJsZS0+a2V5X3NpemUgPT0gNCkgPw0KPiAt CQlpdGVyLnRhYmxlLT5rZXlzMzJbaXRlci5zbG90XSA6IGl0ZXIudGFibGUtPmtleXM2NFtpdGVy LnNsb3RdOw0KPiAtfQ0KPiAtDQo+IC1zdGF0aWMgaW5saW5lIHUzMiBjaGFzaF9pdGVyX2hhc2gz Mihjb25zdCBzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyKQ0KPiAtew0KPiAtCUJVR19PTihpdGVyLnRh YmxlLT5rZXlfc2l6ZSAhPSA0KTsNCj4gLQlyZXR1cm4gaGFzaF8zMihjaGFzaF9pdGVyX2tleTMy KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRzKTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlubGluZSB1 MzIgY2hhc2hfaXRlcl9oYXNoNjQoY29uc3Qgc3RydWN0IGNoYXNoX2l0ZXIgaXRlcikNCj4gLXsN Cj4gLQlCVUdfT04oaXRlci50YWJsZS0+a2V5X3NpemUgIT0gOCk7DQo+IC0JcmV0dXJuIGhhc2hf NjQoY2hhc2hfaXRlcl9rZXk2NChpdGVyKSwgaXRlci50YWJsZS0+Yml0cyk7DQo+IC19DQo+IC0N Cj4gLXN0YXRpYyBpbmxpbmUgdTMyIGNoYXNoX2l0ZXJfaGFzaChjb25zdCBzdHJ1Y3QgY2hhc2hf aXRlciBpdGVyKQ0KPiAtew0KPiAtCXJldHVybiAoaXRlci50YWJsZS0+a2V5X3NpemUgPT0gNCkg Pw0KPiAtCQloYXNoXzMyKGNoYXNoX2l0ZXJfa2V5MzIoaXRlciksIGl0ZXIudGFibGUtPmJpdHMp IDoNCj4gLQkJaGFzaF82NChjaGFzaF9pdGVyX2tleTY0KGl0ZXIpLCBpdGVyLnRhYmxlLT5iaXRz KTsNCj4gLX0NCj4gLQ0KPiAtc3RhdGljIGlubGluZSB2b2lkICpjaGFzaF9pdGVyX3ZhbHVlKGNv bnN0IHN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIpDQo+IC17DQo+IC0JQlVHX09OKCh1bnNpZ25lZClp dGVyLnNsb3QgPj0gKDEgPDwgaXRlci50YWJsZS0+Yml0cykpOw0KPiAtCXJldHVybiBpdGVyLnRh YmxlLT52YWx1ZXMgKw0KPiAtCQkoKHVuc2lnbmVkIGxvbmcpaXRlci5zbG90ICogaXRlci50YWJs ZS0+dmFsdWVfc2l6ZSk7DQo+IC19DQo+IC0NCj4gLSNlbmRpZiAvKiBfTElOVVhfQ0hBU0hfSCAq Lw0KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9saWIvS2NvbmZpZyBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvbGliL0tjb25maWcNCj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQo+ IGluZGV4IDc3NmVmMzQzNGMxMC4uMDAwMDAwMDAwMDAwDQo+IC0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvbGliL0tjb25maWcNCj4gKysrIC9kZXYvbnVsbA0KPiBAQCAtMSwyOCArMCwwIEBADQo+ IC1tZW51ICJBTUQgTGlicmFyeSByb3V0aW5lcyINCj4gLQ0KPiAtIw0KPiAtIyBDbG9zZWQgaGFz aCB0YWJsZQ0KPiAtIw0KPiAtY29uZmlnIENIQVNIDQo+IC0JdHJpc3RhdGUNCj4gLQlkZWZhdWx0 IERSTV9BTURHUFUNCj4gLQloZWxwDQo+IC0JIFN0YXRpY2FsbHkgc2l6ZWQgY2xvc2VkIGhhc2gg dGFibGUgaW1wbGVtZW50YXRpb24gd2l0aCBsb3cNCj4gLQkgbWVtb3J5IGFuZCBDUFUgb3Zlcmhl YWQuDQo+IC0NCj4gLWNvbmZpZyBDSEFTSF9TVEFUUw0KPiAtCWJvb2wgIkNsb3NlZCBoYXNoIHRh YmxlIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MiDQo+IC0JZGVwZW5kcyBvbiBDSEFTSA0KPiAtCWRl ZmF1bHQgbg0KPiAtCWhlbHANCj4gLQkgRW5hYmxlIGNvbGxlY3Rpb24gb2YgcGVyZm9ybWFuY2Ug c3RhdGlzdGljcyBmb3IgY2xvc2VkIGhhc2ggdGFibGVzLg0KPiAtDQo+IC1jb25maWcgQ0hBU0hf U0VMRlRFU1QNCj4gLQlib29sICJDbG9zZWQgaGFzaCB0YWJsZSBzZWxmIHRlc3QiDQo+IC0JZGVw ZW5kcyBvbiBDSEFTSA0KPiAtCWRlZmF1bHQgbg0KPiAtCWhlbHANCj4gLQkgUnVucyBhIHNlbGZ0 ZXN0IGR1cmluZyBtb2R1bGUgbG9hZC4gU2V2ZXJhbCBtb2R1bGUgcGFyYW1ldGVycw0KPiAtCSBh cmUgYXZhaWxhYmxlIHRvIG1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIHRoZSB0ZXN0Lg0KPiAtDQo+ IC1lbmRtZW51DQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9NYWtlZmls ZSBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL01ha2VmaWxlDQo+IGRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NA0KPiBpbmRleCA2OTAyNDMwMDFlMWEuLjAwMDAwMDAwMDAwMA0KPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vYW1kL2xpYi9NYWtlZmlsZQ0KPiArKysgL2Rldi9udWxsDQo+IEBAIC0xLDMy ICswLDAgQEANCj4gLSMNCj4gLSMgQ29weXJpZ2h0IDIwMTcgQWR2YW5jZWQgTWljcm8gRGV2aWNl cywgSW5jLg0KPiAtIw0KPiAtIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQ0KPiAtIyBjb3B5IG9mIHRoaXMgc29m dHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIp LA0KPiAtIyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNs dWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQo+IC0jIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBt b2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLA0KPiAtIyBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUNCj4gLSMgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCj4gLSMNCj4gLSMgVGhlIGFib3ZlIGNvcHlyaWdo dCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4N Cj4gLSMgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUu DQo+IC0jDQo+IC0jIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdB UlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQo+IC0jIElNUExJRUQsIElOQ0xVRElORyBC VVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KPiAt IyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAg SU4gTk8gRVZFTlQgU0hBTEwNCj4gLSMgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9S KFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SDQo+IC0jIE9USEVSIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LA0KPiAtIyBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1INCj4gLSMgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJF Lg0KPiAtIw0KPiAtIw0KPiAtIyBNYWtlZmlsZSBmb3IgQU1EIGxpYnJhcnkgcm91dGluZXMsIHdo aWNoIGFyZSB1c2VkIGJ5IEFNRCBkcml2ZXINCj4gLSMgY29tcG9uZW50cy4NCj4gLSMNCj4gLSMg VGhpcyBpcyBmb3IgY29tbW9uIGxpYnJhcnkgcm91dGluZXMgdGhhdCBjYW4gYmUgc2hhcmVkIGJl dHdlZW4gQU1EDQo+IC0jIGRyaXZlciBjb21wb25lbnRzIG9yIGxhdGVyIG1vdmVkIHRvIGtlcm5l bC9saWIgZm9yIHNoYXJpbmcgd2l0aA0KPiAtIyBvdGhlciBkcml2ZXJzLg0KPiAtDQo+IC1jY2Zs YWdzLXkgOj0gLUkkKHNyYykvLi4vaW5jbHVkZQ0KPiAtDQo+IC1vYmotJChDT05GSUdfQ0hBU0gp ICs9IGNoYXNoLm8NCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvbGliL2NoYXNo LmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2xpYi9jaGFzaC5jDQo+IGRlbGV0ZWQgZmlsZSBtb2Rl IDEwMDY0NA0KPiBpbmRleCBiOGU0NWYzNTZhMWMuLjAwMDAwMDAwMDAwMA0KPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vYW1kL2xpYi9jaGFzaC5jDQo+ICsrKyAvZGV2L251bGwNCj4gQEAgLTEsNjM4 ICswLDAgQEANCj4gLS8qDQo+IC0gKiBDb3B5cmlnaHQgMjAxNyBBZHZhbmNlZCBNaWNybyBEZXZp Y2VzLCBJbmMuDQo+IC0gKg0KPiAtICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJl ZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGENCj4gLSAqIGNvcHkgb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksDQo+IC0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQo+IC0gKiB0aGUgcmlnaHRzIHRvIHVzZSwg Y29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwNCj4g LSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQ0KPiAtICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBz dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCj4gLSAqDQo+IC0gKiBUaGUgYWJv dmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBp bmNsdWRlZCBpbg0KPiAtICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0 aGUgU29mdHdhcmUuDQo+IC0gKg0KPiAtICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJ UyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCj4gLSAqIElNUExJ RUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZLA0KPiAtICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMDQo+IC0gKiBUSEUgQ09QWVJJR0hUIEhP TERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IN Cj4gLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLA0KPiAtICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SDQo+IC0gKiBPVEhFUiBERUFM SU5HUyBJTiBUSEUgU09GVFdBUkUuDQo+IC0gKg0KPiAtICovDQo+IC0NCj4gLSNpbmNsdWRlIDxs aW51eC90eXBlcy5oPg0KPiAtI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4NCj4gLSNpbmNsdWRlIDxs aW51eC9idWcuaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQo+IC0jaW5jbHVkZSA8bGlu dXgvbW9kdWxlLmg+DQo+IC0jaW5jbHVkZSA8bGludXgvc2NoZWQvY2xvY2suaD4NCj4gLSNpbmNs dWRlIDxhc20vZGl2NjQuaD4NCj4gLSNpbmNsdWRlIDxsaW51eC9jaGFzaC5oPg0KPiAtDQo+IC0v KioNCj4gLSAqIGNoYXNoX3RhYmxlX2FsbG9jIC0gQWxsb2NhdGUgY2xvc2VkIGhhc2ggdGFibGUN Cj4gLSAqIEB0YWJsZTogUG9pbnRlciB0byB0aGUgdGFibGUgc3RydWN0dXJlDQo+IC0gKiBAYml0 czogVGFibGUgc2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzDQo+IC0gKiBAa2V5X3NpemU6IFNp emUgb2YgaGFzaCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4gLSAqIEB2YWx1ZV9zaXplOiBTaXpl IG9mIGRhdGEgdmFsdWVzIGluIGJ5dGVzLCBjYW4gYmUgMA0KPiAtICovDQo+IC1pbnQgY2hhc2hf dGFibGVfYWxsb2Moc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSwgdTggYml0cywgdTgga2V5X3Np emUsDQo+IC0JCSAgICAgIHVuc2lnbmVkIGludCB2YWx1ZV9zaXplLCBnZnBfdCBnZnBfbWFzaykN Cj4gLXsNCj4gLQlpZiAoYml0cyA+IDMxKQ0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQ0KPiAt CWlmIChrZXlfc2l6ZSAhPSA0ICYmIGtleV9zaXplICE9IDgpDQo+IC0JCXJldHVybiAtRUlOVkFM Ow0KPiAtDQo+IC0JdGFibGUtPmRhdGEgPSBrY2FsbG9jKF9fQ0hBU0hfREFUQV9TSVpFKGJpdHMs IGtleV9zaXplLCB2YWx1ZV9zaXplKSwNCj4gLQkJICAgICAgIHNpemVvZihsb25nKSwgZ2ZwX21h c2spOw0KPiAtCWlmICghdGFibGUtPmRhdGEpDQo+IC0JCXJldHVybiAtRU5PTUVNOw0KPiAtDQo+ IC0JX19DSEFTSF9UQUJMRV9JTklUKHRhYmxlLT50YWJsZSwgdGFibGUtPmRhdGEsDQo+IC0JCQkg ICBiaXRzLCBrZXlfc2l6ZSwgdmFsdWVfc2l6ZSk7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gLX0N Cj4gLUVYUE9SVF9TWU1CT0woY2hhc2hfdGFibGVfYWxsb2MpOw0KPiAtDQo+IC0vKioNCj4gLSAq IGNoYXNoX3RhYmxlX2ZyZWUgLSBGcmVlIGNsb3NlZCBoYXNoIHRhYmxlDQo+IC0gKiBAdGFibGU6 IFBvaW50ZXIgdG8gdGhlIHRhYmxlIHN0cnVjdHVyZQ0KPiAtICovDQo+IC12b2lkIGNoYXNoX3Rh YmxlX2ZyZWUoc3RydWN0IGNoYXNoX3RhYmxlICp0YWJsZSkNCj4gLXsNCj4gLQlrZnJlZSh0YWJs ZS0+ZGF0YSk7DQo+IC19DQo+IC1FWFBPUlRfU1lNQk9MKGNoYXNoX3RhYmxlX2ZyZWUpOw0KPiAt DQo+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+IC0NCj4gLSNkZWZpbmUgRElWX0ZSQUMo bm9tLCBkZW5vbSwgcXVvdCwgZnJhYywgZnJhY19kaWdpdHMpIGRvIHsJCVwNCj4gLQkJdTY0IF9f bm9tID0gKG5vbSk7CQkJCQlcDQo+IC0JCXU2NCBfX2Rlbm9tID0gKGRlbm9tKTsJCQkJCVwNCj4g LQkJdTY0IF9fcXVvdCwgX19mcmFjOwkJCQkJXA0KPiAtCQl1MzIgX19yZW07CQkJCQkJXA0KPiAt CQkJCQkJCQkJXA0KPiAtCQl3aGlsZSAoX19kZW5vbSA+PiAzMikgewkJCQkJXA0KPiAtCQkJX19u b20gICA+Pj0gMTsJCQkJCVwNCj4gLQkJCV9fZGVub20gPj49IDE7CQkJCQlcDQo+IC0JCX0JCQkJ CQkJXA0KPiAtCQlfX3F1b3QgPSBfX25vbTsJCQkJCQlcDQo+IC0JCV9fcmVtICA9IGRvX2Rpdihf X3F1b3QsIF9fZGVub20pOwkJCVwNCj4gLQkJX19mcmFjID0gX19yZW0gKiAoZnJhY19kaWdpdHMp ICsgKF9fZGVub20gPj4gMSk7CVwNCj4gLQkJZG9fZGl2KF9fZnJhYywgX19kZW5vbSk7CQkJCVwN Cj4gLQkJKHF1b3QpID0gX19xdW90OwkJCQkJXA0KPiAtCQkoZnJhYykgPSBfX2ZyYWM7CQkJCQlc DQo+IC0JfSB3aGlsZSAoMCkNCj4gLQ0KPiAtdm9pZCBfX2NoYXNoX3RhYmxlX2R1bXBfc3RhdHMo c3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxlKQ0KPiAtew0KPiAtCXN0cnVjdCBjaGFzaF9pdGVy IGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIDApOw0KPiAtCXUzMiBmaWxsZWQgPSAwLCBl bXB0eSA9IDAsIHRvbWJzdG9uZXMgPSAwOw0KPiAtCXU2NCBxdW90MSwgcXVvdDI7DQo+IC0JdTMy IGZyYWMxLCBmcmFjMjsNCj4gLQ0KPiAtCWRvIHsNCj4gLQkJaWYgKGNoYXNoX2l0ZXJfaXNfdmFs aWQoaXRlcikpDQo+IC0JCQlmaWxsZWQrKzsNCj4gLQkJZWxzZSBpZiAoY2hhc2hfaXRlcl9pc19l bXB0eShpdGVyKSkNCj4gLQkJCWVtcHR5Kys7DQo+IC0JCWVsc2UNCj4gLQkJCXRvbWJzdG9uZXMr KzsNCj4gLQkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7DQo+IC0JfSB3aGlsZSAoaXRlci5zbG90KTsN Cj4gLQ0KPiAtCXByX2RlYnVnKCJjaGFzaDoga2V5IHNpemUgJXUsIHZhbHVlIHNpemUgJXVcbiIs DQo+IC0JCSB0YWJsZS0+a2V5X3NpemUsIHRhYmxlLT52YWx1ZV9zaXplKTsNCj4gLQlwcl9kZWJ1 ZygiICBTbG90cyB0b3RhbC9maWxsZWQvZW1wdHkvdG9tYnN0b25lczogJXUgLyAldSAvICV1IC8g JXVcbiIsDQo+IC0JCSAxIDw8IHRhYmxlLT5iaXRzLCBmaWxsZWQsIGVtcHR5LCB0b21ic3RvbmVz KTsNCj4gLQlpZiAodGFibGUtPmhpdHMgPiAwKSB7DQo+IC0JCURJVl9GUkFDKHRhYmxlLT5oaXRz X3N0ZXBzLCB0YWJsZS0+aGl0cywgcXVvdDEsIGZyYWMxLCAxMDAwKTsNCj4gLQkJRElWX0ZSQUMo dGFibGUtPmhpdHMgKiAxMDAwLCB0YWJsZS0+aGl0c190aW1lX25zLA0KPiAtCQkJIHF1b3QyLCBm cmFjMiwgMTAwMCk7DQo+IC0JfSBlbHNlIHsNCj4gLQkJcXVvdDEgPSBxdW90MiA9IDA7DQo+IC0J CWZyYWMxID0gZnJhYzIgPSAwOw0KPiAtCX0NCj4gLQlwcl9kZWJ1ZygiICBIaXRzICAgKGF2Zy5j b3N0LCByYXRlKTogJWxsdSAoJWxsdS4lMDN1LCAlbGx1LiUwM3UgTS9zKVxuIiwNCj4gLQkJIHRh YmxlLT5oaXRzLCBxdW90MSwgZnJhYzEsIHF1b3QyLCBmcmFjMik7DQo+IC0JaWYgKHRhYmxlLT5t aXNzID4gMCkgew0KPiAtCQlESVZfRlJBQyh0YWJsZS0+bWlzc19zdGVwcywgdGFibGUtPm1pc3Ms IHF1b3QxLCBmcmFjMSwgMTAwMCk7DQo+IC0JCURJVl9GUkFDKHRhYmxlLT5taXNzICogMTAwMCwg dGFibGUtPm1pc3NfdGltZV9ucywNCj4gLQkJCSBxdW90MiwgZnJhYzIsIDEwMDApOw0KPiAtCX0g ZWxzZSB7DQo+IC0JCXF1b3QxID0gcXVvdDIgPSAwOw0KPiAtCQlmcmFjMSA9IGZyYWMyID0gMDsN Cj4gLQl9DQo+IC0JcHJfZGVidWcoIiAgTWlzc2VzIChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVs bHUuJTAzdSwgJWxsdS4lMDN1IE0vcylcbiIsDQo+IC0JCSB0YWJsZS0+bWlzcywgcXVvdDEsIGZy YWMxLCBxdW90MiwgZnJhYzIpOw0KPiAtCWlmICh0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzID4g MCkgew0KPiAtCQlESVZfRlJBQyh0YWJsZS0+aGl0c19zdGVwcyArIHRhYmxlLT5taXNzX3N0ZXBz LA0KPiAtCQkJIHRhYmxlLT5oaXRzICsgdGFibGUtPm1pc3MsIHF1b3QxLCBmcmFjMSwgMTAwMCk7 DQo+IC0JCURJVl9GUkFDKCh0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzKSAqIDEwMDAsDQo+IC0J CQkgKHRhYmxlLT5oaXRzX3RpbWVfbnMgKyB0YWJsZS0+bWlzc190aW1lX25zKSwNCj4gLQkJCSBx dW90MiwgZnJhYzIsIDEwMDApOw0KPiAtCX0gZWxzZSB7DQo+IC0JCXF1b3QxID0gcXVvdDIgPSAw Ow0KPiAtCQlmcmFjMSA9IGZyYWMyID0gMDsNCj4gLQl9DQo+IC0JcHJfZGVidWcoIiAgVG90YWwg IChhdmcuY29zdCwgcmF0ZSk6ICVsbHUgKCVsbHUuJTAzdSwgJWxsdS4lMDN1IE0vcylcbiIsDQo+ IC0JCSB0YWJsZS0+aGl0cyArIHRhYmxlLT5taXNzLCBxdW90MSwgZnJhYzEsIHF1b3QyLCBmcmFj Mik7DQo+IC0JaWYgKHRhYmxlLT5yZWxvY3MgPiAwKSB7DQo+IC0JCURJVl9GUkFDKHRhYmxlLT5o aXRzICsgdGFibGUtPm1pc3MsIHRhYmxlLT5yZWxvY3MsDQo+IC0JCQkgcXVvdDEsIGZyYWMxLCAx MDAwKTsNCj4gLQkJRElWX0ZSQUModGFibGUtPnJlbG9jX2Rpc3QsIHRhYmxlLT5yZWxvY3MsIHF1 b3QyLCBmcmFjMiwgMTAwMCk7DQo+IC0JCXByX2RlYnVnKCIgIFJlbG9jYXRpb25zIChmcmVxLCBh dmcuZGlzdCk6ICVsbHUgKDE6JWxsdS4lMDN1LCAlbGx1LiUwM3UpXG4iLA0KPiAtCQkJIHRhYmxl LT5yZWxvY3MsIHF1b3QxLCBmcmFjMSwgcXVvdDIsIGZyYWMyKTsNCj4gLQl9IGVsc2Ugew0KPiAt CQlwcl9kZWJ1ZygiICBObyByZWxvY2F0aW9uc1xuIik7DQo+IC0JfQ0KPiAtfQ0KPiAtRVhQT1JU X1NZTUJPTChfX2NoYXNoX3RhYmxlX2R1bXBfc3RhdHMpOw0KPiAtDQo+IC0jdW5kZWYgRElWX0ZS QUMNCj4gLSNlbmRpZg0KPiAtDQo+IC0jZGVmaW5lIENIQVNIX0lOQyh0YWJsZSwgYSkgKChhKSA9 ICgoYSkgKyAxKSAmICh0YWJsZSktPnNpemVfbWFzaykNCj4gLSNkZWZpbmUgQ0hBU0hfQUREKHRh YmxlLCBhLCBiKSAoKChhKSArIChiKSkgJiAodGFibGUpLT5zaXplX21hc2spDQo+IC0jZGVmaW5l IENIQVNIX1NVQih0YWJsZSwgYSwgYikgKCgoYSkgLSAoYikpICYgKHRhYmxlKS0+c2l6ZV9tYXNr KQ0KPiAtI2RlZmluZSBDSEFTSF9JTl9SQU5HRSh0YWJsZSwgc2xvdCwgZmlyc3QsIGxhc3QpIFwN Cj4gLQkoQ0hBU0hfU1VCKHRhYmxlLCBzbG90LCBmaXJzdCkgPD0gQ0hBU0hfU1VCKHRhYmxlLCBs YXN0LCBmaXJzdCkpDQo+IC0NCj4gLS8qI2RlZmluZSBDSEFTSF9ERUJVRyBVbmNvbW1lbnQgdGhp cyB0byBlbmFibGUgdmVyYm9zZSBkZWJ1ZyBvdXRwdXQqLw0KPiAtI2lmZGVmIENIQVNIX0RFQlVH DQo+IC1zdGF0aWMgdm9pZCBjaGFzaF90YWJsZV9kdW1wKHN0cnVjdCBfX2NoYXNoX3RhYmxlICp0 YWJsZSkNCj4gLXsNCj4gLQlzdHJ1Y3QgY2hhc2hfaXRlciBpdGVyID0gQ0hBU0hfSVRFUl9JTklU KHRhYmxlLCAwKTsNCj4gLQ0KPiAtCWRvIHsNCj4gLQkJaWYgKChpdGVyLnNsb3QgJiAzKSA9PSAw KQ0KPiAtCQkJcHJfZGVidWcoIiUwNHg6ICIsIGl0ZXIuc2xvdCk7DQo+IC0NCj4gLQkJaWYgKGNo YXNoX2l0ZXJfaXNfdmFsaWQoaXRlcikpDQo+IC0JCQlwcl9kZWJ1ZygiWyUwMTZsbHhdICIsIGNo YXNoX2l0ZXJfa2V5KGl0ZXIpKTsNCj4gLQkJZWxzZSBpZiAoY2hhc2hfaXRlcl9pc19lbXB0eShp dGVyKSkNCj4gLQkJCXByX2RlYnVnKCJbICAgIDxlbXB0eT4gICAgIF0gIik7DQo+IC0JCWVsc2UN Cj4gLQkJCXByX2RlYnVnKCJbICA8dG9tYnN0b25lPiAgIF0gIik7DQo+IC0NCj4gLQkJaWYgKChp dGVyLnNsb3QgJiAzKSA9PSAzKQ0KPiAtCQkJcHJfZGVidWcoIlxuIik7DQo+IC0NCj4gLQkJQ0hB U0hfSVRFUl9JTkMoaXRlcik7DQo+IC0JfSB3aGlsZSAoaXRlci5zbG90KTsNCj4gLQ0KPiAtCWlm ICgoaXRlci5zbG90ICYgMykgIT0gMCkNCj4gLQkJcHJfZGVidWcoIlxuIik7DQo+IC19DQo+IC0N Cj4gLXN0YXRpYyBpbnQgY2hhc2hfdGFibGVfY2hlY2soc3RydWN0IF9fY2hhc2hfdGFibGUgKnRh YmxlKQ0KPiAtew0KPiAtCXUzMiBoYXNoOw0KPiAtCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBD SEFTSF9JVEVSX0lOSVQodGFibGUsIDApOw0KPiAtCXN0cnVjdCBjaGFzaF9pdGVyIGN1ciA9IENI QVNIX0lURVJfSU5JVCh0YWJsZSwgMCk7DQo+IC0NCj4gLQlkbyB7DQo+IC0JCWlmICghY2hhc2hf aXRlcl9pc192YWxpZChpdGVyKSkgew0KPiAtCQkJQ0hBU0hfSVRFUl9JTkMoaXRlcik7DQo+IC0J CQljb250aW51ZTsNCj4gLQkJfQ0KPiAtDQo+IC0JCWhhc2ggPSBjaGFzaF9pdGVyX2hhc2goaXRl cik7DQo+IC0JCUNIQVNIX0lURVJfU0VUKGN1ciwgaGFzaCk7DQo+IC0JCXdoaWxlIChjdXIuc2xv dCAhPSBpdGVyLnNsb3QpIHsNCj4gLQkJCWlmIChjaGFzaF9pdGVyX2lzX2VtcHR5KGN1cikpIHsN Cj4gLQkJCQlwcl9lcnIoIlBhdGggdG8gZWxlbWVudCBhdCAleCB3aXRoIGhhc2ggJXggYnJva2Vu IGF0IHNsb3QgJXhcbiIsDQo+IC0JCQkJICAgICAgIGl0ZXIuc2xvdCwgaGFzaCwgY3VyLnNsb3Qp Ow0KPiAtCQkJCWNoYXNoX3RhYmxlX2R1bXAodGFibGUpOw0KPiAtCQkJCXJldHVybiAtRUlOVkFM Ow0KPiAtCQkJfQ0KPiAtCQkJQ0hBU0hfSVRFUl9JTkMoY3VyKTsNCj4gLQkJfQ0KPiAtDQo+IC0J CUNIQVNIX0lURVJfSU5DKGl0ZXIpOw0KPiAtCX0gd2hpbGUgKGl0ZXIuc2xvdCk7DQo+IC0NCj4g LQlyZXR1cm4gMDsNCj4gLX0NCj4gLSNlbmRpZg0KPiAtDQo+IC1zdGF0aWMgdm9pZCBjaGFzaF9p dGVyX3JlbG9jYXRlKHN0cnVjdCBjaGFzaF9pdGVyIGRzdCwgc3RydWN0IGNoYXNoX2l0ZXIgc3Jj KQ0KPiAtew0KPiAtCUJVR19PTihzcmMudGFibGUgPT0gZHN0LnRhYmxlICYmIHNyYy5zbG90ID09 IGRzdC5zbG90KTsNCj4gLQlCVUdfT04oc3JjLnRhYmxlLT5rZXlfc2l6ZSAhPSBkc3QudGFibGUt PmtleV9zaXplKTsNCj4gLQlCVUdfT04oc3JjLnRhYmxlLT52YWx1ZV9zaXplICE9IGRzdC50YWJs ZS0+dmFsdWVfc2l6ZSk7DQo+IC0NCj4gLQlpZiAoZHN0LnRhYmxlLT5rZXlfc2l6ZSA9PSA0KQ0K PiAtCQlkc3QudGFibGUtPmtleXMzMltkc3Quc2xvdF0gPSBzcmMudGFibGUtPmtleXMzMltzcmMu c2xvdF07DQo+IC0JZWxzZQ0KPiAtCQlkc3QudGFibGUtPmtleXM2NFtkc3Quc2xvdF0gPSBzcmMu dGFibGUtPmtleXM2NFtzcmMuc2xvdF07DQo+IC0NCj4gLQlpZiAoZHN0LnRhYmxlLT52YWx1ZV9z aXplKQ0KPiAtCQltZW1jcHkoY2hhc2hfaXRlcl92YWx1ZShkc3QpLCBjaGFzaF9pdGVyX3ZhbHVl KHNyYyksDQo+IC0JCSAgICAgICBkc3QudGFibGUtPnZhbHVlX3NpemUpOw0KPiAtDQo+IC0JY2hh c2hfaXRlcl9zZXRfdmFsaWQoZHN0KTsNCj4gLQljaGFzaF9pdGVyX3NldF9pbnZhbGlkKHNyYyk7 DQo+IC0NCj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4gLQlpZiAoc3JjLnRhYmxlID09 IGRzdC50YWJsZSkgew0KPiAtCQlkc3QudGFibGUtPnJlbG9jcysrOw0KPiAtCQlkc3QudGFibGUt PnJlbG9jX2Rpc3QgKz0NCj4gLQkJCUNIQVNIX1NVQihkc3QudGFibGUsIHNyYy5zbG90LCBkc3Qu c2xvdCk7DQo+IC0JfQ0KPiAtI2VuZGlmDQo+IC19DQo+IC0NCj4gLS8qKg0KPiAtICogX19jaGFz aF90YWJsZV9maW5kIC0gSGVscGVyIGZvciBsb29raW5nIHVwIGEgaGFzaCB0YWJsZSBlbnRyeQ0K PiAtICogQGl0ZXI6IFBvaW50ZXIgdG8gaGFzaCB0YWJsZSBpdGVyYXRvcg0KPiAtICogQGtleTog S2V5IG9mIHRoZSBlbnRyeSB0byBmaW5kDQo+IC0gKiBAZm9yX3JlbW92YWw6IHNldCB0byB0cnVl IGlmIHRoZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBzb29uDQo+IC0gKg0KPiAtICogU2VhcmNo ZXMgZm9yIGFuIGVudHJ5IGluIHRoZSBoYXNoIHRhYmxlIHdpdGggYSBnaXZlbiBrZXkuIGl0ZXIg bXVzdA0KPiAtICogYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlciB0byBwb2ludCB0byB0aGUg aG9tZSBwb3NpdGlvbiBvZiB0aGUNCj4gLSAqIGh5cG90aGV0aWNhbCBlbnRyeSwgaS5lLiBpdCBt dXN0IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGhhc2ggdGFibGUNCj4gLSAqIGFuZCB0aGUga2V5 J3MgaGFzaCBhcyB0aGUgaW5pdGlhbCBzbG90IGZvciB0aGUgc2VhcmNoLg0KPiAtICoNCj4gLSAq IFRoaXMgZnVuY3Rpb24gYWxzbyBkb2VzIHNvbWUgbG9jYWwgY2xlYW4tdXAgdG8gc3BlZWQgdXAg ZnV0dXJlDQo+IC0gKiBsb29rLXVwcyBieSByZWxvY2F0aW5nIGVudHJpZXMgdG8gYmV0dGVyIHNs b3RzIGFuZCByZW1vdmluZw0KPiAtICogdG9tYnN0b25lcyB0aGF0IGFyZSBubyBsb25nZXIgbmVl ZGVkLg0KPiAtICoNCj4gLSAqIElmIEBmb3JfcmVtb3ZhbCBpcyB0cnVlLCB0aGUgZnVuY3Rpb24g YXZvaWRzIHJlbG9jYXRpbmcgdGhlIGVudHJ5DQo+IC0gKiB0aGF0IGlzIGJlaW5nIHJldHVybmVk Lg0KPiAtICoNCj4gLSAqIFJldHVybnMgMCBpZiB0aGUgc2VhcmNoIGlzIHN1Y2Nlc3NmdWwuIElu IHRoaXMgY2FzZSBpdGVyIGlzIHVwZGF0ZWQNCj4gLSAqIHRvIHBvaW50IHRvIHRoZSBmb3VuZCBl bnRyeS4gT3RoZXJ3aXNlICUtRUlOVkFMIGlzIHJldHVybmVkIGFuZCB0aGUNCj4gLSAqIGl0ZXIg aXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZmlyc3QgYXZhaWxhYmxlIHNsb3QgZm9yIHRoZSBn aXZlbg0KPiAtICoga2V5LiBJZiB0aGUgdGFibGUgaXMgZnVsbCwgdGhlIHNsb3QgaXMgc2V0IHRv IC0xLg0KPiAtICovDQo+IC1zdGF0aWMgaW50IGNoYXNoX3RhYmxlX2ZpbmQoc3RydWN0IGNoYXNo X2l0ZXIgKml0ZXIsIHU2NCBrZXksDQo+IC0JCQkgICAgYm9vbCBmb3JfcmVtb3ZhbCkNCj4gLXsN Cj4gLSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4gLQl1NjQgdHMxID0gbG9jYWxfY2xvY2so KTsNCj4gLSNlbmRpZg0KPiAtCXUzMiBoYXNoID0gaXRlci0+c2xvdDsNCj4gLQlzdHJ1Y3QgY2hh c2hfaXRlciBmaXJzdF9yZWR1bmRhbnQgPSBDSEFTSF9JVEVSX0lOSVQoaXRlci0+dGFibGUsIC0x KTsNCj4gLQlpbnQgZmlyc3RfYXZhaWwgPSAoZm9yX3JlbW92YWwgPyAtMiA6IC0xKTsNCj4gLQ0K PiAtCXdoaWxlICghY2hhc2hfaXRlcl9pc192YWxpZCgqaXRlcikgfHwgY2hhc2hfaXRlcl9rZXko Kml0ZXIpICE9IGtleSkgew0KPiAtCQlpZiAoY2hhc2hfaXRlcl9pc19lbXB0eSgqaXRlcikpIHsN Cj4gLQkJCS8qIEZvdW5kIGFuIGVtcHR5IHNsb3QsIHdoaWNoIGVuZHMgdGhlDQo+IC0JCQkgKiBz ZWFyY2guIENsZWFuIHVwIGFueSBwcmVjZWRpbmcgdG9tYnN0b25lcw0KPiAtCQkJICogdGhhdCBh cmUgbm8gbG9uZ2VyIG5lZWRlZCBiZWNhdXNlIHRoZXkgbGVhZA0KPiAtCQkJICogdG8gbm8td2hl cmUNCj4gLQkJCSAqLw0KPiAtCQkJaWYgKChpbnQpZmlyc3RfcmVkdW5kYW50LnNsb3QgPCAwKQ0K PiAtCQkJCWdvdG8gbm90X2ZvdW5kOw0KPiAtCQkJd2hpbGUgKGZpcnN0X3JlZHVuZGFudC5zbG90 ICE9IGl0ZXItPnNsb3QpIHsNCj4gLQkJCQlpZiAoIWNoYXNoX2l0ZXJfaXNfdmFsaWQoZmlyc3Rf cmVkdW5kYW50KSkNCj4gLQkJCQkJY2hhc2hfaXRlcl9zZXRfZW1wdHkoZmlyc3RfcmVkdW5kYW50 KTsNCj4gLQkJCQlDSEFTSF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOw0KPiAtCQkJfQ0KPiAt I2lmZGVmIENIQVNIX0RFQlVHDQo+IC0JCQljaGFzaF90YWJsZV9jaGVjayhpdGVyLT50YWJsZSk7 DQo+IC0jZW5kaWYNCj4gLQkJCWdvdG8gbm90X2ZvdW5kOw0KPiAtCQl9IGVsc2UgaWYgKCFjaGFz aF9pdGVyX2lzX3ZhbGlkKCppdGVyKSkgew0KPiAtCQkJLyogRm91bmQgYSB0b21ic3RvbmUuIFJl bWVtYmVyIGl0IGFzIGNhbmRpZGF0ZQ0KPiAtCQkJICogZm9yIHJlbG9jYXRpbmcgdGhlIGVudHJ5 IHdlJ3JlIGxvb2tpbmcgZm9yDQo+IC0JCQkgKiBvciBmb3IgYWRkaW5nIGEgbmV3IGVudHJ5IHdp dGggdGhlIGdpdmVuIGtleQ0KPiAtCQkJICovDQo+IC0JCQlpZiAoZmlyc3RfYXZhaWwgPT0gLTEp DQo+IC0JCQkJZmlyc3RfYXZhaWwgPSBpdGVyLT5zbG90Ow0KPiAtCQkJLyogT3IgbWFyayBpdCBh cyB0aGUgc3RhcnQgb2YgYSBzZXJpZXMgb2YNCj4gLQkJCSAqIHBvdGVudGlhbGx5IHJlZHVuZGFu dCB0b21ic3RvbmVzDQo+IC0JCQkgKi8NCj4gLQkJCWVsc2UgaWYgKGZpcnN0X3JlZHVuZGFudC5z bG90ID09IC0xKQ0KPiAtCQkJCUNIQVNIX0lURVJfU0VUKGZpcnN0X3JlZHVuZGFudCwgaXRlci0+ c2xvdCk7DQo+IC0JCX0gZWxzZSBpZiAoZmlyc3RfcmVkdW5kYW50LnNsb3QgPj0gMCkgew0KPiAt CQkJLyogRm91bmQgYSB2YWxpZCwgb2NjdXBpZWQgc2xvdCB3aXRoIGENCj4gLQkJCSAqIHByZWNl ZGluZyBzZXJpZXMgb2YgdG9tYnN0b25lcy4gUmVsb2NhdGUgaXQNCj4gLQkJCSAqIHRvIGEgYmV0 dGVyIHBvc2l0aW9uIHRoYXQgbm8gbG9uZ2VyIGRlcGVuZHMNCj4gLQkJCSAqIG9uIHRob3NlIHRv bWJzdG9uZXMNCj4gLQkJCSAqLw0KPiAtCQkJdTMyIGN1cl9oYXNoID0gY2hhc2hfaXRlcl9oYXNo KCppdGVyKTsNCj4gLQ0KPiAtCQkJaWYgKCFDSEFTSF9JTl9SQU5HRShpdGVyLT50YWJsZSwgY3Vy X2hhc2gsDQo+IC0JCQkJCSAgICBmaXJzdF9yZWR1bmRhbnQuc2xvdCArIDEsDQo+IC0JCQkJCSAg ICBpdGVyLT5zbG90KSkgew0KPiAtCQkJCS8qIFRoaXMgZW50cnkgaGFzIGEgaGFzaCBhdCBvciBi ZWZvcmUNCj4gLQkJCQkgKiB0aGUgZmlyc3QgdG9tYnN0b25lIHdlIGZvdW5kLiBXZQ0KPiAtCQkJ CSAqIGNhbiByZWxvY2F0ZSBpdCB0byB0aGF0IHRvbWJzdG9uZQ0KPiAtCQkJCSAqIGFuZCBhZHZh bmNlIHRvIHRoZSBuZXh0IHRvbWJzdG9uZQ0KPiAtCQkJCSAqLw0KPiAtCQkJCWNoYXNoX2l0ZXJf cmVsb2NhdGUoZmlyc3RfcmVkdW5kYW50LCAqaXRlcik7DQo+IC0JCQkJZG8gew0KPiAtCQkJCQlD SEFTSF9JVEVSX0lOQyhmaXJzdF9yZWR1bmRhbnQpOw0KPiAtCQkJCX0gd2hpbGUgKGNoYXNoX2l0 ZXJfaXNfdmFsaWQoZmlyc3RfcmVkdW5kYW50KSk7DQo+IC0JCQl9IGVsc2UgaWYgKGN1cl9oYXNo ICE9IGl0ZXItPnNsb3QpIHsNCj4gLQkJCQkvKiBSZWxvY2F0ZSBlbnRyeSB0byBpdHMgaG9tZSBw b3NpdGlvbg0KPiAtCQkJCSAqIG9yIGFzIGNsb3NlIGFzIHBvc3NpYmxlIHNvIGl0IG5vDQo+IC0J CQkJICogbG9uZ2VyIGRlcGVuZHMgb24gYW55IHByZWNlZGluZw0KPiAtCQkJCSAqIHRvbWJzdG9u ZXMNCj4gLQkJCQkgKi8NCj4gLQkJCQlzdHJ1Y3QgY2hhc2hfaXRlciBuZXdfaXRlciA9DQo+IC0J CQkJCUNIQVNIX0lURVJfSU5JVChpdGVyLT50YWJsZSwgY3VyX2hhc2gpOw0KPiAtDQo+IC0JCQkJ d2hpbGUgKG5ld19pdGVyLnNsb3QgIT0gaXRlci0+c2xvdCAmJg0KPiAtCQkJCSAgICAgICBjaGFz aF9pdGVyX2lzX3ZhbGlkKG5ld19pdGVyKSkNCj4gLQkJCQkJQ0hBU0hfSVRFUl9JTkMobmV3X2l0 ZXIpOw0KPiAtDQo+IC0JCQkJaWYgKG5ld19pdGVyLnNsb3QgIT0gaXRlci0+c2xvdCkNCj4gLQkJ CQkJY2hhc2hfaXRlcl9yZWxvY2F0ZShuZXdfaXRlciwgKml0ZXIpOw0KPiAtCQkJfQ0KPiAtCQl9 DQo+IC0NCj4gLQkJQ0hBU0hfSVRFUl9JTkMoKml0ZXIpOw0KPiAtCQlpZiAoaXRlci0+c2xvdCA9 PSBoYXNoKSB7DQo+IC0JCQlpdGVyLT5zbG90ID0gLTE7DQo+IC0JCQlnb3RvIG5vdF9mb3VuZDsN Cj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtI2lmZGVmIENPTkZJR19DSEFTSF9TVEFUUw0KPiAtCWl0 ZXItPnRhYmxlLT5oaXRzKys7DQo+IC0JaXRlci0+dGFibGUtPmhpdHNfc3RlcHMgKz0gQ0hBU0hf U1VCKGl0ZXItPnRhYmxlLCBpdGVyLT5zbG90LCBoYXNoKSArIDE7DQo+IC0jZW5kaWYNCj4gLQ0K PiAtCWlmIChmaXJzdF9hdmFpbCA+PSAwKSB7DQo+IC0JCUNIQVNIX0lURVJfU0VUKGZpcnN0X3Jl ZHVuZGFudCwgZmlyc3RfYXZhaWwpOw0KPiAtCQljaGFzaF9pdGVyX3JlbG9jYXRlKGZpcnN0X3Jl ZHVuZGFudCwgKml0ZXIpOw0KPiAtCQlpdGVyLT5zbG90ID0gZmlyc3RfcmVkdW5kYW50LnNsb3Q7 DQo+IC0JCWl0ZXItPm1hc2sgPSBmaXJzdF9yZWR1bmRhbnQubWFzazsNCj4gLQl9DQo+IC0NCj4g LSNpZmRlZiBDT05GSUdfQ0hBU0hfU1RBVFMNCj4gLQlpdGVyLT50YWJsZS0+aGl0c190aW1lX25z ICs9IGxvY2FsX2Nsb2NrKCkgLSB0czE7DQo+IC0jZW5kaWYNCj4gLQ0KPiAtCXJldHVybiAwOw0K PiAtDQo+IC1ub3RfZm91bmQ6DQo+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+IC0JaXRl ci0+dGFibGUtPm1pc3MrKzsNCj4gLQlpdGVyLT50YWJsZS0+bWlzc19zdGVwcyArPSAoaXRlci0+ c2xvdCA8IDApID8NCj4gLQkJKDEgPDwgaXRlci0+dGFibGUtPmJpdHMpIDoNCj4gLQkJQ0hBU0hf U1VCKGl0ZXItPnRhYmxlLCBpdGVyLT5zbG90LCBoYXNoKSArIDE7DQo+IC0jZW5kaWYNCj4gLQ0K PiAtCWlmIChmaXJzdF9hdmFpbCA+PSAwKQ0KPiAtCQlDSEFTSF9JVEVSX1NFVCgqaXRlciwgZmly c3RfYXZhaWwpOw0KPiAtDQo+IC0jaWZkZWYgQ09ORklHX0NIQVNIX1NUQVRTDQo+IC0JaXRlci0+ dGFibGUtPm1pc3NfdGltZV9ucyArPSBsb2NhbF9jbG9jaygpIC0gdHMxOw0KPiAtI2VuZGlmDQo+ IC0NCj4gLQlyZXR1cm4gLUVJTlZBTDsNCj4gLX0NCj4gLQ0KPiAtaW50IF9fY2hhc2hfdGFibGVf Y29weV9pbihzdHJ1Y3QgX19jaGFzaF90YWJsZSAqdGFibGUsIHU2NCBrZXksDQo+IC0JCQkgIGNv bnN0IHZvaWQgKnZhbHVlKQ0KPiAtew0KPiAtCXUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9 PSA0KSA/DQo+IC0JCWhhc2hfMzIoa2V5LCB0YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFi bGUtPmJpdHMpOw0KPiAtCXN0cnVjdCBjaGFzaF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQo dGFibGUsIGhhc2gpOw0KPiAtCWludCByID0gY2hhc2hfdGFibGVfZmluZCgmaXRlciwga2V5LCBm YWxzZSk7DQo+IC0NCj4gLQkvKiBGb3VuZCBhbiBleGlzdGluZyBlbnRyeSAqLw0KPiAtCWlmICgh cikgew0KPiAtCQlpZiAodmFsdWUgJiYgdGFibGUtPnZhbHVlX3NpemUpDQo+IC0JCQltZW1jcHko Y2hhc2hfaXRlcl92YWx1ZShpdGVyKSwgdmFsdWUsDQo+IC0JCQkgICAgICAgdGFibGUtPnZhbHVl X3NpemUpOw0KPiAtCQlyZXR1cm4gMTsNCj4gLQl9DQo+IC0NCj4gLQkvKiBJcyB0aGVyZSBhIHBs YWNlIHRvIGFkZCBhIG5ldyBlbnRyeT8gKi8NCj4gLQlpZiAoaXRlci5zbG90IDwgMCkgew0KPiAt CQlwcl9lcnIoIkhhc2ggdGFibGUgb3ZlcmZsb3dcbiIpOw0KPiAtCQlyZXR1cm4gLUVOT01FTTsN Cj4gLQl9DQo+IC0NCj4gLQljaGFzaF9pdGVyX3NldF92YWxpZChpdGVyKTsNCj4gLQ0KPiAtCWlm ICh0YWJsZS0+a2V5X3NpemUgPT0gNCkNCj4gLQkJdGFibGUtPmtleXMzMltpdGVyLnNsb3RdID0g a2V5Ow0KPiAtCWVsc2UNCj4gLQkJdGFibGUtPmtleXM2NFtpdGVyLnNsb3RdID0ga2V5Ow0KPiAt CWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6ZSkNCj4gLQkJbWVtY3B5KGNoYXNoX2l0ZXJf dmFsdWUoaXRlciksIHZhbHVlLCB0YWJsZS0+dmFsdWVfc2l6ZSk7DQo+IC0NCj4gLQlyZXR1cm4g MDsNCj4gLX0NCj4gLUVYUE9SVF9TWU1CT0woX19jaGFzaF90YWJsZV9jb3B5X2luKTsNCj4gLQ0K PiAtaW50IF9fY2hhc2hfdGFibGVfY29weV9vdXQoc3RydWN0IF9fY2hhc2hfdGFibGUgKnRhYmxl LCB1NjQga2V5LA0KPiAtCQkJICAgdm9pZCAqdmFsdWUsIGJvb2wgcmVtb3ZlKQ0KPiAtew0KPiAt CXUzMiBoYXNoID0gKHRhYmxlLT5rZXlfc2l6ZSA9PSA0KSA/DQo+IC0JCWhhc2hfMzIoa2V5LCB0 YWJsZS0+Yml0cykgOiBoYXNoXzY0KGtleSwgdGFibGUtPmJpdHMpOw0KPiAtCXN0cnVjdCBjaGFz aF9pdGVyIGl0ZXIgPSBDSEFTSF9JVEVSX0lOSVQodGFibGUsIGhhc2gpOw0KPiAtCWludCByID0g Y2hhc2hfdGFibGVfZmluZCgmaXRlciwga2V5LCByZW1vdmUpOw0KPiAtDQo+IC0JaWYgKHIgPCAw KQ0KPiAtCQlyZXR1cm4gcjsNCj4gLQ0KPiAtCWlmICh2YWx1ZSAmJiB0YWJsZS0+dmFsdWVfc2l6 ZSkNCj4gLQkJbWVtY3B5KHZhbHVlLCBjaGFzaF9pdGVyX3ZhbHVlKGl0ZXIpLCB0YWJsZS0+dmFs dWVfc2l6ZSk7DQo+IC0NCj4gLQlpZiAocmVtb3ZlKQ0KPiAtCQljaGFzaF9pdGVyX3NldF9pbnZh bGlkKGl0ZXIpOw0KPiAtDQo+IC0JcmV0dXJuIGl0ZXIuc2xvdDsNCj4gLX0NCj4gLUVYUE9SVF9T WU1CT0woX19jaGFzaF90YWJsZV9jb3B5X291dCk7DQo+IC0NCj4gLSNpZmRlZiBDT05GSUdfQ0hB U0hfU0VMRlRFU1QNCj4gLS8qKg0KPiAtICogY2hhc2hfc2VsZl90ZXN0IC0gUnVuIGEgc2VsZi10 ZXN0IG9mIHRoZSBoYXNoIHRhYmxlIGltcGxlbWVudGF0aW9uDQo+IC0gKiBAYml0czogVGFibGUg c2l6ZSB3aWxsIGJlIDJeYml0cyBlbnRyaWVzDQo+IC0gKiBAa2V5X3NpemU6IFNpemUgb2YgaGFz aCBrZXlzIGluIGJ5dGVzLCA0IG9yIDgNCj4gLSAqIEBtaW5fZmlsbDogTWluaW11bSBmaWxsIGxl dmVsIGR1cmluZyB0aGUgdGVzdA0KPiAtICogQG1heF9maWxsOiBNYXhpbXVtIGZpbGwgbGV2ZWwg ZHVyaW5nIHRoZSB0ZXN0DQo+IC0gKiBAaXRlcmF0aW9uczogTnVtYmVyIG9mIHRlc3QgaXRlcmF0 aW9ucw0KPiAtICoNCj4gLSAqIFRoZSB0ZXN0IGFkZHMgYW5kIHJlbW92ZXMgZW50cmllcyBmcm9t IGEgaGFzaCB0YWJsZSwgY3ljbGluZyB0aGUNCj4gLSAqIGZpbGwgbGV2ZWwgYmV0d2VlbiBtaW5f ZmlsbCBhbmQgbWF4X2ZpbGwgZW50cmllcy4gQWxzbyB0ZXN0cyBsb29rdXANCj4gLSAqIGFuZCB2 YWx1ZSByZXRyaWV2YWwuDQo+IC0gKi8NCj4gLXN0YXRpYyBpbnQgX19pbml0IGNoYXNoX3NlbGZf dGVzdCh1OCBiaXRzLCB1OCBrZXlfc2l6ZSwNCj4gLQkJCQkgIGludCBtaW5fZmlsbCwgaW50IG1h eF9maWxsLA0KPiAtCQkJCSAgdTY0IGl0ZXJhdGlvbnMpDQo+IC17DQo+IC0Jc3RydWN0IGNoYXNo X3RhYmxlIHRhYmxlOw0KPiAtCWludCByZXQ7DQo+IC0JdTY0IGFkZF9jb3VudCwgcm12X2NvdW50 Ow0KPiAtCXU2NCB2YWx1ZTsNCj4gLQ0KPiAtCWlmIChrZXlfc2l6ZSA9PSA0ICYmIGl0ZXJhdGlv bnMgPiAweGZmZmZmZmZmKQ0KPiAtCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQlpZiAobWluX2ZpbGwg Pj0gbWF4X2ZpbGwpDQo+IC0JCXJldHVybiAtRUlOVkFMOw0KPiAtDQo+IC0JcmV0ID0gY2hhc2hf dGFibGVfYWxsb2MoJnRhYmxlLCBiaXRzLCBrZXlfc2l6ZSwgc2l6ZW9mKHU2NCksDQo+IC0JCQkJ R0ZQX0tFUk5FTCk7DQo+IC0JaWYgKHJldCkgew0KPiAtCQlwcl9lcnIoImNoYXNoX3RhYmxlX2Fs bG9jIGZhaWxlZDogJWRcbiIsIHJldCk7DQo+IC0JCXJldHVybiByZXQ7DQo+IC0JfQ0KPiAtDQo+ IC0JZm9yIChhZGRfY291bnQgPSAwLCBybXZfY291bnQgPSAwOyBhZGRfY291bnQgPCBpdGVyYXRp b25zOw0KPiAtCSAgICAgYWRkX2NvdW50KyspIHsNCj4gLQkJLyogV2hlbiB3ZSBoaXQgdGhlIG1h eF9maWxsIGxldmVsLCByZW1vdmUgZW50cmllcyBkb3duDQo+IC0JCSAqIHRvIG1pbl9maWxsDQo+ IC0JCSAqLw0KPiAtCQlpZiAoYWRkX2NvdW50IC0gcm12X2NvdW50ID09IG1heF9maWxsKSB7DQo+ IC0JCQl1NjQgZmluZF9jb3VudCA9IHJtdl9jb3VudDsNCj4gLQ0KPiAtCQkJLyogRmlyc3QgdHJ5 IHRvIGZpbmQgYWxsIGVudHJpZXMgdGhhdCB3ZSdyZQ0KPiAtCQkJICogYWJvdXQgdG8gcmVtb3Zl LCBjb25maXJtIHRoZWlyIHZhbHVlLCB0ZXN0DQo+IC0JCQkgKiB3cml0aW5nIHRoZW0gYmFjayBh IHNlY29uZCB0aW1lLg0KPiAtCQkJICovDQo+IC0JCQlmb3IgKDsgYWRkX2NvdW50IC0gZmluZF9j b3VudCA+IG1pbl9maWxsOw0KPiAtCQkJICAgICBmaW5kX2NvdW50KyspIHsNCj4gLQkJCQlyZXQg PSBjaGFzaF90YWJsZV9jb3B5X291dCgmdGFibGUsIGZpbmRfY291bnQsDQo+IC0JCQkJCQkJICAg JnZhbHVlKTsNCj4gLQkJCQlpZiAocmV0IDwgMCkgew0KPiAtCQkJCQlwcl9lcnIoImNoYXNoX3Rh YmxlX2NvcHlfb3V0IGZhaWxlZDogJWRcbiIsDQo+IC0JCQkJCSAgICAgICByZXQpOw0KPiAtCQkJ CQlnb3RvIG91dDsNCj4gLQkJCQl9DQo+IC0JCQkJaWYgKHZhbHVlICE9IH5maW5kX2NvdW50KSB7 DQo+IC0JCQkJCXByX2VycigiV3JvbmcgdmFsdWUgcmV0cmlldmVkIGZvciBrZXkgMHglbGx4LCBl eHBlY3RlZCAweCVsbHggZ290IDB4JWxseFxuIiwNCj4gLQkJCQkJICAgICAgIGZpbmRfY291bnQs IH5maW5kX2NvdW50LCB2YWx1ZSk7DQo+IC0jaWZkZWYgQ0hBU0hfREVCVUcNCj4gLQkJCQkJY2hh c2hfdGFibGVfZHVtcCgmdGFibGUudGFibGUpOw0KPiAtI2VuZGlmDQo+IC0JCQkJCXJldCA9IC1F RkFVTFQ7DQo+IC0JCQkJCWdvdG8gb3V0Ow0KPiAtCQkJCX0NCj4gLQkJCQlyZXQgPSBjaGFzaF90 YWJsZV9jb3B5X2luKCZ0YWJsZSwgZmluZF9jb3VudCwNCj4gLQkJCQkJCQkgICZ2YWx1ZSk7DQo+ IC0JCQkJaWYgKHJldCAhPSAxKSB7DQo+IC0JCQkJCXByX2VycigiY29weV9pbiBzZWNvbmQgdGlt ZSByZXR1cm5lZCAlZCwgZXhwZWN0ZWQgMVxuIiwNCj4gLQkJCQkJICAgICAgIHJldCk7DQo+IC0J CQkJCXJldCA9IC1FRkFVTFQ7DQo+IC0JCQkJCWdvdG8gb3V0Ow0KPiAtCQkJCX0NCj4gLQkJCX0N Cj4gLQkJCS8qIFJlbW92ZSB0aGVtIHVudGlsIHdlIGhpdCBtaW5fZmlsbCBsZXZlbCAqLw0KPiAt CQkJZm9yICg7IGFkZF9jb3VudCAtIHJtdl9jb3VudCA+IG1pbl9maWxsOyBybXZfY291bnQrKykg ew0KPiAtCQkJCXJldCA9IGNoYXNoX3RhYmxlX3JlbW92ZSgmdGFibGUsIHJtdl9jb3VudCwNCj4g LQkJCQkJCQkgTlVMTCk7DQo+IC0JCQkJaWYgKHJldCA8IDApIHsNCj4gLQkJCQkJcHJfZXJyKCJj aGFzaF90YWJsZV9yZW1vdmUgZmFpbGVkOiAlZFxuIiwNCj4gLQkJCQkJICAgICAgIHJldCk7DQo+ IC0JCQkJCWdvdG8gb3V0Ow0KPiAtCQkJCX0NCj4gLQkJCX0NCj4gLQkJfQ0KPiAtDQo+IC0JCS8q IEFkZCBhIG5ldyB2YWx1ZSAqLw0KPiAtCQl2YWx1ZSA9IH5hZGRfY291bnQ7DQo+IC0JCXJldCA9 IGNoYXNoX3RhYmxlX2NvcHlfaW4oJnRhYmxlLCBhZGRfY291bnQsICZ2YWx1ZSk7DQo+IC0JCWlm IChyZXQgIT0gMCkgew0KPiAtCQkJcHJfZXJyKCJjb3B5X2luIGZpcnN0IHRpbWUgcmV0dXJuZWQg JWQsIGV4cGVjdGVkIDBcbiIsDQo+IC0JCQkgICAgICAgcmV0KTsNCj4gLQkJCXJldCA9IC1FRkFV TFQ7DQo+IC0JCQlnb3RvIG91dDsNCj4gLQkJfQ0KPiAtCX0NCj4gLQ0KPiAtCWNoYXNoX3RhYmxl X2R1bXBfc3RhdHMoJnRhYmxlKTsNCj4gLQljaGFzaF90YWJsZV9yZXNldF9zdGF0cygmdGFibGUp Ow0KPiAtDQo+IC1vdXQ6DQo+IC0JY2hhc2hfdGFibGVfZnJlZSgmdGFibGUpOw0KPiAtCXJldHVy biByZXQ7DQo+IC19DQo+IC0NCj4gLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhc2hfdGVzdF9iaXRz ID0gMTA7DQo+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfYml0cywNCj4gLQkJICJTZWxmdGVzdCBu dW1iZXIgb2YgaGFzaCBiaXRzIChbNC4uMjBdLCBkZWZhdWx0PTEwKSIpOw0KPiAtbW9kdWxlX3Bh cmFtX25hbWVkKHRlc3RfYml0cywgY2hhc2hfdGVzdF9iaXRzLCB1aW50LCAwNDQ0KTsNCj4gLQ0K PiAtc3RhdGljIHVuc2lnbmVkIGludCBjaGFzaF90ZXN0X2tleXNpemUgPSA4Ow0KPiAtTU9EVUxF X1BBUk1fREVTQyh0ZXN0X2tleXNpemUsICJTZWxmdGVzdCBrZXlzaXplICg0IG9yIDgsIGRlZmF1 bHQ9OCkiKTsNCj4gLW1vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0X2tleXNpemUsIGNoYXNoX3Rlc3Rf a2V5c2l6ZSwgdWludCwgMDQ0NCk7DQo+IC0NCj4gLXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhc2hf dGVzdF9taW5maWxsOw0KPiAtTU9EVUxFX1BBUk1fREVTQyh0ZXN0X21pbmZpbGwsICJTZWxmdGVz dCBtaW5pbXVtICNlbnRyaWVzIChkZWZhdWx0PTUwJSkiKTsNCj4gLW1vZHVsZV9wYXJhbV9uYW1l ZCh0ZXN0X21pbmZpbGwsIGNoYXNoX3Rlc3RfbWluZmlsbCwgdWludCwgMDQ0NCk7DQo+IC0NCj4g LXN0YXRpYyB1bnNpZ25lZCBpbnQgY2hhc2hfdGVzdF9tYXhmaWxsOw0KPiAtTU9EVUxFX1BBUk1f REVTQyh0ZXN0X21heGZpbGwsICJTZWxmdGVzdCBtYXhpbXVtICNlbnRyaWVzIChkZWZhdWx0PTgw JSkiKTsNCj4gLW1vZHVsZV9wYXJhbV9uYW1lZCh0ZXN0X21heGZpbGwsIGNoYXNoX3Rlc3RfbWF4 ZmlsbCwgdWludCwgMDQ0NCk7DQo+IC0NCj4gLXN0YXRpYyB1bnNpZ25lZCBsb25nIGNoYXNoX3Rl c3RfaXRlcnM7DQo+IC1NT0RVTEVfUEFSTV9ERVNDKHRlc3RfaXRlcnMsICJTZWxmdGVzdCBpdGVy YXRpb25zIChkZWZhdWx0PTEwMDAgeCAjZW50cmllcykiKTsNCj4gLW1vZHVsZV9wYXJhbV9uYW1l ZCh0ZXN0X2l0ZXJzLCBjaGFzaF90ZXN0X2l0ZXJzLCB1bG9uZywgMDQ0NCk7DQo+IC0NCj4gLXN0 YXRpYyBpbnQgX19pbml0IGNoYXNoX2luaXQodm9pZCkNCj4gLXsNCj4gLQlpbnQgcmV0Ow0KPiAt CXU2NCB0czFfbnM7DQo+IC0NCj4gLQkvKiBTa2lwIHNlbGYgdGVzdCBvbiB1c2VyIGVycm9ycyAq Lw0KPiAtCWlmIChjaGFzaF90ZXN0X2JpdHMgPCA0IHx8IGNoYXNoX3Rlc3RfYml0cyA+IDIwKSB7 DQo+IC0JCXByX2VycigiY2hhc2g6IHRlc3RfYml0cyBvdXQgb2YgcmFuZ2UgWzQuLjIwXS5cbiIp Ow0KPiAtCQlyZXR1cm4gMDsNCj4gLQl9DQo+IC0JaWYgKGNoYXNoX3Rlc3Rfa2V5c2l6ZSAhPSA0 ICYmIGNoYXNoX3Rlc3Rfa2V5c2l6ZSAhPSA4KSB7DQo+IC0JCXByX2VycigiY2hhc2g6IHRlc3Rf a2V5c2l6ZSBpbnZhbGlkLiBNdXN0IGJlIDQgb3IgOC5cbiIpOw0KPiAtCQlyZXR1cm4gMDsNCj4g LQl9DQo+IC0NCj4gLQlpZiAoIWNoYXNoX3Rlc3RfbWluZmlsbCkNCj4gLQkJY2hhc2hfdGVzdF9t aW5maWxsID0gKDEgPDwgY2hhc2hfdGVzdF9iaXRzKSAvIDI7DQo+IC0JaWYgKCFjaGFzaF90ZXN0 X21heGZpbGwpDQo+IC0JCWNoYXNoX3Rlc3RfbWF4ZmlsbCA9ICgxIDw8IGNoYXNoX3Rlc3RfYml0 cykgKiA0IC8gNTsNCj4gLQlpZiAoIWNoYXNoX3Rlc3RfaXRlcnMpDQo+IC0JCWNoYXNoX3Rlc3Rf aXRlcnMgPSAoMSA8PCBjaGFzaF90ZXN0X2JpdHMpICogMTAwMDsNCj4gLQ0KPiAtCWlmIChjaGFz aF90ZXN0X21pbmZpbGwgPj0gKDEgPDwgY2hhc2hfdGVzdF9iaXRzKSkgew0KPiAtCQlwcl9lcnIo ImNoYXNoOiB0ZXN0X21pbmZpbGwgdG9vIGJpZy4gTXVzdCBiZSA8IHRhYmxlIHNpemUuXG4iKTsN Cj4gLQkJcmV0dXJuIDA7DQo+IC0JfQ0KPiAtCWlmIChjaGFzaF90ZXN0X21heGZpbGwgPj0gKDEg PDwgY2hhc2hfdGVzdF9iaXRzKSkgew0KPiAtCQlwcl9lcnIoImNoYXNoOiB0ZXN0X21heGZpbGwg dG9vIGJpZy4gTXVzdCBiZSA8IHRhYmxlIHNpemUuXG4iKTsNCj4gLQkJcmV0dXJuIDA7DQo+IC0J fQ0KPiAtCWlmIChjaGFzaF90ZXN0X21pbmZpbGwgPj0gY2hhc2hfdGVzdF9tYXhmaWxsKSB7DQo+ IC0JCXByX2VycigiY2hhc2g6IHRlc3RfbWluZmlsbCBtdXN0IGJlIDwgdGVzdF9tYXhmaWxsLlxu Iik7DQo+IC0JCXJldHVybiAwOw0KPiAtCX0NCj4gLQlpZiAoY2hhc2hfdGVzdF9rZXlzaXplID09 IDQgJiYgY2hhc2hfdGVzdF9pdGVycyA+IDB4ZmZmZmZmZmYpIHsNCj4gLQkJcHJfZXJyKCJjaGFz aDogdGVzdF9pdGVycyBtdXN0IGJlIDwgNEcgZm9yIDQgYnl0ZSBrZXlzLlxuIik7DQo+IC0JCXJl dHVybiAwOw0KPiAtCX0NCj4gLQ0KPiAtCXRzMV9ucyA9IGxvY2FsX2Nsb2NrKCk7DQo+IC0JcmV0 ID0gY2hhc2hfc2VsZl90ZXN0KGNoYXNoX3Rlc3RfYml0cywgY2hhc2hfdGVzdF9rZXlzaXplLA0K PiAtCQkJICAgICAgY2hhc2hfdGVzdF9taW5maWxsLCBjaGFzaF90ZXN0X21heGZpbGwsDQo+IC0J CQkgICAgICBjaGFzaF90ZXN0X2l0ZXJzKTsNCj4gLQlpZiAoIXJldCkgew0KPiAtCQl1NjQgdHNf ZGVsdGFfdXMgPSBsb2NhbF9jbG9jaygpIC0gdHMxX25zOw0KPiAtCQl1NjQgaXRlcnNfcGVyX3Nl Y29uZCA9ICh1NjQpY2hhc2hfdGVzdF9pdGVycyAqIDEwMDAwMDA7DQo+IC0NCj4gLQkJZG9fZGl2 KHRzX2RlbHRhX3VzLCAxMDAwKTsNCj4gLQkJZG9fZGl2KGl0ZXJzX3Blcl9zZWNvbmQsIHRzX2Rl bHRhX3VzKTsNCj4gLQkJcHJfaW5mbygiY2hhc2g6IHNlbGYgdGVzdCB0b29rICVsbHUgdXMsICVs bHUgaXRlcmF0aW9ucy9zXG4iLA0KPiAtCQkJdHNfZGVsdGFfdXMsIGl0ZXJzX3Blcl9zZWNvbmQp Ow0KPiAtCX0gZWxzZSB7DQo+IC0JCXByX2VycigiY2hhc2g6IHNlbGYgdGVzdCBmYWlsZWQ6ICVk XG4iLCByZXQpOw0KPiAtCX0NCj4gLQ0KPiAtCXJldHVybiByZXQ7DQo+IC19DQo+IC0NCj4gLW1v ZHVsZV9pbml0KGNoYXNoX2luaXQpOw0KPiAtDQo+IC0jZW5kaWYgLyogQ09ORklHX0NIQVNIX1NF TEZURVNUICovDQo+IC0NCj4gLU1PRFVMRV9ERVNDUklQVElPTigiQ2xvc2VkIGhhc2ggdGFibGUi KTsNCj4gLU1PRFVMRV9MSUNFTlNFKCJHUEwgYW5kIGFkZGl0aW9uYWwgcmlnaHRzIik7DQpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphbWQtZ2Z4IG1haWxp bmcgbGlzdAphbWQtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVk ZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2FtZC1nZngK