From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Verma, Vishal L" Subject: Re: [PATCH] ndctl: add a BTT check utility Date: Sat, 21 Jan 2017 00:41:33 +0000 Message-ID: <1484959224.4857.6.camel@intel.com> References: <20170120031234.24226-1-vishal.l.verma@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: Content-Language: en-US Content-ID: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linux-nvdimm-bounces-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org Sender: "Linux-nvdimm" To: "jmoyer-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org" Cc: "linux-nvdimm-y27Ovi1pjclAfugRpC6u6w@public.gmane.org" List-Id: linux-nvdimm@lists.01.org T24gRnJpLCAyMDE3LTAxLTIwIGF0IDE4OjE0IC0wNTAwLCBKZWZmIE1veWVyIHdyb3RlOg0KPiBI aSwgVmlzaGFsLA0KPiANCj4gVmlzaGFsIFZlcm1hIDx2aXNoYWwubC52ZXJtYUBpbnRlbC5jb20+ IHdyaXRlczoNCj4gDQo+ID4gQWRkIHRoZSBjaGVjay1uYW1lc3BhY2UgY29tbWFuZCB0byBuZGN0 bC4gVGhpcyB3aWxsIGNoZWNrIHRoZSBCVFQNCj4gPiBtZXRhZGF0YSBsYXlvdXQgZm9yIHRoZSBn aXZlbiBuYW1lc3BhY2UsIGFuZCBpZiByZXF1ZXN0ZWQsIGNvcnJlY3QNCj4gPiBhbnkNCj4gPiBl cnJvcnMgZm91bmQuIE5vdCBhbGwgbWV0YWRhdGEgY29ycnVwdGlvbiBpcyBkZXRlY3RhYmxlIG9y IGZpeGFibGUuDQo+IA0KPiBGaXJzdCwgdGhhbmtzIGEgbG90IGZvciB0YWNrbGluZyB0aGlzIcKg wqBPdmVyYWxsLCB0aGUgY29kZSBsb29rcyBwcmV0dHkNCj4gY2xlYW4uwqDCoEkndmUgZ290IGEg ZmV3IGdlbmVyYWwgY29tbWVudHMsIGFuZCB0aGVuIHlvdSBjYW4gc2Nyb2xsIGRvd24NCj4gZm9y IGNvZGUgcmV2aWV3LsKgwqBJIGRpZG4ndCBnZXQgdGhyb3VnaCB0aGUgd2hvbGUgdGhpbmcsIHNv IEknbGwgdHJ5IHRvDQo+IHBpY2sgdXAgd2hlcmUgSSBsZWZ0IG9mZiBuZXh0IHdlZWsuDQoNClRo YW5rcyBKZWZmIQ0KDQo+IA0KPiBIb3cgd2FzIHRoaXMgdGVzdGVkP8KgwqBEaWQgeW91IHBlcnR1 cmIgdGhlIGJ0dCBpbiB3YXlzIHRoYXQgeW91IGV4cGVjdA0KPiBjYW4gYW5kIGNhbid0IGJlIGZp eGVkP8KgwqBDYW4geW91IGFkZCB0ZXN0cyBmb3IgdGhhdD8NCg0KWWVzLCBzbyBmb3Igc29tZSB0 aGluZ3MgSSB0ZXN0ZWQgYnkgZXNzZW50aWFsbHkgaGFuZCBlZGl0aW5nIHRoZQ0KbWV0YWRhdGEu IEJ1dCBmb3Igb3RoZXIgdGhpbmdzIC0gbWFpbmx5IG11bHRpLWFyZW5hIHRlc3RpbmcsIGFuZCB0 aGUNCmRpZmZlcmVudCByZWNvdmVyeSBhdHRlbXB0cyBmb3IgZmlyc3Rfc2IsIEkgbW9kaWZpZWQg dGhlIGtlcm5lbCBidHQgdG8NCnByb2R1Y2Ugc21hbGwgOE1CIGFyZW5hcywgYW5kIGRpZCB0aGUg c2FtZSBpbiB0aGUgY2hlY2tlci4gRm9yIHRoZQ0KZm9ybWVyLCB0aG9zZSBjYW4gYmUgJ2Zvcm1h bGl6ZWQnIGFzIG5kY3RsIHVuaXQgdGVzdHMsIGFuZCBJIHdpbGwgc3RhcnQNCmRvaW5nIHRoYXQu IEJ1dCBmb3IgdGhlIGxhdHRlciwgSSBkb24ndCBrbm93IGlmIHRoZXJlJ3MgYW4gZWFzeSB3YXkg dG8NCmdldCBmdWxsIGNvdmVyYWdlIG9uIHRob3NlIGNhc2VzLg0KDQo+IA0KPiBDaGVja2luZyBz aG91bGQgbm90IGJlIGFuIG9wdGlvbmFsIGZlYXR1cmUuwqDCoEp1c3QgYWx3YXlzIGJ1aWxkIGl0 IGluLg0KDQpZb3UgbWVhbiBjaGVja2luZyBtZXRhZGF0YSB3aGVuIGJyaW5naW5nIHVwIHRoZSBu YW1lc3BhY2U/IFRoZSBrZXJuZWwNCmRvZXMgZXNzZW50aWFsIGNoZWNrcyBvZiBjb3Vyc2UsIGJ1 dCBkbyB5b3UgbWVhbiB0aGUgbW9yZSBpbnZvbHZlZCBvbmVzDQpsaWtlIGxvZy9tYXAgZW50cnkg Ym91bmRzLCB0aGUgYmFja3VwIGluZm8gYmxvY2sgZXRjPw0KDQo+IA0KPiBXaHkgc2hvdWxkIGEg dXNlciBoYXZlIHRvIGRpc2FibGUgYSBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gcnVuIHRoZQ0KPiBj aGVja2VyP8KgwqBJIGd1ZXNzIHRoYXQncyB0aGUgYW5hbG9nIG9mIHVubW91bnRpbmcgYW4gZnM/ wqDCoFN0aWxsLCBzZWVtcw0KPiBsaWtlIHdlIGNvdWxkIGp1c3QgZG8gdGhhdCBmb3IgdGhlIHVz ZXIuDQoNCk1vc3RseSBzbyB0aGF0IHRoZSB1c2VyIGNhbiBiZSBzdXJlIG5vdGhpbmcgZWxzZSBp cyB1c2luZyBpdCB3aGVuIHRoZQ0KY2hlY2sgc3RhcnRzPyBXZSBjb3VsZCBkaXNhYmxlIGl0IGZv ciB0aGVtLCBidXQgSSBqdXN0IHRob3VnaHQgdGhpcw0Kd291bGQgYmUgc2FmZXI/IEFuIG9wdGlv biBjb3VsZCBiZSBwcm92aWRpbmcgYSAtLWZvcmNlIG9wdGlvbiBsaWtlIEkNCnRoaW5rIGRlc3Ry b3kgb3IgcmVjb25maWcgZG8uLg0KDQo+IA0KPiBDYW4gdGhpcyBjb2RlIGluIGFueSB3YXkgYmUg c2hhcmVkIHdpdGggbGlicG1lbWJsaz/CoMKgVGhleSBoYXZlIHRoZWlyDQo+IG93bg0KPiBjaGVj a2VyICh3aGljaCBkb2VzIGRpZmZlcmVudCB0aGluZ3MpLCBhbmQgaXQgc2VlbXMgbGlrZSBhIGxv c3QNCj4gb3Bwb3J0dW5pdHkgdG8gbm90IGJlIGFibGUgdG8gbGV2ZXJhZ2UgdGhlIHNhbWUgY29k ZSBpbiBib3RoIHBsYWNlcy4NCg0KV2Ugc3RhcnRlZCBvdXQgd2l0aCB0aGF0LCBpbiBmYWN0IHdp dGggZGVwZW5kaW5nIG9uIGxpYnBtZW1ibGsncyBjaGVja2VyDQphbmQgY2FsbGluZyBpbnRvIHRo ZWlyIGxpYnJhcnksIGJ1dCBpdCB3YXMgb2RkIGZvciBuZGN0bCAoYSBjb3JlIHN5c3RlbQ0KbGli cmFyeSBvZiBzb3J0cykgdG8gZGVwZW5kIG9uIGxpYnBtZW1ibGsgKGFuICdhcHBsaWNhdGlvbicg bGlicmFyeSkuDQpUaGVuIHdlIGNvbnNpZGVyZWQgbW92aW5nIHRoZSBsaWJwbWVtYmxrIGNoZWNr ZXIgcGFydHMgaW50byBsaWJuZGN0bCwNCmFuZCBtYWtpbmcgcG1lbWJsayBkZXBlbmQgb24gdXMs IGJ1dCB0aGV5IGFsc28gdXNlZCB0aGVpciBsaWJyYXJ5IG9uDQp3aW5kb3dzLCBzbyB3ZSBjb3Vs ZG4ndCBqdXN0IG1vdmUgaXQuIEZpbmFsbHkgd2UganVzdCBkZWNpZGVkIHRvIGhhdmUgYQ0KY29w eSBvZiB0aGUgY29kZSBpbiBuZGN0bCwgc28gSSByZXdyb3RlIGl0IGluIGEgbmRjdGwgbmF0aXZl IHdheS4NCg0KPiANCj4gT3ZlcmFsbCwgdGhlIGNvZGUgY291bGQgdXNlIG1vcmUgY29tbWVudHMu DQoNCk9rLCBJJ2xsIGFkZCBzb21lIGRlc2NyaXB0aW9ucyB0byB0aGUgdHJpY2tpZXIgc2VjdGlv bnMuDQoNCj4gDQo+IERvZXMgdGhpcyByZWFsbHkgYWxsIGJlbG9uZyBpbiBidWlsdGluLXhhY3Rp b24tbmFtZXNwYWNlLmM/wqDCoEl0IHNlZW1zDQo+IHRvbyBidHQgc3BlY2lmaWMgZm9yIHRoYXQu wqDCoE1heWJlIGl0J3MgdGltZSB0byBjcmVhdGUgYSBuZXcgZmlsZS4NCj4gSSdsbCBsZWF2ZSB0 aGF0IHVwIHRvIERhbiBmb3IgaGlzIHByZWZlcmVuY2UuDQoNCkRhbiBoYWQgdGhlIHNhbWUgZmVl ZGJhY2ssIHdpbGwgbW92ZSB0byBhIG5ldyBmaWxlLg0KDQo+IA0KPiBUaGVyZSBzZWVtcyB0byBi ZSBhIGxvdCBvZiByZXBlYXRlZCBjb2RlIHNlcXVlbmNlcyBhcm91bmQgcmVhZGluZyBhbmQNCj4g dmVyaWZ5aW5nIHRoZSBidHQgaW5mbyBibG9ja3MuwqDCoFBlcmhhcHMgdGhhdCBjYW4gYmUgZmFj dG9yZWQNCj4gb3V0P8KgwqBNYXliZQ0KPiBnZXQgcmlkIG9mIHRoZSBmaXJzdF9zYiBzcGVjaWFs IHNub3dmbGFrZSBhbmQgcm9sbCB0aGF0IGludG8gdGhlIGFyZW5hDQo+IGRpc2NvdmVyeT8NCj4g DQo+ID4gZGlmZiAtLWdpdCBhL25kY3RsL2J0dC1zdHJ1Y3RzLmggYi9uZGN0bC9idHQtc3RydWN0 cy5oDQo+ID4gKyNkZWZpbmUgSUJfRkxBR19FUlJPUiAweDAwMDAwMDAxDQo+ID4gKyNkZWZpbmUg SUJfRkxBR19FUlJPUl9NQVNLIDB4MDAwMDAwMDENCj4gDQo+IElCX0ZMQUdfRVJST1IgaXMgZGVm aW5lZCBidXQgbmV2ZXIgdXNlZC9jaGVja2VkLsKgwqBPZiBjb3Vyc2UsIG5laXRoZXINCj4gdGhl DQo+IGtlcm5lbCBub3IgdGhpcyB1dGlsaXR5IHdpbGwgc2V0IHRoYXQgZmxhZy7CoMKgV2Ugc2hv dWxkIHByb2JhYmx5IGRlY2lkZQ0KPiB3aGV0aGVyIGl0IG1ha2VzIHNlbnNlIHRvIGRvIHNvLg0K DQpUcnVlLCB3aWxsIHJlbW92ZS4NCg0KPiANCj4gPiArc3RhdGljIGludCBidHRfcmVhZF9pbmZv KHN0cnVjdCBidHRfY2hrICpidHRjLCBzdHJ1Y3QgYnR0X3NiDQo+ID4gKmJ0dF9zYiwgX191NjQg b2ZmKQ0KPiA+ICt7DQo+ID4gKwlpbnQgZmQsIHJjID0gMDsNCj4gPiArCXNzaXplX3Qgc2l6ZTsN Cj4gPiArDQo+ID4gKwlmZCA9IG9wZW4oYnR0Yy0+cGF0aCwgT19SRE9OTFkpOw0KPiA+ICsJaWYg KGZkIDwgMCkgew0KPiA+ICsJCWVycm9yKCJ1bmFibGUgdG8gb3BlbiAlczogJXNcbiIsIGJ0dGMt PnBhdGgsDQo+ID4gc3RyZXJyb3IoZXJybm8pKTsNCj4gPiArCQlyZXR1cm4gLWVycm5vOw0KPiA+ ICsJfQ0KPiA+ICsNCj4gPiArCXNpemUgPSBwcmVhZChmZCwgYnR0X3NiLCBzaXplb2YoKmJ0dF9z YiksIG9mZiArIFNaXzRLKTsNCj4gPiArCWlmIChzaXplICE9IHNpemVvZigqYnR0X3NiKSkgew0K PiA+ICsJCWVycm9yKCJ1bmFibGUgdG8gcmVhZCBmaXJzdCBpbmZvIGJsb2NrOiAlc1xuIiwNCj4g PiBzdHJlcnJvcihlcnJubykpOw0KPiA+ICsJCXJjID0gLWVycm5vOw0KPiANCj4gU2hvcnQgcmVh ZHMgd2lsbCBub3Qgc2V0IGVycm5vLCBzbyB5b3UnbGwgcmV0dXJuIDAgaW5jb3JyZWN0bHksIGhl cmUuDQoNCkdvb2QgY2F0Y2gsIEknbGwgZml4Lg0KDQo+IA0KPiA+ICsJfQ0KPiA+ICsJY2xvc2Uo ZmQpOw0KPiA+ICsJcmV0dXJuIHJjOw0KPiA+ICt9DQo+IA0KPiBJIGZpbmQgaXQgb2RkIHRoYXQg dGhlIGNhbGxlciBoYXMgdG8gcGFzcyBpbiB0aGUgb2Zmc2V0IDRrIGJlZm9yZSB0aGUNCj4gc3Rh cnQgb2YgdGhlIGluZm8gYmxvY2suwqDCoEl0IHNlZW1zIG5hdHVyYWwgZm9yIHRoZSBmaXJzdCBp bmZvIGJsb2NrLA0KPiBidXQNCj4gZm9yIHRoZSBiYWNrdXAsIGl0J3MgdG90YWxseSBib2d1cy7C oMKgOy0pDQoNCkkgYWdyZWUsIGFuZCBJIGhhdGVkIGl0IHRvbyA6KQ0KQnV0IEkgd2FudGVkIHRv IGtlZXAgdGhlICs0SyBhZGRpdGlvbiBpbiB0aGUgbG93ZXN0IGxldmVsIGZ1bmN0aW9ucy4uDQpI YXZlIGEgYmV0dGVyIGlkZWE/IDopICBUaGlzIGRvZXMga2luZGEga2lsbCB0aGUgaWRlYSBvZiAi b2ggdGhlIDRrDQpvZmZzZXR0aW5nIHdpbGwgYmUgY29tcGxldGVseSBoaWRkZW4gZnJvbSB0aGUg aGlnaGVyIGxldmVsIGxvZ2ljIg0KDQpUaGUgb3Bwb3NpdGUgb2YgdGhpcyB3b3VsZCBiZSBzcHJp bmtsaW5nIGEgbnVtYmVyIG9mICs0SyBldmVyeXdoZXJlDQplbHNlLCBhbmQgSSB0aGluayB3aXRo IHRoaXMgd2Ugb25seSBoYXZlIHRvIGRvIHRoZSBpbnZlcnNlIGluIGEgY291cGxlDQpvZiBwbGFj ZXMuLg0KDQo+IA0KPiA+ICtzdGF0aWMgaW50IGJ0dF9jb3B5X3RvX2luZm8yKHN0cnVjdCBhcmVu YV9pbmZvICphKQ0KPiA+ICt7DQo+ID4gKwlpZiAoZHJ5cnVuKSB7DQo+ID4gKwkJZXJyb3IoIkFy ZW5hICVkOiBCVFQgaW5mbzIgbmVlZHMgdG8gYmUgcmVzdG9yZWRcbiIsDQo+ID4gYS0+bnVtKTsN Cj4gPiArCQlyZXR1cm4gZHJ5cnVuX21zZygpOw0KPiA+ICsJfQ0KPiA+ICsJcHJpbnRmKCJBcmVu YSAlZDogUmVzdG9yaW5nIEJUVCBpbmZvMlxuIiwgYS0+bnVtKTsNCj4gPiArCW1lbWNweShhLT5t YXAuaW5mbzIsIGEtPm1hcC5pbmZvLCBCVFRfUEdfU0laRSk7DQo+IA0KPiBtaXNzaW5nIG1zeW5j KCk7DQoNCkdvb2QgY2F0Y2guDQoNCj4gDQo+ID4gK3N0YXRpYyBpbnQgYnR0X21hcF9yZWFkKHN0 cnVjdCBhcmVuYV9pbmZvICphLCBfX3UzMiBsYmEsIF9fdTMyDQo+ID4gKm1hcHBpbmcsDQo+ID4g KwkJCWludCAqdHJpbSwgaW50ICplcnJvcikNCj4gPiArew0KPiA+ICsJX191MzIgcmF3X21hcHBp bmcsIHBvc3RtYXAsIHplLCB6X2ZsYWcsIGVfZmxhZzsNCj4gPiArDQo+ID4gKwlyYXdfbWFwcGlu ZyA9IGxlMzJ0b2goYS0+bWFwLm1hcFtsYmFdKTsNCj4gPiArCXpfZmxhZyA9IChyYXdfbWFwcGlu ZyAmIE1BUF9UUklNX01BU0spID4+IE1BUF9UUklNX1NISUZUOw0KPiA+ICsJZV9mbGFnID0gKHJh d19tYXBwaW5nICYgTUFQX0VSUl9NQVNLKSA+PiBNQVBfRVJSX1NISUZUOw0KPiA+ICsJemUgPSAo el9mbGFnIDw8IDEpICsgZV9mbGFnOw0KPiA+ICsJcG9zdG1hcCA9IHJhd19tYXBwaW5nICYgTUFQ X0xCQV9NQVNLOw0KPiA+ICsNCj4gPiArCS8qIFJldXNlIHRoZSB7eixlfV9mbGFnIHZhcmlhYmxl cyBmb3IgKnRyaW0gYW5kICplcnJvciAqLw0KPiA+ICsJel9mbGFnID0gMDsNCj4gPiArCWVfZmxh ZyA9IDA7DQo+ID4gKw0KPiA+ICsJc3dpdGNoICh6ZSkgew0KPiA+ICsJY2FzZSAwOg0KPiA+ICsJ CS8qIEluaXRpYWwgc3RhdGUuIFJldHVybiBwb3N0bWFwID0gcHJlbWFwICovDQo+ID4gKwkJKm1h cHBpbmcgPSBsYmE7DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNlIDE6DQo+ID4gKwkJKm1hcHBp bmcgPSBwb3N0bWFwOw0KPiA+ICsJCWVfZmxhZyA9IDE7DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwlj YXNlIDI6DQo+ID4gKwkJKm1hcHBpbmcgPSBwb3N0bWFwOw0KPiA+ICsJCXpfZmxhZyA9IDE7DQo+ ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNlIDM6DQo+ID4gKwkJKm1hcHBpbmcgPSBwb3N0bWFwOw0K PiA+ICsJCWJyZWFrOw0KPiA+ICsJZGVmYXVsdDoNCj4gPiArCQlyZXR1cm4gLUVJTzsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwlpZiAodHJpbSkNCj4gPiArCQkqdHJpbSA9IHpfZmxhZzsNCj4gPiAr CWlmIChlcnJvcikNCj4gPiArCQkqZXJyb3IgPSBlX2ZsYWc7DQo+ID4gKw0KPiA+ICsJcmV0dXJu IDA7DQo+ID4gK30NCj4gDQo+IE5vIGNhbGxlciB1c2VzIHogb3IgZSwgc28gZ2V0IHJpZCBvZiB0 aG9zZSBhcmdzLsKgwqBBbHNvLCB5b3VyIGRlZmF1bHQNCj4gZW50cnkgaW4gdGhlIHN3aXRjaCBz dGF0ZW1lbnQgY2FuIG5ldmVyIGJlIGhpdC7CoMKgRml4aW5nIHRob3NlLCB0aGUNCj4gZnVuY3Rp b24gaXMganVzdDoNCj4gDQo+IC8qDQo+IMKgKiBidHRfbWFwX2xvb2t1cA0KPiDCoCoNCj4gwqAq IEdpdmVuIGEgcHJlLW1hcCBBcmVuYSBCbG9jayBBZGRyZXNzLCByZXR1cm4gdGhlIHBvc3QtbWFw IEFCQS4NCj4gwqAqLw0KPiBzdGF0aWMgdTMyIGJ0dF9tYXBfbG9va3VwKHN0cnVjdCBhcmVuYV9p bmZvICphLCBfX3UzMiBsYmEpDQo+IHsNCj4gwqDCoMKgwqDCoMKgwqDCoHJldHVybiAobGUzMnRv aChhLT5tYXAubWFwW2xiYV0pICYgTUFQX0xCQV9NQVNLKTsNCj4gfQ0KPiANCj4gWW91IGNhbiB0 YWtlIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiBuYW1lIGNoYW5nZS7CoMKgUGxlYXNlIGtlZXAgdGhl DQo+IGNvbW1lbnQsIGFuZCBtYXliZSBrZXJuZWwtZG9jLWlmeSBpdC4NCj4gDQo+ID4gK3N0YXRp YyBpbnQgYnR0X21hcF93cml0ZShzdHJ1Y3QgYXJlbmFfaW5mbyAqYSwgX191MzIgbGJhLCBfX3Uz Mg0KPiA+IG1hcHBpbmcsDQo+ID4gKwkJCV9fdTMyIHpfZmxhZywgX191MzIgZV9mbGFnKQ0KPiA+ ICt7DQo+IA0KPiBBZ2FpbiwgeiBhbmQgZSBhcmUgdW51c2VkLsKgwqBOdWtlICdlbS4NCg0KVHJ1 ZSwgSSBqdXN0IGNvcGllZCB0aGVzZSBvdmVyIGZyb20gdGhlIGtlcm5lbCBpbXBsZW1lbnRhdGlv biwgYW5kDQp3YXNuJ3Qgc3VyZSBpZiBJJ2QgZXZlciBiZSB1c2luZyB6IGFuZCBlLiBDdXJyZW50 bHkgdGhlIGtlcm5lbCBkb2Vzbid0DQpldmVuIHNldCB0aG9zZSwgc28gaXQgaXMgYSBiaXQgcmVk dW5kYW50LiBJZiB0aGUga2VybmVsIGRvZXMgZ3JvdyB0aGUNCmFiaWxpdHkgdG8gdXNlIHRoZW0g aW4gZnV0dXJlLCB0aGVyZSBjb3VsZCBiZSB1c2UgZm9yIHRoZXNlLCBidXQgSQ0Kc3VwcG9zZSBJ IHNob3VsZCByZW1vdmUgdGhlIGRlYWQgY29kZSB1bnRpbCB0aGF0IGhhcHBlbnMgOikNCg0KPiAN Cj4gW3NuaXBdDQo+ID4gKwlhLT5tYXAubWFwW2xiYV0gPSBodG9sZTMyKG1hcHBpbmcpOw0KPiA+ ICsJaWYgKG1zeW5jKCh2b2lkICopcm91bmRkb3duKChfX3U2NCkmYS0+bWFwLm1hcFtsYmFdLA0K PiA+IEJUVF9QR19TSVpFKSwNCj4gPiArCQlCVFRfUEdfU0laRSwgTVNfU1lOQykgPCAwKQ0KPiA+ ICsJCXJldHVybiBlcnJubzsNCj4gDQo+IFlvdSBhcmUgYWxpZ25pbmcgbXN5bmMgY2FsbHMgdG8g dGhlIEJUVF9QR19TSVpFLCB3aGljaCBpcyB3cm9uZy7CoMKgSXQNCj4gc2hvdWxkIGJlIGFsaWdu ZWQgdG8gdGhlIHN5c3RlbSBwYWdlIHNpemUuDQo+IA0KPiBJbiBmYWN0LCB5b3UgYWJ1c2UgQlRU X1BHX1NJWkUgYWxsIG92ZXIgdGhlIHBsYWNlLsKgwqBZb3UgdXNlIGl0IHRvDQo+IG1lYW46DQo+ IC0gc3lzdGVtIHBhZ2Ugc2l6ZQ0KPiAtIHNpemUgb2YgdGhlIGJ0dCBpbmZvIGJsb2NrDQo+IC0g dGhlIGJ0dCBwYWdlIHNpemUgOy0pDQo+IA0KPiBJdCB3b3VsZCBiZSBuaWNlIGlmIHlvdSBjb3Vs ZCBjbGVhbiB0aGF0IHVwLg0KDQpZZXMuLiBJIHdhcyBqdXN0IChhYil1c2luZyB0aGUgZmFjdCB0 aGF0IHRoZXkncmUgZ29pbmcgdG8gYmUgdGhlIHNhbWUsDQpidXQgSSBzaG91bGQgZGlzdGluZ3Vp c2ggYmV0d2VlbiB0aGUgZGlmZmVyZW50IHVzYWdlcyBiZXR0ZXIuIEknbGwgZml4DQppdCB1cC4N Cg0KPiANCj4gU2hvdWxkIHdlIHBlcmZvcm0gYSBsb2FkIG9mIHRoZSBpbmZvIGJsb2NrIGFmdGVy IHRoZSBtc3luYyB0byBlbnN1cmUNCj4gaXQNCj4gd2FzIHdyaXR0ZW4gKHRvIHRyaWdnZXIgYW4g TUNFIGlmIG9uZSBpcyBnb2luZyB0byBoYXBwZW4pP8KgwqBUaGF0IHNhbWUNCj4gcXVlc3Rpb24g Y291bGQgYmUgYXNrZWQgZm9yIGVhY2ggcGxhY2Ugd2hlcmUgYW4gdXBkYXRlIGlzIG1hZGUuDQoN Ckdvb2QgcXVlc3Rpb24uIEkgZ3Vlc3MgdGhlIHByb2JhYmlsaXR5IG9mIHRob3NlIGxvY2F0aW9u cyBoYXZpbmcgYSBiYWQNCmNlbGwgaXMgbG93IGJlY2F1c2Ugd2UgZGlkIGp1c3QgcmVhZCB0aGVt IHRvIGZpbmQgb3V0IHRoZXJlIGlzIGENCnByb2JsZW0sIGFuZCBzdWJzZXF1ZW50bHkgd3JpdGlu ZyB0aGVtIHNob3VsZCBoYXZlIGEgbG93IHByb2JhYmlsaXR5IG9mDQp0cmlnZ2VyaW5nIGEgQ01D SS4gQnV0IHJlLXJlYWRpbmcgdG8gbWFrZSBzdXJlIGl0IHdhcyBjb3JyZWN0bHkgd3JpdHRlbg0K aXMgbm90IGEgYmFkIGlkZWEuIERhbiwgdGhvdWdodHM/DQoNCj4gDQo+ID4gK3N0YXRpYyB2b2lk IGJ0dF9wYXJzZV9tZXRhKHN0cnVjdCBhcmVuYV9pbmZvICphcmVuYSwgc3RydWN0IGJ0dF9zYg0K PiA+ICpidHRfc2IsDQo+ID4gKwkJCQlfX3U2NCBhcmVuYV9vZmYpDQo+ID4gK3sNCj4gPiArCWFy ZW5hLT5pbnRlcm5hbF9ubGJhID0gbGUzMnRvaChidHRfc2ItPmludGVybmFsX25sYmEpOw0KPiA+ ICsJYXJlbmEtPmludGVybmFsX2xiYXNpemUgPSBsZTMydG9oKGJ0dF9zYi0NCj4gPiA+aW50ZXJu YWxfbGJhc2l6ZSk7DQo+ID4gKwlhcmVuYS0+ZXh0ZXJuYWxfbmxiYSA9IGxlMzJ0b2goYnR0X3Ni LT5leHRlcm5hbF9ubGJhKTsNCj4gPiArCWFyZW5hLT5leHRlcm5hbF9sYmFzaXplID0gbGUzMnRv aChidHRfc2ItDQo+ID4gPmV4dGVybmFsX2xiYXNpemUpOw0KPiA+ICsJYXJlbmEtPm5mcmVlID0g bGUzMnRvaChidHRfc2ItPm5mcmVlKTsNCj4gPiArCWFyZW5hLT52ZXJzaW9uX21ham9yID0gbGUx NnRvaChidHRfc2ItPnZlcnNpb25fbWFqb3IpOw0KPiA+ICsJYXJlbmEtPnZlcnNpb25fbWlub3Ig PSBsZTE2dG9oKGJ0dF9zYi0+dmVyc2lvbl9taW5vcik7DQo+ID4gKw0KPiA+ICsJYXJlbmEtPm5l eHRvZmYgPSAoYnR0X3NiLT5uZXh0b2ZmID09IDApID8gMCA6IChhcmVuYV9vZmYgKw0KPiA+ICsJ CQlsZTY0dG9oKGJ0dF9zYi0+bmV4dG9mZikpOw0KPiA+ICsJYXJlbmEtPmluZm9vZmYgPSBhcmVu YV9vZmY7DQo+ID4gKwlhcmVuYS0+ZGF0YW9mZiA9IGFyZW5hX29mZiArIGxlNjR0b2goYnR0X3Ni LT5kYXRhb2ZmKTsNCj4gPiArCWFyZW5hLT5tYXBvZmYgPSBhcmVuYV9vZmYgKyBsZTY0dG9oKGJ0 dF9zYi0+bWFwb2ZmKTsNCj4gPiArCWFyZW5hLT5sb2dvZmYgPSBhcmVuYV9vZmYgKyBsZTY0dG9o KGJ0dF9zYi0+bG9nb2ZmKTsNCj4gPiArCWFyZW5hLT5pbmZvMm9mZiA9IGFyZW5hX29mZiArIGxl NjR0b2goYnR0X3NiLT5pbmZvMm9mZik7DQo+ID4gKw0KPiA+ICsJYXJlbmEtPnNpemUgPSAobGU2 NHRvaChidHRfc2ItPm5leHRvZmYpID4gMCkNCj4gPiArCQk/IChsZTY0dG9oKGJ0dF9zYi0+bmV4 dG9mZikpDQo+ID4gKwkJOiAoYXJlbmEtPmluZm8yb2ZmIC0gYXJlbmEtPmluZm9vZmYgKyBCVFRf UEdfU0laRSk7DQo+ID4gKw0KPiA+ICsJYXJlbmEtPmZsYWdzID0gbGUzMnRvaChidHRfc2ItPmZs YWdzKTsNCj4gPiArfQ0KPiANCj4gTWF5YmUgaXQgZG9lc24ndCBiZWxvbmcgaW4gdGhlIHBhcnNl IHJvdXRpbmUsIGJ1dCB0aGVyZSBpcyBubyBzYW5pdHkNCj4gY2hlY2tpbmcgb24gdGhpcyBkYXRh LCBhbmQgdGhlcmUgcmVhbGx5IHNob3VsZCBiZS4NCg0KR29vZCBwb2ludCwgSSdsbCBhZGQgc29t ZS4NCg0KPiANCj4gPiArLyogQ2hlY2sgdGhhdCBsb2cgZW50cmllcyBhcmUgc2VsZiBjb25zaXN0 ZW50ICovDQo+ID4gK3N0YXRpYyBpbnQgYnR0X2NoZWNrX21hcF9lbnRyaWVzKHN0cnVjdCBhcmVu YV9pbmZvICphKQ0KPiA+ICt7DQo+ID4gKwlpbnQgcmMgPSAwLCB6LCBlOw0KPiA+ICsJdW5zaWdu ZWQgaW50IGk7DQo+ID4gKwlfX3UzMiBtYXBwaW5nOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7 IGkgPCBhLT5leHRlcm5hbF9ubGJhOyBpKyspIHsNCj4gPiArCQlyYyA9IGJ0dF9tYXBfcmVhZChh LCBpLCAmbWFwcGluZywgJnosICZlKTsNCj4gPiArCQlpZiAocmMpDQo+ID4gKwkJCXJldHVybiBy YzsNCj4gPiArCQlpZiAobWFwcGluZyA+PSBhLT5pbnRlcm5hbF9ubGJhKQ0KPiA+ICsJCQlyZXR1 cm4gQlRUX01BUF9PT0I7DQo+ID4gKwl9DQo+ID4gKwlyZXR1cm4gMDsNCj4gPiArfQ0KPiANCj4g bGlicG1lbWJsaydzIHZlcnNpb24gb2YgdGhpcyBrZWVwcyBhIGJpdG1hcCBvZiBhbGxvY2F0ZWQg YmxvY2tzIGFuZA0KPiBmcmVlDQo+IGJsb2NrcyAoZnJvbSB0aGUgZmxvZyksIGFuZCB0aGVuIGdl bmVyYXRlcyBhIHdhcm5pbmcgaWYgdGhlcmUgYXJlDQo+IGR1cGxpY2F0ZSBibG9ja3MgYWxsb2Nh dGVkIG9yIHVucmVhY2hhYmxlIGJsb2Nrcy7CoMKgSSB0aGluayB3ZSBzaG91bGQNCj4gZG8NCj4g dGhlIHNhbWUuDQoNClllcCBJIHNhdyB0aGF0LCBJJ2xsIGFkZCBpdC4NCg0KPiANCj4gDQo+ID4g Ky8qIENoZWNrIHRoYXQgZWFjaCBmbG9nIGVudHJ5IGhhcyB0aGUgY29ycmVjdCBjb3JyZXNwb25k aW5nIG1hcA0KPiA+IGVudHJ5ICovDQo+ID4gK3N0YXRpYyBpbnQgYnR0X2NoZWNrX2xvZ19tYXAo c3RydWN0IGFyZW5hX2luZm8gKmEpDQo+ID4gK3sNCj4gPiArCXVuc2lnbmVkIGludCBpOw0KPiA+ ICsJX191MzIgbWFwcGluZzsNCj4gPiArCWludCByYyA9IDA7DQo+ID4gKw0KPiA+ICsJZm9yIChp ID0gMDsgaSA8IGEtPm5mcmVlOyBpKyspIHsNCj4gPiArCQlzdHJ1Y3QgbG9nX2VudHJ5IGxvZzsN Cj4gPiArDQo+ID4gKwkJcmMgPSBidHRfbG9nX3JlYWQoYSwgaSwgJmxvZyk7DQo+ID4gKwkJaWYg KHJjKQ0KPiA+ICsJCQlyZXR1cm4gcmM7DQo+ID4gKwkJcmMgPSBidHRfbWFwX3JlYWQoYSwgbG9n LmxiYSwgJm1hcHBpbmcsIE5VTEwsDQo+ID4gTlVMTCk7DQo+ID4gKwkJaWYgKHJjKQ0KPiA+ICsJ CQlyZXR1cm4gcmM7DQo+ID4gKw0KPiA+ICsJCS8qDQo+ID4gKwkJwqAqIENhc2Ugd2hlcmUgdGhl IGZsb2cgd2FzIHdyaXR0ZW4sIGJ1dCBtYXANCj4gPiBjb3VsZG4ndCBiZSB1cGRhdGVkLg0KPiA+ ICsJCcKgKiBUaGUga2VybmVsIHNob3VsZCBhbHNvIGJlIGFibGUgdG8gZGV0ZWN0IGFuZCBmaXgN Cj4gPiB0aGlzIGNvbmRpdGlvbg0KPiA+ICsJCcKgKi8NCj4gPiArCQlpZiAobG9nLm5ld19tYXAg IT0gbWFwcGluZyAmJiBsb2cub2xkX21hcCA9PQ0KPiA+IG1hcHBpbmcpIHsNCj4gPiArCQkJZXJy b3IoImFyZW5hICVkOiBsb2dbJWRdLm5ld19tYXAgKCUjeCkNCj4gPiBkb2Vzbid0IG1hdGNoIG1h cFslI3hdICglI3gpIiwNCj4gPiArCQkJCWEtPm51bSwgaSwgbG9nLm5ld19tYXAsIGxvZy5sYmEs DQo+ID4gbWFwcGluZyk7DQo+IA0KPiBUaGlzIGlzbid0IGFuIGVycm9yLsKgwqBXZSBleHBlY3Qg dGhpcyB0byBoYXBwZW4gaWYgcG93ZXIgaXMgc3VkZGVubHkNCj4gbG9zdCwgYW5kIHRoZSBmb3Jt YXQgaXMgYnVpbHQgdG8gcmVjb3ZlciBmcm9tIGl0LsKgwqBJZiB5b3UgbG9nIGl0IGF0DQo+IGFs bCwNCj4gSSB3b3VsZCBtYWtlIGl0IGFuIGluZm9ybWF0aW9uYWwgbWVzc2FnZS4NCj4gDQo+IEkg d29uZGVyIHdoZXRoZXIgd2Ugc2hvdWxkIGV2ZW4gZml4IGl0LsKgwqBJIHdvcnJ5IGFib3V0IGhh dmluZyB0aGUgc2FtZQ0KPiByZWNvdmVyeSBjb2RlIGluIG11bHRpcGxlIHBsYWNlcyAodGhlIGtl cm5lbCBhbmQgaGVyZSkuwqDCoFdoYXQgZG8geW91DQo+IHRoaW5rPw0KDQpIbSwgSSBhZ3JlZSBh Ym91dCB0aGUgbWVzc2FnZSwgaW4gdGhhdCBpdCBpcyByb3V0aW5lLiBCdXQgSSBhZGRlZCB0aGUN CnJlcGFpcmluZyBzbyB0aGF0IGEgdXNlciBtYXkganVzdCBkZWNpZGUgdG8gZG8gYSBjaGVjayB1 c2luZyB0aGlzIGFmdGVyDQphIHBvd2VyIGZhaWx1cmUsIGFuZCB3ZSBjYW4gZWFzaWx5IGZpeCBp dCB3aGVuIHdlIGhhdmUgdGhlIGNoYW5jZS4gSSBkbw0KYWdyZWUgYWJvdXQgdGhlIGNoZWNrL2Nv cnJlY3Rpb24gaW4gbXVsdGlwbGUgcGxhY2VzLCBJIHdvdWxkbid0IGJlIHRvbw0Kb3Bwb3NlZCB0 byByZW1vdmluZyBpdCBlbnRpcmVseSBmcm9tIGhlcmUuDQoNCj4gDQo+ID4gK3N0YXRpYyBpbnQg YnR0X3JlY292ZXJfZmlyc3Rfc2Ioc3RydWN0IGJ0dF9jaGsgKmJ0dGMpDQo+ID4gK3sNCj4gDQo+ IFtzbmlwXQ0KPiA+ICsJLyoNCj4gPiArCcKgKiBBdHRlbXB0IDI6IEZyb20gdGhlIHZlcnkgZW5k IG9mICdyYXdzaXplJywgdHJ5IHRvIGNvcHkNCj4gPiB0aGUgZmllbGRzDQo+ID4gKwnCoCogdGhh dCBhcmUgY29uc3RhbnQgaW4gZXZlcnkgYXJlbmEgKG9ubHkgdmFsaWQgd2hlbg0KPiA+IG11bHRp cGxlIGFyZW5hcw0KPiA+ICsJwqAqIGFyZSBwcmVzZW50KQ0KPiA+ICsJwqAqLw0KPiA+ICsJaWYg KGVzdF9hcmVuYXMgPiAxKSB7DQo+ID4gKwkJb2Zmc2V0ID0gcm91bmRkb3duKGJ0dGMtPnJhd3Np emUgLSByZW1haW5pbmcsDQo+ID4gQlRUX1BHX1NJWkUpIC0NCj4gPiArCQkJMiAqIEJUVF9QR19T SVpFOw0KPiA+ICsJCXByaW50ZigiQXR0ZW1wdGluZyB0byByZWNvdmVyIGluZm8tYmxvY2sgZnJv bSBlbmQNCj4gPiBvZmZzZXQgJSNsbHhcbiIsIG9mZnNldCk7DQo+ID4gKwkJcmMgPSBidHRfcmVh ZF9pbmZvKGJ0dGMsICZidHRfc2JbMV0sIG9mZnNldCk7DQo+ID4gKwkJaWYgKHJjKQ0KPiA+ICsJ CQlnb3RvIG91dDsNCj4gDQo+IEhvdyBhYm91dCB3ZSB2ZXJpZnkgdGhlIGluZm8gYmxvY2sgYmVm b3JlIGJsaW5kbGx5IGNvcHlpbmcgaW4gdGhlDQo+IGRhdGE/DQo+IEkga25vdyB5b3UgdmVyaWZ5 IHRoZSByZXN1bHQsIGJ1dCBpdCdzIHdlaXJkLg0KDQpGYWlyIHBvaW50LCBhbmQgc2hvdWxkIGJl IGVhc3kgdG8gZG8uDQoNCj4gDQo+ID4gKwkJLyogY29weSBvdmVyIHRoZSBhcmVuYTAgc3BlY2lm aWMgZmllbGRzIGZyb20NCj4gPiBidHRfc2JbMF0gKi8NCj4gPiArCQlidHRfc2JbMV0uZmxhZ3Mg PSBidHRfc2JbMF0uZmxhZ3M7DQo+ID4gKwkJYnR0X3NiWzFdLmV4dGVybmFsX25sYmEgPSBidHRf c2JbMF0uZXh0ZXJuYWxfbmxiYTsNCj4gPiArCQlidHRfc2JbMV0uaW50ZXJuYWxfbmxiYSA9IGJ0 dF9zYlswXS5pbnRlcm5hbF9ubGJhOw0KPiA+ICsJCWJ0dF9zYlsxXS5uZXh0b2ZmID0gYnR0X3Ni WzBdLm5leHRvZmY7DQo+ID4gKwkJYnR0X3NiWzFdLmRhdGFvZmYgPSBidHRfc2JbMF0uZGF0YW9m ZjsNCj4gPiArCQlidHRfc2JbMV0ubWFwb2ZmID0gYnR0X3NiWzBdLm1hcG9mZjsNCj4gPiArCQli dHRfc2JbMV0ubG9nb2ZmID0gYnR0X3NiWzBdLmxvZ29mZjsNCj4gPiArCQlidHRfc2JbMV0uaW5m bzJvZmYgPSBidHRfc2JbMF0uaW5mbzJvZmY7DQo+ID4gKwkJYnR0X3NiWzFdLmNoZWNrc3VtID0g YnR0X3NiWzBdLmNoZWNrc3VtOw0KPiA+ICsJCXJjID0gYnR0X2luZm9fdmVyaWZ5KGJ0dGMsICZi dHRfc2JbMV0pOw0KPiA+ICsJCWlmIChyYyA9PSAwKSB7DQo+ID4gKwkJCXJjID0gYnR0X3dyaXRl X2luZm8oYnR0YywgJmJ0dF9zYlsxXSwgMCk7DQo+ID4gKwkJCWdvdG8gb3V0Ow0KPiA+ICsJCX0N Cj4gPiArCX0NCj4gPiArDQo+ID4gKwkvKg0KPiA+ICsJwqAqIEF0dGVtcHQgMzogdXNlIGluZm8y b2ZmIGFzLWlzLCBhbmQgY2hlY2sgaWYgd2UgZmluZCBhDQo+ID4gdmFsaWQgaW5mbw0KPiA+ICsJ wqAqIGJsb2NrIGF0IHRoYXQgbG9jYXRpb24uDQo+ID4gKwnCoCovDQo+ID4gKwnCoG9mZnNldCA9 IGxlMzJ0b2goYnR0X3NiWzBdLmluZm8yb2ZmKTsNCj4gPiArCcKgaWYgKG9mZnNldCkgew0KPiAN Cj4gTWF5YmUgZG8gc29tZSBib3VuZHMgY2hlY2tpbmcgb24gb2Zmc2V0Pw0KDQpJZiB0aGUgb2Zm c2V0IGlzIGJvZ3VzIGVpdGhlciB0aGUgcmVhZCB3aWxsIGZhaWwgb3IgdGhlIHZlcmlmeSB3aWxs LCBidXQNCnllcyBJIGNvdWxkIGFkZCBjaGVja2luZyB0b28uDQoNCj4gDQo+ID4gKwkJcHJpbnRm KCJBdHRlbXB0aW5nIHRvIHJlY292ZXIgaW5mby1ibG9jayBmcm9tIGluZm8yDQo+ID4gb2Zmc2V0 IChhcy1pcykgJSNsbHhcbiIsIG9mZnNldCk7DQo+ID4gKwkJcmMgPSBidHRfcmVhZF9pbmZvKGJ0 dGMsICZidHRfc2JbMV0sIG9mZnNldCk7DQo+ID4gKwkJaWYgKHJjKQ0KPiA+ICsJCQlnb3RvIG91 dDsNCj4gPiArCQlyYyA9IGJ0dF9pbmZvX3ZlcmlmeShidHRjLCAmYnR0X3NiWzFdKTsNCj4gPiAr CQlpZiAocmMgPT0gMCkgew0KPiA+ICsJCQlyYyA9IGJ0dF93cml0ZV9pbmZvKGJ0dGMsICZidHRf c2JbMV0sIDApOw0KPiA+ICsJCQlnb3RvIG91dDsNCj4gPiArCQl9DQo+ID4gKwl9IGVsc2UNCj4g PiArCQlyYyA9IC1FTlhJTzsNCj4gDQo+IFlvdSBjb3VsZCBhbHNvIGxvb2sgZm9yIHRoZSBwcmlt YXJ5IGluZm8gYmxvY2tzIGZvciB0aGUgb3RoZXIgYXJlbmFzLg0KDQpUaGF0IHNlZW1zIGtpbmQg b2YgZGlmZmljdWx0IGFzIHdlIGRvbid0IHJlYWxseSBoYXZlIGFueSBpbmZvcm1hdGlvbiBvbg0K d2hlcmUgdGhlIG90aGVyIGFyZW5hcyBtaWdodCBiZS4NCldlIGNvdWxkIGRvIGEgZnVsbCBjYWxj dWxhdGlvbiBvZiAidGhpcyBpcyB3aGVyZSBJIHdvdWxkIGxheSBvdXQgdGhlDQphcmVuYXMgaWYg SSBoYWQgdGhpcyByYXdzaXplIiwgYnV0IEkgd2FzIGhvcGluZyB0byBhdm9pZCBkb2luZyB0aGF0 Li4NCg0KPiANCj4gPiArIG91dDoNCj4gPiArCWZyZWUoYnR0X3NiKTsNCj4gPiArCXJldHVybiBy YzsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBuYW1lc3BhY2VfY2hlY2soc3RydWN0 IG5kY3RsX3JlZ2lvbiAqcmVnaW9uLA0KPiA+ICsJCXN0cnVjdCBuZGN0bF9uYW1lc3BhY2UgKm5k bnMpDQo+ID4gK3sNCj4gDQo+IG5hbWVzcGFjZV9jaGVjayBzb3VuZHMgZ2VuZXJpYywgYnV0IGl0 IHJlYWxseSBvbmx5IHdvcmtzIGZvciB0aGUgYnR0Lg0KPiBBbHNvLCBzaG91bGQgd2UgdmVyaWZ5 IHRoYXQgdGhlIG5hbWVzcGFjZSB3YXMgY29uZmlndXJlZCB3aXRoIGEgYnR0DQo+IGJlZm9yZSBl dmVuIGF0dGVtcHRpbmcgdG8gY2hlY2sgaXQ/DQoNClRydWUuIEkgZGlkIHRoaW5rIG9mIGNoZWNr aW5nIGlmIHRoaXMgaXMgYSBidHQgbmFtZXNwYWNlIGJlZm9yZQ0KY2hlY2tpbmcsIGJ1dCBJIHRo aW5rIGlmIHRoZSBuYW1lc3BhY2UgaXMgZGlzYWJsZWQsIG15IHVuZGVyc3RhbmRpbmcgaXMNCm5k Y3RsIGFuZCBsaWJuZGN0bCBoYXZlIG5vIGlkZWEgd2hldGhlciBpdCBpcyBhIGJ0dCBuYW1lc3Bh Y2Ugb3Igbm90Lg0KVGhlIEJUVCBpcyBkaXNjb3ZlcmVkIGJ5IHRoZSBrZXJuZWwgd2hlbiBkb2lu ZyBpdCdzIHByb2JlLCBhbmQgb25jZSBpdA0KaXMgdXAsIG5kY3RsIGNhbiBzZWUgdGhhdCwgYnV0 IHVudGlsIHRoZW4sIGl0IGNhbiByZWFsbHkgb25seSBmaW5kIG91dA0KaWYgdGhlcmUgaXMgYSB2 YWxpZCBCVFQgYnkgdHJ5aW5nIHRvIHJlYWQgdGhlIG1ldGFkYXRhIGl0c2VsZi4NCg0KSWYgdGhl cmUgaXMgYSBmdXR1cmUsIGRpZmZlcmVudCBtZXRhZGF0YSBmb3JtYXQsIEknZCBpbWFnaW5lIGl0 cw0KY2hlY2tpbmcgd291bGQgYWxzbyBiZWdpbiBoZXJlLCBidXQgYnJhbmNoIG9mZiBiYXNlZCBv biB3aGljaCBmb3JtYXQgd2FzDQpmb3VuZC4NCg0KPiANCj4gPiArCXJhd19tb2RlID0gbmRjdGxf bmFtZXNwYWNlX2dldF9yYXdfbW9kZShuZG5zKTsNCj4gPiArCW5kY3RsX25hbWVzcGFjZV9zZXRf cmF3X21vZGUobmRucywgMSk7DQo+ID4gKwlyYyA9IG5kY3RsX25hbWVzcGFjZV9lbmFibGUobmRu cyk7DQo+ID4gKwlpZiAocmMgIT0gMCkNCj4gPiArCQllcnJvcigiJXM6IGZhaWxlZCB0byBlbmFi bGUgcmF3IG1vZGVcbiIsIGRldm5hbWUpOw0KPiA+ICsJbmRjdGxfbmFtZXNwYWNlX3NldF9yYXdf bW9kZShuZG5zLCByYXdfbW9kZSk7DQo+IA0KPiBXaGF0IHRoZSBoZWNrIGRvIHRoZSBhYm92ZSA2 IGxpbmVzIGRvP8KgwqBQbGVhc2UgZXhwbGFpbi4NCg0KTGluZGEgaGFkIHRoZSBzYW1lIHF1ZXN0 aW9uIHNvIEkgc3VwcG9zZSBJIHNob3VsZCBhdCBsZWFzdCBoYXZlIGENCmNvbW1lbnQgdGhlcmUg OikNCkJ1dCB0aGUgaWRlYSBpcyB3ZSBnZXQgdGhlIGV4aXN0aW5nIG1vZGUgKHJhdyBvciBub3Qp LCBhbmQgc2F2ZSBpdCBpbg0KcmF3X21vZGUuIFRoZW4gdHJ5IHRvIGVuYWJsZSBpdCB3aXRoIHJh d19tb2RlID0gMS4gSWYgaXQgZmFpbHMsIHJlc3RvcmUNCnRoZSBzYXZlZCByYXdfbW9kZS4NCg0K TWF5YmUgdGhpcyBpcyBhIGJpdCBwb2ludGxlc3M/IEJ1dCB3ZSBzaG91bGQgdHJ5IGFuZCBrZWVw IHRoaW5ncyBpbiB0aGUNCnNhbWUgc3RhdGUgdGhlIHVzZXIgaGFkLCByaWdodD8gOikNCg0KPiAN Cj4gVGhhbmtzIQ0KPiBKZWZmDQoNCg0KVGhhbmtzIGZvciB0aGUgcmV2aWV3LCBJJ2xsIHN0YXJ0 IHdvcmtpbmcgb24gdGhlIGNoYW5nZXMgYW5kIHNlbmQgb3V0IGENCnYyIG5leHQgd2VlayEKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgtbnZkaW1t IG1haWxpbmcgbGlzdApMaW51eC1udmRpbW1AbGlzdHMuMDEub3JnCmh0dHBzOi8vbGlzdHMuMDEu b3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbnZkaW1tCg==