From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: Re: [PATCH] [v2] intel_frequency: A tool to manipulate Intel GPU frequency Date: Tue, 13 Jan 2015 14:36:56 -0800 Message-ID: <20150113223655.GA26112@bwidawsk.net> References: <1420949969-877-2-git-send-email-benjamin.widawsky@intel.com> <1421033721-3601-1-git-send-email-benjamin.widawsky@intel.com> <20150112034742.GA3698@bwidawsk.net> <411E5DC12A51ED4CB1159E14310E532B9EB6C5CB@FMSMSX119.amr.corp.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail.bwidawsk.net (bwidawsk.net [166.78.191.112]) by gabe.freedesktop.org (Postfix) with ESMTP id 8D87D6E4DD for ; Tue, 13 Jan 2015 14:37:04 -0800 (PST) Content-Disposition: inline In-Reply-To: <411E5DC12A51ED4CB1159E14310E532B9EB6C5CB@FMSMSX119.amr.corp.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "O'Rourke, Tom" Cc: Intel GFX , "Widawsky, Benjamin" List-Id: intel-gfx@lists.freedesktop.org T24gVHVlLCBKYW4gMTMsIDIwMTUgYXQgMDk6MTk6MDRQTSArMDAwMCwgTydSb3Vya2UsIFRvbSB3 cm90ZToKPiA+U2VudDogU3VuZGF5LCBKYW51YXJ5IDExLCAyMDE1IDc6NDggUE0KPiA+VG86IFdp ZGF3c2t5LCBCZW5qYW1pbgo+ID5DYzogSW50ZWwgR0ZYCj4gPlN1YmplY3Q6IFJlOiBbSW50ZWwt Z2Z4XSBbUEFUQ0hdIFt2Ml0gaW50ZWxfZnJlcXVlbmN5OiBBIHRvb2wgdG8gbWFuaXB1bGF0ZSBJ bnRlbAo+ID5HUFUgZnJlcXVlbmN5Cj4gPgo+ID5PbiBTdW4sIEphbiAxMSwgMjAxNSBhdCAwNzoz NToyMVBNIC0wODAwLCBCZW4gV2lkYXdza3kgd3JvdGU6Cj4gPj4gV0FSTklORzogdmVyeSBtaW5p bWFsbHkgdGVzdGVkCj4gPj4KPiA+PiBJbiBnZW5lcmFsIHlvdSBzaG91bGQgbm90IG5lZWQgdGhp cyB0b29sLiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyBmb3IKPiA+PiBiZW5jaG1hcmtpbmcsIGFu ZCBmb3IgZGVidWdnaW5nIHBlcmZvcm1hbmNlIGlzc3Vlcy4KPiA+Cj4gPkkgbm90aWNlZCB0aGUg Iml0J3MiIHZzICJpdHMiIG9uIHYxLCBidXQgZm9yZ290IHRvIGZpeCBpdC4gSVQnUyBmaXhlZCBs b2NhbGx5Cj4gPnRob3VnaC4KPiA+Cj4gPj4KPiA+PiBGb3IgbWFueSBrZXJuZWwgcmVsZWFzZXMg bm93IHN5c2ZzIGhhcyBzdXBwb3J0ZWQgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgR1BVCj4gPj4g ZnJlcXVlbmN5LiBUaGVyZWZvcmUsIHRoaXMgdG9vbCBwcm92aWRlcyBubyBuZXcgZnVuY3Rpb25h bGl0eS4gV2hhdCBpdCBkb2VzCj4gPj4gcHJvdmlkZSBpcyBhbiBlYXN5IHRvIHBhY2thZ2UgKGZv ciBkaXN0cm9zKSB0b29sIHRoYXQgaGFuZGxlcyB0aGUgbW9zdCBjb21tb24KPiA+PiBzY2VuYXJp b3MuCj4gW1RPUjpdIFRoaXMgaXMgYSBuaWNlIHRvb2wuICAKPiBJIGFtIGNvbmNlcm5lZCB0aGF0 IHRoaXMgdG9vbCBtYXkgYmUgY29uZnVzaW5nIFJQMSBmcmVxdWVuY3kgd2l0aCBSUGUgKEVmZmlj aWVudCkgZnJlcXVlbmN5LiAgT24gbWFueSBwbGF0Zm9ybXMsIHRoZXNlIGFyZSBub3QgdGhlIHNh bWUgdGhpbmcuIAo+IFRoYW5rcywKPiBUb20gTydSb3Vya2UKPiAKCkFueSBwbGF0Zm9ybSBvdGhl ciB0aGFuIEJZVC9DSFY/Cj4+ICsgICAgICAgICAgY2FzZSAnZSc6IC8qIGVmZmljaWVudCAqLwo+ PiArICAgICAgICAgICAgICAgICAgaWYgKElTX1ZBTExFWVZJRVcoZGV2aWQpIHx8IElTX0NIRVJS WVZJRVcoZGV2aWQpKSB7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBMUCBw YXJ0cyBoYXZlIHNwZWNpYWwgZWZmaWNpZW50ID4+IGZyZXF1ZW5jaWVzCj4qLwo+PiArICAgICAg ICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKPj4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiRklYTUU6IFdhcm5pbmcgZWZmaWNpZW50IGZyZXF1ZW5jeSA+aW5m b3JtYXRpb24gaXMgaW5jb3JyZWN0LlxuIik7Cj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAg IGV4aXQoRVhJVF9GQUlMVVJFKTsKPj4gKyAgICAgICAgICAgICAgICAgIH0KCj4gPj4KPiA+PiB2 MjoKPiA+PiBHZXQgcmlkIG9mIC1mIGZyb20gdGhlIHVzYWdlIG1lc3NhZ2UgKEpvcmRhbikKPiA+ PiBBZGQgc3BhY2UgYmVmb3JlIFstcyAoSm9yZGFuKQo+ID4+IEFkZCBhIC1jLy0tY3VzdG9tIGV4 YW1wbGUgKEpvcmRhbikKPiA+PiBBZGQgYSBzZXR0aW5nIGZvciByZXNldHRpbmcgdG8gaGFyZHdh cmUgZGVmYXVsdCAoS2VuKQo+ID4+IFJlcGxpY2F0ZSBleGFtcGxlcyBpbiBjb21taXQgbWVzc2Fn ZSBpbiB0aGUgc291cmNlIGNvZGUuIChtZSkKPiA+Pgo+ID4+IFNpZ25lZC1vZmYtYnk6IEJlbiBX aWRhd3NreSA8YmVuQGJ3aWRhd3NrLm5ldD4KPiA+PiBSZXZpZXdlZC1ieTogSm9yZGFuIEp1c3Rl biA8am9yZGFuLmwuanVzdGVuQGludGVsLmNvbT4KPiA+PiBDYzogS2VubmV0aCBHcmF1bmtlIDxr ZW5uZXRoQHdoaXRlY2FwZS5vcmc+Cj4gPj4KPiA+PiBIZXJlIGFyZSBzb21lIHNhbXBsZSB1c2Fn ZXM6Cj4gPj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLWdldD1jdXIsbWluLG1heCxlZmYKPiA+ PiBjdXI6IDIwMCBNSHoKPiA+PiBtaW46IDIwMCBNSHoKPiA+PiBSUDE6IDIwMCBNSHoKPiA+PiBt YXg6IDEyMDAgTUh6Cj4gPj4KPiA+PiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nCj4gPj4gY3Vy OiAyMDAgTUh6Cj4gPj4gbWluOiAyMDAgTUh6Cj4gPj4gUlAxOiAyMDAgTUh6Cj4gPj4gbWF4OiAx MjAwIE1Iego+ID4+Cj4gPj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZ2VmZgo+ID4+IFJQMTog MjAwIE1Iego+ID4+Cj4gPj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLXNldCBtaW49MzAwCj4g Pj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLWdldCBtaW4KPiA+PiBjdXI6IDMwMCBNSHoKPiA+ PiBtaW46IDMwMCBNSHoKPiA+PiBSUDE6IDIwMCBNSHoKPiA+PiBtYXg6IDEyMDAgTUh6Cj4gPj4K PiA+PiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tY3VzdG9tIG1heD05MDAKPiA+PiAkIHN1ZG8g aW50ZWxfZnJlcXVlbmN5IC0tZ2V0IG1heAo+ID4+IGN1cjogMzAwIE1Iego+ID4+IG1pbjogMzAw IE1Iego+ID4+IFJQMTogMjAwIE1Iego+ID4+IG1heDogOTAwIE1Iego+ID4+Cj4gPj4gJCBzdWRv IGludGVsX2ZyZXF1ZW5jeSAtLW1heAo+ID4+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWcKPiA+ PiBjdXI6IDEyMDAgTUh6Cj4gPj4gbWluOiAxMjAwIE1Iego+ID4+IFJQMTogMjAwIE1Iego+ID4+ IG1heDogMTIwMCBNSHoKPiA+Pgo+ID4+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWUKPiA+PiAk IHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nCj4gPj4gY3VyOiAyMDAgTUh6Cj4gPj4gbWluOiAyMDAg TUh6Cj4gPj4gUlAxOiAyMDAgTUh6Cj4gPj4gbWF4OiAyMDAgTUh6Cj4gPj4KPiA+PiAkIHN1ZG8g aW50ZWxfZnJlcXVlbmN5IC0tbWF4Cj4gPj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwo+ID4+ IGN1cjogMTIwMCBNSHoKPiA+PiBtaW46IDEyMDAgTUh6Cj4gPj4gUlAxOiAyMDAgTUh6Cj4gPj4g bWF4OiAxMjAwIE1Iego+ID4+Cj4gPj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLW1pbgo+ID4+ ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWcKPiA+PiBjdXI6IDIwMCBNSHoKPiA+PiBtaW46IDIw MCBNSHoKPiA+PiBSUDE6IDIwMCBNSHoKPiA+PiBtYXg6IDIwMCBNSHoKPiA+PiAtLS0KPiA+PiAg dG9vbHMvTWFrZWZpbGUuc291cmNlcyAgfCAgIDEgKwo+ID4+ICB0b29scy9pbnRlbF9mcmVxdWVu Y3kuYyB8IDM2Mwo+ID4rKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysKPiA+PiAgMiBmaWxlcyBjaGFuZ2VkLCAzNjQgaW5zZXJ0aW9ucygrKQo+ID4+ICBjcmVh dGUgbW9kZSAxMDA2NDQgdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMKPiA+Pgo+ID4+IGRpZmYgLS1n aXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+ID4+ IGluZGV4IGI4NWE2YjguLjJiZWEzODkgMTAwNjQ0Cj4gPj4gLS0tIGEvdG9vbHMvTWFrZWZpbGUu c291cmNlcwo+ID4+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPiA+PiBAQCAtMTQsNiAr MTQsNyBAQCBiaW5fUFJPR1JBTVMgPSAJCQkJXAo+ID4+ICAJaW50ZWxfZHVtcF9kZWNvZGUgCQlc Cj4gPj4gIAlpbnRlbF9lcnJvcl9kZWNvZGUgCQlcCj4gPj4gIAlpbnRlbF9mb3JjZXdha2VkCQlc Cj4gPj4gKwlpbnRlbF9mcmVxdWVuY3kJCQlcCj4gPj4gIAlpbnRlbF9mcmFtZWJ1ZmZlcl9kdW1w IAkJXAo+ID4+ICAJaW50ZWxfZ3B1X3RpbWUgCQkJXAo+ID4+ICAJaW50ZWxfZ3B1X3RvcCAJCQlc Cj4gPj4gZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2ZyZXF1ZW5jeS5jIGIvdG9vbHMvaW50ZWxf ZnJlcXVlbmN5LmMKPiA+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4+IGluZGV4IDAwMDAwMDAu LjU5ZjM4MTQKPiA+PiAtLS0gL2Rldi9udWxsCj4gPj4gKysrIGIvdG9vbHMvaW50ZWxfZnJlcXVl bmN5LmMKPiA+PiBAQCAtMCwwICsxLDM2MyBAQAo+ID4+ICsvKgo+ID4+ICsgKiBDb3B5cmlnaHQg wqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgo+ID4+ICsgKgo+ID4+ICsgKiBQZXJtaXNzaW9uIGlz IGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcg YQo+ID4+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh dGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ID4+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0 d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4g Pj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBk aXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ID4+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhl IFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiA+PiArICogU29m dHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29u ZGl0aW9uczoKPiA+PiArICoKPiA+PiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ID4+ICsgKiBwYXJh Z3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9y dGlvbnMgb2YgdGhlCj4gPj4gKyAqIFNvZnR3YXJlLgo+ID4+ICsgKgo+ID4+ICsgKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwK PiA+RVhQUkVTUyBPUgo+ID4+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVE IFRPIFRIRSBXQVJSQU5USUVTIE9GCj4gPk1FUkNIQU5UQUJJTElUWSwKPiA+PiArICogRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PCj4g PkVWRU5UIFNIQUxMCj4gPj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLAo+ID5EQU1BR0VTIE9SIE9USEVSCj4gPj4gKyAqIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LAo+ID5BUklTSU5HCj4gPj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEgg VEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKPiA+T1RIRVIKPiA+PiArICogREVBTElOR1MgSU4g VEhFIFNPRlRXQVJFLgo+ID4+ICsgKgo+ID4+ICsgKiBFeGFtcGxlOgo+ID4+ICsgKiBHZXQgYWxs IGZyZXF1ZW5jaWVzOgo+ID4+ICsgKiBpbnRlbF9mcmVxdWVuY3kgLS1nZXQ9Y3VyLG1pbixtYXgs ZWZmCj4gPj4gKyAqCj4gPj4gKyAqIFNhbWUgYXMgYWJvdmU6Cj4gPj4gKyAqIGludGVsX2ZyZXF1 ZW5jeSAtZwo+ID4+ICsgKgo+ID4+ICsgKiBHZXQgdGhlIGVmZmljaWVudCBmcmVxdWVuY3k6Cj4g Pj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtZ2VmZgo+ID4+ICsgKgo+ID4+ICsgKiBMb2NrIHRoZSBH UFUgZnJlcXVlbmN5IHRvIDMwME1IejoKPiA+PiArICogaW50ZWxfZnJlcXVlbmN5IC0tc2V0IG1p bj0zMDAKPiA+PiArICoKPiA+PiArICogU2V0IHRoZSBtYXhpbXVtIGZyZXF1ZW5jeSB0byA5MDBN SHo6Cj4gPj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtLWN1c3RvbSBtYXg9OTAwCj4gPj4gKyAqCj4g Pj4gKyAqIExvY2sgdGhlIEdQVSBmcmVxdWVuY3kgdG8gaXRzIG1heGltdW0gZnJlcXVlbmN5Ogo+ ID4+ICsgKiBpbnRlbF9mcmVxdWVuY3kgLS1tYXgKPiA+PiArICoKPiA+PiArICogTG9jayB0aGUg R1BVIGZyZXF1ZW5jeSB0byBpdHMgbW9zdCBlZmZpY2llbnQgZnJlcXVlbmN5Ogo+ID4+ICsgKiBp bnRlbF9mcmVxdWVuY3kgLWUKPiA+PiArICoKPiA+PiArICogTG9jayBUaGUgR1BVIGZyZXF1ZW5j eSB0byBpdHMgbWluaW11bSBmcmVxdWVuY3k6Cj4gPj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtLW1p bgo+ID4+ICsgKgo+ID4+ICsgKiBSZXNldCB0aGUgR1BVIHRvIGhhcmR3YXJlIGRlZmF1bHRzCj4g Pj4gKyAqIGludGVsX2ZyZXF1ZW5jeSAtZAo+ID4+ICsgKi8KPiA+PiArCj4gPj4gKyNkZWZpbmUg X0dOVV9TT1VSQ0UKPiA+PiArI2luY2x1ZGUgPGFzc2VydC5oPgo+ID4+ICsjaW5jbHVkZSA8Z2V0 b3B0Lmg+Cj4gPj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+ID4+ICsjaW5jbHVkZSA8dGltZS5oPgo+ ID4+ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gPj4gKwo+ID4+ICsjaW5jbHVkZSAiZHJtdGVzdC5o Igo+ID4+ICsjaW5jbHVkZSAiaW50ZWxfY2hpcHNldC5oIgo+ID4+ICsKPiA+PiArc3RhdGljIGlu dCBkZXZpY2UsIGRldmlkOwo+ID4+ICsKPiA+PiArZW51bSB7Cj4gPj4gKwlDVVI9MCwKPiA+PiAr CU1JTiwKPiA+PiArCUVGRiwKPiA+PiArCU1BWCwKPiA+PiArCVJQMCwKPiA+PiArCVJQbgo+ID4+ ICt9Owo+ID4+ICsKPiA+PiArc3RydWN0IGZyZXFfaW5mbyB7Cj4gPj4gKwljb25zdCBjaGFyICpu YW1lOwo+ID4+ICsJY29uc3QgY2hhciAqbW9kZTsKPiA+PiArCUZJTEUgKmZpbHA7Cj4gPj4gKwlj aGFyICpwYXRoOwo+ID4+ICt9Owo+ID4+ICsKPiA+PiArc3RhdGljIHN0cnVjdCBmcmVxX2luZm8g aW5mb1tdID0gewo+ID4+ICsJeyAiY3VyIiwgInIiICB9LAo+ID4+ICsJeyAibWluIiwgInJiKyIg fSwKPiA+PiArCXsgIlJQMSIsICJyIiB9LAo+ID4+ICsJeyAibWF4IiwgInJiKyIgfSwKPiA+PiAr CXsgIlJQMCIsICJyIiB9LAo+ID4+ICsJeyAiUlBuIiwgInIiIH0KPiA+PiArfTsKPiA+PiArCj4g Pj4gK3N0YXRpYyBjaGFyICoKPiA+PiArZ2V0X3N5c2ZzX3BhdGgoY29uc3QgY2hhciAqd2hpY2gp Cj4gPj4gK3sKPiA+PiArCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIi9zeXMvY2xhc3MvZHJt L2NhcmQlMWQvZ3RfJTNzX2ZyZXFfbWh6IjsKPiA+PiArCWNoYXIgKnBhdGg7Cj4gPj4gKwlpbnQg cmV0Owo+ID4+ICsKPiA+PiArI2RlZmluZSBTVEFUSUNfU1RSTEVOKHN0cmluZykgKHNpemVvZihz dHJpbmcpIC8gc2l6ZW9mKHN0cmluZyBbMF0pKQo+ID4+ICsJcmV0ID0gYXNwcmludGYoJnBhdGgs IGZtdCwgZGV2aWNlLCB3aGljaCk7Cj4gPj4gKwlhc3NlcnQocmV0ID09IChTVEFUSUNfU1RSTEVO KGZtdCkgLSAzKSk7Cj4gPj4gKyN1bmRlZiBTVEFUSUNfU1RSTEVOCj4gPj4gKwo+ID4+ICsJcmV0 dXJuIHBhdGg7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkCj4gPj4gK2luaXRpYWxp emVfZnJlcV9pbmZvKHN0cnVjdCBmcmVxX2luZm8gKmZyZXFfaW5mbykKPiA+PiArewo+ID4+ICsJ aWYgKGZyZXFfaW5mby0+ZmlscCkKPiA+PiArCQlyZXR1cm47Cj4gPj4gKwo+ID4+ICsJZnJlcV9p bmZvLT5wYXRoID0gZ2V0X3N5c2ZzX3BhdGgoZnJlcV9pbmZvLT5uYW1lKTsKPiA+PiArCWFzc2Vy dChmcmVxX2luZm8tPnBhdGgpOwo+ID4+ICsJZnJlcV9pbmZvLT5maWxwID0gZm9wZW4oZnJlcV9p bmZvLT5wYXRoLCBmcmVxX2luZm8tPm1vZGUpOwo+ID4+ICsJYXNzZXJ0KGZyZXFfaW5mby0+Zmls cCk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHdhaXRfZnJlcV9zZXR0bGUodm9p ZCkKPiA+PiArewo+ID4+ICsJc3RydWN0IHRpbWVzcGVjIHRzOwo+ID4+ICsKPiA+PiArCS8qIEZJ WE1FOiBMYXp5IHNsZWVwIHdpdGhvdXQgY2hlY2suICovCj4gPj4gKwl0cy50dl9zZWMgPSAwOwo+ ID4+ICsJdHMudHZfbnNlYyA9IDIwMDAwOwo+ID4+ICsJY2xvY2tfbmFub3NsZWVwKENMT0NLX01P Tk9UT05JQywgMCwgJnRzLCBOVUxMKTsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHZvaWQg c2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZnJlcV9pbmZvICpmcmVxX2luZm8sIGludCB2YWwpCj4gPj4g K3sKPiA+PiArCWluaXRpYWxpemVfZnJlcV9pbmZvKGZyZXFfaW5mbyk7Cj4gPj4gKwlyZXdpbmQo ZnJlcV9pbmZvLT5maWxwKTsKPiA+PiArCWFzc2VydChmcHJpbnRmKGZyZXFfaW5mby0+ZmlscCwg IiVkIiwgdmFsKSA+IDApOwo+ID4+ICsKPiA+PiArCXdhaXRfZnJlcV9zZXR0bGUoKTsKPiA+PiAr fQo+ID4+ICsKPiA+PiArc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBmcmVxX2luZm8g KmZyZXFfaW5mbykKPiA+PiArewo+ID4+ICsJaW50IHZhbDsKPiA+PiArCj4gPj4gKwlpbml0aWFs aXplX2ZyZXFfaW5mbyhmcmVxX2luZm8pOwo+ID4+ICsJcmV3aW5kKGZyZXFfaW5mby0+ZmlscCk7 Cj4gPj4gKwlhc3NlcnQoZnNjYW5mKGZyZXFfaW5mby0+ZmlscCwgIiVkIiwgJnZhbCk9PTEpOwo+ ID4+ICsKPiA+PiArCXJldHVybiB2YWw7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lk Cj4gPj4gK3VzYWdlKGNvbnN0IGNoYXIgKnByb2cpCj4gPj4gK3sKPiA+PiArCXByaW50ZigiVXNh Z2U6ICVzIFstZV0gWy0tbWluIHwgLS1tYXhdIFstZyAobWlufG1heHxlZmZpY2llbnQpXSBbLXMK PiA+ZnJlcXVlbmN5X21oel1cblxuIiwgcHJvZyk7Cj4gPj4gKwlwcmludGYoIiVzIEEgcHJvZ3Jh bSB0byBtYW5pcHVsYXRlIEludGVsIEdQVSBmcmVxdWVuY2llcy5cblxuIiwgcHJvZyk7Cj4gPj4g KwlwcmludGYoIk9wdGlvbnM6IFxuIik7Cj4gPj4gKwlwcmludGYoIiAgLWUJCUxvY2sgZnJlcXVl bmN5IHRvIHRoZSBtb3N0IGVmZmljaWVudAo+ID5mcmVxdWVuY3lcbiIpOwo+ID4+ICsJcHJpbnRm KCIgIC1nLCAtLWdldD0gICAgR2V0IHRoZSBmcmVxdWVuY3kgKG9wdGlvbmFsIGFyZzoKPiA+XCJj dXJcInxcIm1pblwifFwibWF4XCJ8XCJlZmZcIilcbiIpOwo+ID4+ICsJcHJpbnRmKCIgIC1zLCAt LXNldCAgICAgTG9jayBmcmVxdWVuY3kgdG8gYW4gYWJzb2x1dGUgdmFsdWUgKE1IeilcbiIpOwo+ ID4+ICsJcHJpbnRmKCIgIC1jLCAtLWN1c3RvbSAgU2V0IGEgbWluLCBvciBtYXggZnJlcXVlbmN5 IFwibWluPVggfAo+ID5tYXg9WVwiXG4iKTsKPiA+PiArCXByaW50ZigiICAtbSAgLS1tYXggICAg IExvY2sgZnJlcXVlbmN5IHRvIG1heCBmcmVxdWVuY3lcbiIpOwo+ID4+ICsJcHJpbnRmKCIgIC1p ICAtLW1pbiAgICAgTG9jayBmcmVxdWVuY3kgdG8gbWluIChuZXZlciBhIGdvb2QgaWRlYSwgREVC VUcKPiA+T05MWSlcbiIpOwo+ID4+ICsJcHJpbnRmKCIgIC1kICAtLWRlZmF1bHRzICBSZXR1cm4g dGhlIHN5c3RlbSB0byBoYXJkd2FyZSBkZWZhdWx0c1xuIik7Cj4gPj4gKwlwcmludGYoIkV4YW1w bGVzOlxuIik7Cj4gPj4gKwlwcmludGYoIlx0aW50ZWxfZnJlcXVlbmN5IC1nbWluLGN1ciBHZXQg dGhlIGN1cnJlbnQgYW5kIG1pbmltdW0KPiA+ZnJlcXVlbmN5XG4iKTsKPiA+PiArCXByaW50Zigi XHRpbnRlbF9mcmVxdWVuY3kgLXMgNDAwICAgIExvY2sgZnJlcXVlbmN5IHRvIDQwME1oelxuIik7 Cj4gPj4gKwlwcmludGYoIlx0aW50ZWxfZnJlcXVlbmN5IC1jIG1heD03NTAgU2V0IHRoZSBtYXgg ZnJlcXVlbmN5IHRvCj4gPjc1ME1IelxuIik7Cj4gPj4gKwlleGl0KEVYSVRfRkFJTFVSRSk7Cj4g Pj4gK30KPiA+PiArCj4gPj4gKy8qIFJldHVybnMgcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gKi8K PiA+PiArc3RhdGljIGJvb2wKPiA+PiArcGFyc2UoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgYm9v bCAqYWN0X3Vwb24sIGludCAqbmV3X2ZyZXEpCj4gPj4gK3sKPiA+PiArCWludCBjLCB0bXA7Cj4g Pj4gKwlib29sIHdyaXRlID0gZmFsc2U7Cj4gPj4gKwo+ID4+ICsJY2hhciAqdG9rZW5bXSA9IHsK PiA+PiArCQkoY2hhciAqKWluZm9bQ1VSXS5uYW1lLAo+ID4+ICsJCShjaGFyICopaW5mb1tNSU5d Lm5hbWUsCj4gPj4gKwkJKGNoYXIgKikiZWZmIiwKPiA+PiArCQkoY2hhciAqKWluZm9bTUFYXS5u YW1lCj4gPj4gKwl9Owo+ID4+ICsKPiA+PiArCS8qIE5vIGFyZ3MgbWVhbnMgLWciICovCj4gPj4g KwlpZiAoYXJnYyA9PSAxKSB7Cj4gPj4gKwkJZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUoYWN0 X3Vwb24pOyBjKyspCj4gPj4gKwkJCWFjdF91cG9uW2NdID0gdHJ1ZTsKPiA+PiArCQlnb3RvIGRv bmU7Cj4gPj4gKwl9Cj4gPj4gKwl3aGlsZSAoMSkgewo+ID4+ICsJCWludCBvcHRpb25faW5kZXgg PSAwOwo+ID4+ICsJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0gewo+ID4+ ICsJCQl7ICJnZXQiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ2cnIH0sCj4gPj4gKwkJCXsg InNldCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAncycgfSwKPiA+PiArCQkJeyAiY3VzdG9t IiwgcmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdjJ30sCj4gPj4gKwkJCXsgIm1pbiIsIG5vX2Fy Z3VtZW50LCBOVUxMLCAnaScgfSwKPiA+PiArCQkJeyAibWF4Iiwgbm9fYXJndW1lbnQsIE5VTEws ICdtJyB9LAo+ID4+ICsJCQl7ICJkZWZhdWx0cyIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnZCcgfSwK PiA+PiArCQkJeyAiaGVscCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnaCcgfSwKPiA+PiArCQkJeyBO VUxMLCAwLCBOVUxMLCAwfQo+ID4+ICsJCX07Cj4gPj4gKwo+ID4+ICsJCWMgPSBnZXRvcHRfbG9u ZyhhcmdjLCBhcmd2LCAiZWc6OnM6YzptaWRoIiwgbG9uZ19vcHRpb25zLAo+ID4mb3B0aW9uX2lu ZGV4KTsKPiA+PiArCQlpZiAoYyA9PSAtMSkKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwo+ID4+ICsJ CXN3aXRjaCAoYykgewo+ID4+ICsJCWNhc2UgJ2cnOgo+ID4+ICsJCQlpZiAod3JpdGUgPT0gdHJ1 ZSkKPiA+PiArCQkJCWZwcmludGYoc3RkZXJyLCAiUmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyBu b3QKPiA+c3VwcG9ydCBzaW11bHRhbmVvdXNseS5cbiIpOwo+ID4+ICsKPiA+PiArCQkJaWYgKG9w dGFyZykgewo+ID4+ICsJCQkJY2hhciAqdmFsdWUsICpzdWJvcHRzID0gb3B0YXJnOwo+ID4+ICsJ CQkJaW50IHg7Cj4gPj4gKwkJCQl3aGlsZSAoKnN1Ym9wdHMgIT0gJ1wwJykgewo+ID4+ICsJCQkJ CXggPSBnZXRzdWJvcHQoJnN1Ym9wdHMsIHRva2VuLAo+ID4mdmFsdWUpOwo+ID4+ICsJCQkJCWlm ICh4ID09IC0xKSB7Cj4gPj4gKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkCj4g Pm9wdGlvbiAoJXMpXG4iLCB2YWx1ZSk7Cj4gPj4gKwkJCQkJCWJyZWFrOwo+ID4+ICsJCQkJCX0g ZWxzZQo+ID4+ICsJCQkJCQlhY3RfdXBvblt4XSA9IHRydWU7Cj4gPj4gKwkJCQl9Cj4gPj4gKwkJ CX0gZWxzZSB7Cj4gPj4gKwkJCQlpbnQgaTsKPiA+PiArCQkJCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKGFjdF91cG9uKTsgaSsrKQo+ID4+ICsJCQkJCWFjdF91cG9uW2ldID0gdHJ1ZTsKPiA+ PiArCQkJfQo+ID4+ICsJCQlicmVhazsKPiA+PiArCQljYXNlICdzJzoKPiA+PiArCQkJaWYgKCFv cHRhcmcpCj4gPj4gKwkJCQl1c2FnZShhcmd2WzBdKTsKPiA+PiArCj4gPj4gKwkJCWlmICh3cml0 ZSA9PSB0cnVlKSB7Cj4gPj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk9ubHkgb25lIHdyaXRlIG1h eSBiZSBzcGVjaWZpZWQKPiA+YXQgYSB0aW1lXG4iKTsKPiA+PiArCQkJCWV4aXQoRVhJVF9GQUlM VVJFKTsKPiA+PiArCQkJfQo+ID4+ICsKPiA+PiArCQkJd3JpdGUgPSB0cnVlOwo+ID4+ICsJCQlh Y3RfdXBvbltNSU5dID0gdHJ1ZTsKPiA+PiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gPj4g KwkJCXNzY2FuZihvcHRhcmcsICIlZCIsICZuZXdfZnJlcVtNQVhdKTsKPiA+PiArCQkJbmV3X2Zy ZXFbTUlOXSA9IG5ld19mcmVxW01BWF07Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgJ2Mn Ogo+ID4+ICsJCQlpZiAoIW9wdGFyZykKPiA+PiArCQkJCXVzYWdlKGFyZ3ZbMF0pOwo+ID4+ICsK PiA+PiArCQkJaWYgKHdyaXRlID09IHRydWUpIHsKPiA+PiArCQkJCWZwcmludGYoc3RkZXJyLCAi T25seSBvbmUgd3JpdGUgbWF5IGJlIHNwZWNpZmllZAo+ID5hdCBhIHRpbWVcbiIpOwo+ID4+ICsJ CQkJZXhpdChFWElUX0ZBSUxVUkUpOwo+ID4+ICsJCQl9Cj4gPj4gKwo+ID4+ICsJCQl3cml0ZSA9 IHRydWU7Cj4gPj4gKwo+ID4+ICsJCQlpZiAoIXN0cm5jbXAoIm1pbj0iLCBvcHRhcmcsIDQpKSB7 Cj4gPj4gKwkJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKPiA+PiArCQkJCXNzY2FuZihvcHRhcmcr NCwgIiVkIiwgJm5ld19mcmVxW01JTl0pOwo+ID4+ICsJCQl9IGVsc2UgaWYgKCFzdHJuY21wKCJt YXg9Iiwgb3B0YXJnLCA0KSkgewo+ID4+ICsJCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gPj4g KwkJCQlzc2NhbmYob3B0YXJnKzQsICIlZCIsICZuZXdfZnJlcVtNQVhdKTsKPiA+PiArCQkJfSBl bHNlIHsKPiA+PiArCQkJCWZwcmludGYoc3RkZXJyLCAiU2VsZWN0ZWQgdW5tb2RpZmlhYmxlCj4g PmZyZXF1ZW5jeVxuIik7Cj4gPj4gKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Cj4gPj4gKwkJCX0K PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSAnZSc6IC8qIGVmZmljaWVudCAqLwo+ID4+ICsJ CQlpZiAoSVNfVkFMTEVZVklFVyhkZXZpZCkgfHwgSVNfQ0hFUlJZVklFVyhkZXZpZCkpIHsKPiA+ PiArCQkJCS8qIHRoZSBMUCBwYXJ0cyBoYXZlIHNwZWNpYWwgZWZmaWNpZW50IGZyZXF1ZW5jaWVz Cj4gPiovCj4gPj4gKwkJCQlmcHJpbnRmKHN0ZGVyciwKPiA+PiArCQkJCQkiRklYTUU6IFdhcm5p bmcgZWZmaWNpZW50IGZyZXF1ZW5jeQo+ID5pbmZvcm1hdGlvbiBpcyBpbmNvcnJlY3QuXG4iKTsK PiA+PiArCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKPiA+PiArCQkJfQo+ID4+ICsJCQl0bXAgPSBn ZXRfZnJlcXVlbmN5KCZpbmZvW0VGRl0pOwo+ID4+ICsJCQluZXdfZnJlcVtNSU5dID0gdG1wOwo+ ID4+ICsJCQluZXdfZnJlcVtNQVhdID0gdG1wOwo+ID4+ICsJCQlhY3RfdXBvbltNSU5dID0gdHJ1 ZTsKPiA+PiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gPj4gKwkJCXdyaXRlID0gdHJ1ZTsK PiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSAnaSc6IC8qIG1JbiAqLwo+ID4+ICsJCQl0bXAg PSBnZXRfZnJlcXVlbmN5KCZpbmZvW1JQbl0pOwo+ID4+ICsJCQluZXdfZnJlcVtNSU5dID0gdG1w Owo+ID4+ICsJCQluZXdfZnJlcVtNQVhdID0gdG1wOwo+ID4+ICsJCQlhY3RfdXBvbltNSU5dID0g dHJ1ZTsKPiA+PiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gPj4gKwkJCXdyaXRlID0gdHJ1 ZTsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSAnbSc6IC8qIG1heCAqLwo+ID4+ICsJCQl0 bXAgPSBnZXRfZnJlcXVlbmN5KCZpbmZvW1JQMF0pOwo+ID4+ICsJCQluZXdfZnJlcVtNSU5dID0g dG1wOwo+ID4+ICsJCQluZXdfZnJlcVtNQVhdID0gdG1wOwo+ID4+ICsJCQlhY3RfdXBvbltNSU5d ID0gdHJ1ZTsKPiA+PiArCQkJYWN0X3Vwb25bTUFYXSA9IHRydWU7Cj4gPj4gKwkJCXdyaXRlID0g dHJ1ZTsKPiA+PiArCQkJYnJlYWs7Cj4gPj4gKwkJY2FzZSAnZCc6IC8qIGRlZmF1bHRzICovCj4g Pj4gKwkJCW5ld19mcmVxW01JTl0gPSBnZXRfZnJlcXVlbmN5KCZpbmZvW1JQbl0pOwo+ID4+ICsJ CQluZXdfZnJlcVtNQVhdID0gZ2V0X2ZyZXF1ZW5jeSgmaW5mb1tSUDBdKTsKPiA+PiArCQkJYWN0 X3Vwb25bTUlOXSA9IHRydWU7Cj4gPj4gKwkJCWFjdF91cG9uW01BWF0gPSB0cnVlOwo+ID4+ICsJ CQl3cml0ZSA9IHRydWU7Cj4gPj4gKwkJCWJyZWFrOwo+ID4+ICsJCWNhc2UgJ2gnOgo+ID4+ICsJ CWRlZmF1bHQ6Cj4gPj4gKwkJCXVzYWdlKGFyZ3ZbMF0pOwo+ID4+ICsJCX0KPiA+PiArCX0KPiA+ PiArCj4gPj4gK2RvbmU6Cj4gPj4gKwlyZXR1cm4gd3JpdGU7Cj4gPj4gK30KPiA+PiArCj4gPj4g K2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCj4gPj4gK3sKPiA+PiArCj4gPj4gKwli b29sIHdyaXRlLCBmYWlsLCB0YXJnZXRzW01BWCsxXSA9IHtmYWxzZX07Cj4gPj4gKwlpbnQgaSwg dHJ5ID0gMSwgc2V0X2ZyZXFbTUFYKzFdID0gezB9Owo+ID4+ICsKPiA+PiArCWRldmlkID0gaW50 ZWxfZ2V0X2RybV9kZXZpZChkcm1fb3Blbl9hbnkoKSk7Cj4gPj4gKwlkZXZpY2UgPSBkcm1fZ2V0 X2NhcmQoKTsKPiA+PiArCj4gPj4gKwl3cml0ZSA9IHBhcnNlKGFyZ2MsIGFyZ3YsIHRhcmdldHMs IHNldF9mcmVxKTsKPiA+PiArCWZhaWwgPSB3cml0ZTsKPiA+PiArCj4gPj4gKwkvKiBJZiB3ZSd2 ZSBwcmV2aW91c2x5IGxvY2tlZCB0aGUgZnJlcXVlbmN5LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0 byBzZXQKPiA+dGhpbmdzCj4gPj4gKwkgKiBpbiB0aGUgY29ycmVjdCBvcmRlciwgb3IgZWxzZSB0 aGUgb3BlcmF0aW9uIHdpbGwgZmFpbCAoaWUuIG1pbiA9IG1heCA9Cj4gPjIwMCwKPiA+PiArCSAq IGFuZCB3ZSBzZXQgbWluIHRvIDMwMCwgd2UgZmFpbCBiZWNhdXNlIGl0IHdvdWxkIHRyeSB0byBz ZXQgbWluID4KPiA+PiArCSAqIG1heCkuIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBiZSBnb2lu ZyBlaXRoZXIgZm9yd2FyZCBvciByZXZlcnNlCj4gPj4gKwkgKiB0aHJvdWdoIHRoZSBsb29wLiBN SU4gaXMgYWx3YXlzIGJlZm9yZSBNQVguCj4gPj4gKwkgKgo+ID4+ICsJICogWFhYOiBTaW5jZSBv bmx5IG1pbiBhbmQgbWF4IGFyZSBhdCBwbGF5LCB0aGUgc3VwZXIgbGF6eSB3YXkgaXMgdG8gZG8K PiA+dGhpcwo+ID4+ICsJICogMyB0aW1lcyBhbmQgaWYgd2Ugc3RpbGwgZmFpbCBhZnRlciAzLCBp dCdzIGZvciByZWFsLgo+ID4+ICsJICovCj4gPj4gK2FnYWluOgo+ID4+ICsJaWYgKHRyeSA+IDIp IHsKPiA+PiArCQlmcHJpbnRmKHN0ZGVyciwgIkRpZCBub3QgYWNoaWV2ZSBkZXNpcmVkIGZyZXEu XG4iKTsKPiA+PiArCQlleGl0KEVYSVRfRkFJTFVSRSk7Cj4gPj4gKwl9Cj4gPj4gKwlmb3IgKGkg PSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXRzKTsgaSsrKSB7Cj4gPj4gKwkJaWYgKHRhcmdldHNb aV0gPT0gZmFsc2UpCj4gPj4gKwkJCWNvbnRpbnVlOwo+ID4+ICsKPiA+PiArCQlpZiAod3JpdGUp IHsKPiA+PiArCQkJc2V0X2ZyZXF1ZW5jeSgmaW5mb1tpXSwgc2V0X2ZyZXFbaV0pOwo+ID4+ICsJ CQlpZiAoZ2V0X2ZyZXF1ZW5jeSgmaW5mb1tpXSkgIT0gc2V0X2ZyZXFbaV0pCj4gPj4gKwkJCQlm YWlsID0gdHJ1ZTsKPiA+PiArCQkJZWxzZQo+ID4+ICsJCQkJZmFpbCA9IGZhbHNlOwo+ID4+ICsJ CX0gZWxzZSB7Cj4gPj4gKwkJCXByaW50ZigiJXM6ICVkIE1IelxuIiwgaW5mb1tpXS5uYW1lLAo+ ID5nZXRfZnJlcXVlbmN5KCZpbmZvW2ldKSk7Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsKPiA+ PiArCWlmIChmYWlsKSB7Cj4gPj4gKwkJdHJ5Kys7Cj4gPj4gKwkJZ290byBhZ2FpbjsKPiA+PiAr CX0KPiA+PiArCj4gPj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0YXJnZXRzKTsgaSsr KSB7Cj4gPj4gKwkJaWYgKGluZm9baV0uZmlscCkgewo+ID4+ICsJCQlmY2xvc2UoaW5mb1tpXS5m aWxwKTsKPiA+PiArCQkJZnJlZShpbmZvW2ldLnBhdGgpOwo+ID4+ICsJCX0KPiA+PiArCX0KPiA+ PiArCj4gPj4gKwlyZXR1cm4gRVhJVF9TVUNDRVNTOwo+ID4+ICt9Cj4gPj4gLS0KPiA+PiAyLjIu MQo+ID4+Cj4gPl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Cj4gPkludGVsLWdmeCBtYWlsaW5nIGxpc3QKPiA+SW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwo+ID5odHRwOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50 ZWwtZ2Z4Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCklu dGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRw Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==