From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Goel, Akash" Subject: Re: [PATCH v4] tools/intel_guc_logger: Utility for capturing GuC firmware logs in a file Date: Mon, 10 Oct 2016 20:01:45 +0530 Message-ID: <080dacb9-dff0-4963-af40-c2d47b497c8c@intel.com> References: <1473331461-21288-1-git-send-email-akash.goel@intel.com> <1476097172-24125-1-git-send-email-akash.goel@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id BF8C26E534 for ; Mon, 10 Oct 2016 14:31:48 +0000 (UTC) In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Tvrtko Ursulin , intel-gfx@lists.freedesktop.org Cc: akash.goel@intel.com List-Id: intel-gfx@lists.freedesktop.org CgpPbiAxMC8xMC8yMDE2IDc6MjIgUE0sIFR2cnRrbyBVcnN1bGluIHdyb3RlOgo+Cj4gT24gMTAv MTAvMjAxNiAxMTo1OSwgYWthc2guZ29lbEBpbnRlbC5jb20gd3JvdGU6Cj4+IEZyb206IEFrYXNo IEdvZWwgPGFrYXNoLmdvZWxAaW50ZWwuY29tPgo+Pgo+PiBUaGlzIHBhdGNoIHByb3ZpZGVzIGEg dGVzdCB1dGlsaXR5IHdoaWNoIGhlbHBzIGNhcHR1cmUgR3VDIGZpcm13YXJlCj4+IGxvZ3MgYW5k Cj4+IHRoZW4gZHVtcCB0aGVtIHRvIGZpbGUuCj4+IFRoZSBsb2dzIGFyZSBwdWxsZWQgZnJvbSBh IGRlYnVnZnMgZmlsZQo+PiAnL3N5cy9rZXJuZWwvZGVidWcvZHJpL2d1Y19sb2cnIGFuZAo+PiBi eSBkZWZhdWx0IHN0b3JlZCBpbnRvIGEgZmlsZSAnZ3VjX2xvZ19kdW1wLmRhdCcuIFRoZSBuYW1l LCBpbmNsdWRpbmcgdGhlCj4+IGxvY2F0aW9uLCBvZiB0aGUgb3V0cHV0IGZpbGUgY2FuIGJlIGNo YW5nZWQgdGhyb3VnaCBhIGNvbW1hbmQgbGluZQo+PiBhcmd1bWVudC4KPj4KPj4gVGhlIHV0aWxp dHkgZ29lcyBpbnRvIGFuIGluZmluaXRlIGxvb3Agd2hlcmUgaXQgd2FpdHMgZm9yIHRoZSBhcnJp dmFsCj4+IG9mIG5ldwo+PiBsb2dzIGFuZCBhcyBzb29uIGFzIG5ldyBzZXQgb2YgbG9ncyBhcmUg cHJvZHVjZWQgaXQgY2FwdHVyZXMgdGhlbSBpbgo+PiBpdHMgbG9jYWwKPj4gYnVmZmVyIHdoaWNo IGlzIHRoZW4gZmx1c2hlZCBvdXQgdG8gdGhlIGZpbGUgb24gZGlzay4KPj4gQW55IHRpbWUgd2hl biBsb2dnaW5nIG5lZWRzIHRvIGJlIGVuZGVkLCBVc2VyIGNhbiBzdG9wIHRoaXMgdXRpbGl0eQo+ PiAoQ1RSTCtDKS4KPj4KPj4gQmVmb3JlIGVudGVyaW5nIGludG8gYSBsb29wLCBpdCBmaXJzdCBk aXNjYXJkcyB3aGF0ZXZlciBsb2dzIGFyZQo+PiBwcmVzZW50IGluCj4+IHRoZSBkZWJ1Z2ZzIGZp bGUuCj4+IFRoaXMgd2F5IFVzZXIgY2FuIGZpcnN0IGxhdW5jaCB0aGlzIHV0aWxpdHkgYW5kIHRo ZW4gc3RhcnQgYQo+PiB3b3JrbG9hZC9hY3Rpdml0eQo+PiBmb3Igd2hpY2ggR3VDIGZpcm13YXJl IGxvZ3MgYXJlIHRvIGJlIGFjdHVhbGx5IGNhcHR1cmVkIGFuZCBrZWVwCj4+IHJ1bm5pbmcgdGhl Cj4+IHV0aWxpdHkgZm9yIGFzIGxvbmcgYXMgaXRzIG5lZWRlZCwgbGlrZSBvbmNlIHRoZSB3b3Jr bG9hZCBpcyBvdmVyIHRoaXMKPj4gdXRpbGl0eQo+PiBjYW4gYmUgZm9yY2VmdWxseSBzdG9wcGVk Lgo+Pgo+PiBJZiB0aGUgbG9nZ2luZyB3YXNuJ3QgZW5hYmxlZCBvbiBHdUMgc2lkZSBieSB0aGUg RHJpdmVyIGF0IGJvb3QgdGltZSwKPj4gdXRpbGl0eQo+PiB3aWxsIGZpcnN0IGVuYWJsZSB0aGUg bG9nZ2luZyBhbmQgbGF0ZXIgb24gd2hlbiBpdCBpcyBzdG9wcGVkIChDVFJMK0MpCj4+IGl0IHdp bGwKPj4gYWxzbyBwYXVzZSB0aGUgbG9nZ2luZyBvbiBHdUMgc2lkZS4KPj4KPj4gdjI6Cj4+IC0g VXNlIGNvbWJpbmF0aW9uIG9mIGFsYXJtIHN5c3RlbSBjYWxsICYgU0lHQUxSTSBzaWduYWwgdG8g cnVuIHRoZQo+PiB1dGlsaXR5Cj4+ICAgIGZvciByZXF1aXJlZCBkdXJhdGlvbi4gKFR2cnRrbykK Pj4gLSBGaXggaW5jb25zaXN0ZW5jaWVzLCBkbyBtaW5vciBjbGVhbnVwIGFuZCByZWZhY3Rvcmlu Zy4gKFR2cnRrbykKPj4KPj4gdjM6Cj4+IC0gRml4IGRpc2NyZXBhbmN5IGZvciB0aGUgb3V0cHV0 IGZpbGUgY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgdXBkYXRlIHRoZQo+PiAgICBVc2FnZS9oZWxw IHN0cmluZy4KPj4KPj4gdjQ6Cj4+IC0gVXBkYXRlIHRoZSBleGl0IGNvbmRpdGlvbiBmb3IgZmx1 c2hlciB0aHJlYWQsIG5vdyB3aWxsIGV4aXQgb25seSBhZnRlcgo+PiAgICB0aGUgY2FwdHVyZSBs b29wIGlzIG92ZXIgYW5kIG5vdCB3aGVuIHRoZSBmbGFnIHRvIHN0b3AgbG9nZ2luZyBpcyBzZXQu Cj4+ICAgIFRoaXMgaGFuZGxlcyBhIGNvcm5lciBjYXNlLCBkdWUgdG8gd2hpY2ggdGhlIGR1bXAg b2YgbGFzdCBjYXB0dXJlZAo+PiBidWZmZXIKPj4gICAgd2FzIGdldHRpbmcgbWlzc2VkLgo+PiAt IEFkZCBhIG5ld2xpbmUgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgYXNzZXJ0IG1lc3NhZ2VzLgo+ PiAtIEF2b2lkIHRoZSBhc3NlcnQgZm9yIHRoZSBjYXNlLCB3aGljaCBvY2N1cnMgdmVyeSByYXJl bHksIHdoZW4gdGhlcmUKPj4gYXJlIG5vCj4+ICAgIGJ5dGVzIHJlYWQgZnJvbSB0aGUgcmVsYXkg ZmlsZS4KPj4KPj4gQ2M6IFR2cnRrbyBVcnN1bGluIDx0dnJ0a28udXJzdWxpbkBsaW51eC5pbnRl bC5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IEFrYXNoIEdvZWwgPGFrYXNoLmdvZWxAaW50ZWwuY29t Pgo+PiBSZXZpZXdlZC1ieTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNv bT4gKHYzKQo+PiAtLS0KPj4gICB0b29scy9NYWtlZmlsZS5zb3VyY2VzICAgfCAgIDEgKwo+PiAg IHRvb2xzL2ludGVsX2d1Y19sb2dnZXIuYyB8IDQzOAo+PiArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwo+PiAgIDIgZmlsZXMgY2hhbmdlZCwgNDM5IGluc2Vy dGlvbnMoKykKPj4gICBjcmVhdGUgbW9kZSAxMDA2NDQgdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5j Cj4+Cj4+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2VzIGIvdG9vbHMvTWFrZWZp bGUuc291cmNlcwo+PiBpbmRleCAyYmI2YzhlLi5iZTU4ODcxIDEwMDY0NAo+PiAtLS0gYS90b29s cy9NYWtlZmlsZS5zb3VyY2VzCj4+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMKPj4gQEAg LTE5LDYgKzE5LDcgQEAgdG9vbHNfcHJvZ19saXN0cyA9ICAgICAgICBcCj4+ICAgICAgIGludGVs X2dwdV90aW1lICAgICAgICBcCj4+ICAgICAgIGludGVsX2dwdV90b3AgICAgICAgIFwKPj4gICAg ICAgaW50ZWxfZ3R0ICAgICAgICBcCj4+ICsgICAgaW50ZWxfZ3VjX2xvZ2dlciAgICAgICAgXAo+ PiAgICAgICBpbnRlbF9pbmZvZnJhbWVzICAgIFwKPj4gICAgICAgaW50ZWxfbDNfcGFyaXR5ICAg ICAgICBcCj4+ICAgICAgIGludGVsX2xpZCAgICAgICAgXAo+PiBkaWZmIC0tZ2l0IGEvdG9vbHMv aW50ZWxfZ3VjX2xvZ2dlci5jIGIvdG9vbHMvaW50ZWxfZ3VjX2xvZ2dlci5jCj4+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAuLjE1OWE1NGUKPj4gLS0tIC9kZXYvbnVsbAo+ PiArKysgYi90b29scy9pbnRlbF9ndWNfbG9nZ2VyLmMKPj4gQEAgLTAsMCArMSw0MzggQEAKPj4g Kwo+PiArI2RlZmluZSBfR05VX1NPVVJDRSAgLyogRm9yIHVzaW5nIE9fRElSRUNUICovCj4+ICsj aW5jbHVkZSA8aW50dHlwZXMuaD4KPj4gKyNpbmNsdWRlIDxzdGRpby5oPgo+PiArI2luY2x1ZGUg PGZjbnRsLmg+Cj4+ICsjaW5jbHVkZSA8c2NoZWQuaD4KPj4gKyNpbmNsdWRlIDxzeXMvaW9jdGwu aD4KPj4gKyNpbmNsdWRlIDxzdHJpbmcuaD4KPj4gKyNpbmNsdWRlIDxlcnJuby5oPgo+PiArI2lu Y2x1ZGUgPHNpZ25hbC5oPgo+PiArI2luY2x1ZGUgPHN0ZGxpYi5oPgo+PiArI2luY2x1ZGUgPHVu aXN0ZC5oPgo+PiArI2luY2x1ZGUgPHN5cy9wb2xsLmg+Cj4+ICsjaW5jbHVkZSA8c3lzL3dhaXQu aD4KPj4gKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KPj4gKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5o Pgo+PiArI2luY2x1ZGUgPHN5cy9tbWFuLmg+Cj4+ICsjaW5jbHVkZSA8YXNzZXJ0Lmg+Cj4+ICsj aW5jbHVkZSA8cHRocmVhZC5oPgo+PiArCj4+ICsjaW5jbHVkZSAiaWd0LmgiCj4+ICsKPj4gKyNk ZWZpbmUgTUIoeCkgKCh1aW50NjRfdCkoeCkgKiAxMDI0ICogMTAyNCkKPj4gKyNpZm5kZWYgUEFH RV9TSVpFCj4+ICsgICNkZWZpbmUgUEFHRV9TSVpFIDQwOTYKPj4gKyNlbmRpZgo+PiArLyogQ3Vy cmVudGx5IHRoZSBzaXplIG9mIEd1QyBsb2cgYnVmZmVyIGlzIDE5IHBhZ2VzICYgc28gaXMgdGhl IHNpemUKPj4gb2YgcmVsYXkKPj4gKyAqIHN1YmJ1ZmZlci4gSWYgdGhlIHNpemUgY2hhbmdlcyBp biBmdXR1cmUsIHRoZW4gdGhpcyBkZWZpbmUgYWxzbwo+PiBuZWVkcyB0byBiZQo+PiArICogdXBk YXRlZCBhY2NvcmRpbmdseS4KPj4gKyAqLwo+PiArI2RlZmluZSBTVUJCVUZfU0laRSAoMTkqUEFH RV9TSVpFKQo+PiArLyogTmVlZCBsYXJnZSBidWZmZXJpbmcgZnJvbSBsb2dnZXIgc2lkZSB0byBo aWRlIHRoZSBESVNLIElPIGxhdGVuY3ksCj4+IERyaXZlcgo+PiArICogY2FuIG9ubHkgc3RvcmUg OCBzbmFwc2hvdHMgb2YgR3VDIGxvZyBidWZmZXIgaW4gcmVsYXkuCj4+ICsgKi8KPj4gKyNkZWZp bmUgTlVNX1NVQkJVRlMgMTAwCj4+ICsKPj4gKyNkZWZpbmUgUkVMQVlfRklMRV9OQU1FICAiZ3Vj X2xvZyIKPj4gKyNkZWZpbmUgREVGQVVMVF9PVVRQVVRfRklMRV9OQU1FICAiZ3VjX2xvZ19kdW1w LmRhdCIKPj4gKyNkZWZpbmUgQ09OVFJPTF9GSUxFX05BTUUgImk5MTVfZ3VjX2xvZ19jb250cm9s Igo+PiArCj4+ICtjaGFyICpyZWFkX2J1ZmZlcjsKPj4gK2NoYXIgKm91dF9maWxlbmFtZTsKPj4g K2ludCBwb2xsX3RpbWVvdXQgPSAyOyAvKiBieSBkZWZhdWx0IDJtcyB0aW1lb3V0ICovCj4+ICtw dGhyZWFkX211dGV4X3QgbXV0ZXg7Cj4+ICtwdGhyZWFkX3QgZmx1c2hfdGhyZWFkOwo+PiAraW50 IHZlcmJvc2l0eV9sZXZlbCA9IDM7IC8qIGJ5IGRlZmF1bHQgY2FwdHVyZSBsb2dzIGF0IG1heCB2 ZXJib3NpdHkgKi8KPj4gK3VpbnQzMl90IHByb2R1Y2VkLCBjb25zdW1lZDsKPj4gK3VpbnQ2NF90 IHRvdGFsX2J5dGVzX3dyaXR0ZW47Cj4+ICtpbnQgbnVtX2J1ZmZlcnMgPSBOVU1fU1VCQlVGUzsK Pj4gK2ludCByZWxheV9mZCwgb3V0ZmlsZV9mZCA9IC0xOwo+PiArdWludDMyX3QgdGVzdF9kdXJh dGlvbiwgbWF4X2ZpbGVzaXplOwo+PiArcHRocmVhZF9jb25kX3QgdW5kZXJmbG93X2NvbmQsIG92 ZXJmbG93X2NvbmQ7Cj4+ICtib29sIHN0b3BfbG9nZ2luZywgZGlzY2FyZF9vbGRsb2dzLCBjYXB0 dXJpbmdfc3RvcHBlZDsKPj4gKwo+PiArc3RhdGljIHZvaWQgZ3VjX2xvZ19jb250cm9sKGJvb2wg ZW5hYmxlX2xvZ2dpbmcpCj4+ICt7Cj4+ICsgICAgaW50IGNvbnRyb2xfZmQ7Cj4+ICsgICAgY2hh ciBkYXRhWzE5XTsKPj4gKyAgICB1aW50NjRfdCB2YWw7Cj4+ICsgICAgaW50IHJldDsKPj4gKwo+ PiArICAgIGNvbnRyb2xfZmQgPSBpZ3RfZGVidWdmc19vcGVuKENPTlRST0xfRklMRV9OQU1FLCBP X1dST05MWSk7Cj4+ICsgICAgaWd0X2Fzc2VydF9mKGNvbnRyb2xfZmQgPj0gMCwgImNvdWxkbid0 IG9wZW4gdGhlIGd1YyBsb2cgY29udHJvbAo+PiBmaWxlXG4iKTsKPj4gKwo+PiArICAgIHZhbCA9 IGVuYWJsZV9sb2dnaW5nID8gKCh2ZXJib3NpdHlfbGV2ZWwgPDwgNCkgfCAweDEpIDogMDsKPj4g Kwo+PiArICAgIHJldCA9IHNucHJpbnRmKGRhdGEsIHNpemVvZihkYXRhKSwgIjB4JSIgUFJJeDY0 LCB2YWwpOwo+PiArICAgIGlndF9hc3NlcnQocmV0ID4gMiAmJiByZXQgPCBzaXplb2YoZGF0YSkp Owo+PiArCj4+ICsgICAgcmV0ID0gd3JpdGUoY29udHJvbF9mZCwgZGF0YSwgcmV0KTsKPj4gKyAg ICBpZ3RfYXNzZXJ0X2YocmV0ID4gMCwgImNvdWxkbid0IHdyaXRlIHRvIHRoZSBsb2cgY29udHJv bCBmaWxlXG4iKTsKPj4gKwo+PiArICAgIGNsb3NlKGNvbnRyb2xfZmQpOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdm9pZCBpbnRfc2lnX2hhbmRsZXIoaW50IHNpZykKPj4gK3sKPj4gKyAgICBpZ3Rf aW5mbygicmVjZWl2ZWQgc2lnbmFsICVkXG4iLCBzaWcpOwo+PiArCj4+ICsgICAgc3RvcF9sb2dn aW5nID0gdHJ1ZTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcHVsbF9sZWZ0b3Zlcl9kYXRh KHZvaWQpCj4+ICt7Cj4+ICsgICAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQgPSAwOwo+PiArICAg IGludCByZXQ7Cj4+ICsKPj4gKyAgICBkbyB7Cj4+ICsgICAgICAgIC8qIFJlYWQgdGhlIGxvZ3Mg ZnJvbSByZWxheSBidWZmZXIgKi8KPj4gKyAgICAgICAgcmV0ID0gcmVhZChyZWxheV9mZCwgcmVh ZF9idWZmZXIsIFNVQkJVRl9TSVpFKTsKPj4gKyAgICAgICAgaWYgKCFyZXQpCj4+ICsgICAgICAg ICAgICBicmVhazsKPj4gKwo+PiArICAgICAgICBpZ3RfYXNzZXJ0X2YocmV0ID4gMCwgImZhaWxl ZCB0byByZWFkIGZyb20gdGhlIGd1YyBsb2cgZmlsZVxuIik7Cj4+ICsgICAgICAgIGlndF9hc3Nl cnRfZihyZXQgPT0gU1VCQlVGX1NJWkUsICJpbnZhbGlkIHJlYWQgZnJvbSByZWxheQo+PiBmaWxl XG4iKTsKPj4gKwo+PiArICAgICAgICBieXRlc19yZWFkICs9IHJldDsKPj4gKwo+PiArICAgICAg ICBpZiAob3V0ZmlsZV9mZCA+PSAwKSB7Cj4+ICsgICAgICAgICAgICByZXQgPSB3cml0ZShvdXRm aWxlX2ZkLCByZWFkX2J1ZmZlciwgU1VCQlVGX1NJWkUpOwo+PiArICAgICAgICAgICAgaWd0X2Fz c2VydF9mKHJldCA9PSBTVUJCVUZfU0laRSwgImNvdWxkbid0IGR1bXAgdGhlIGxvZ3MKPj4gaW4g YSBmaWxlXG4iKTsKPj4gKyAgICAgICAgICAgIHRvdGFsX2J5dGVzX3dyaXR0ZW4gKz0gcmV0Owo+ PiArICAgICAgICB9Cj4+ICsgICAgfSB3aGlsZSgxKTsKPj4gKwo+PiArICAgIGlndF9kZWJ1Zygi JXUgYnl0ZXMgZmx1c2hlZFxuIiwgYnl0ZXNfcmVhZCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBp bnQgbnVtX2ZpbGxlZF9idWZzKHZvaWQpCj4+ICt7Cj4+ICsgICAgcmV0dXJuIChwcm9kdWNlZCAt IGNvbnN1bWVkKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcHVsbF9kYXRhKHZvaWQpCj4+ ICt7Cj4+ICsgICAgY2hhciAqcHRyOwo+PiArICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICBwdGhy ZWFkX211dGV4X2xvY2soJm11dGV4KTsKPj4gKyAgICB3aGlsZSAobnVtX2ZpbGxlZF9idWZzKCkg Pj0gbnVtX2J1ZmZlcnMpIHsKPj4gKyAgICAgICAgaWd0X2RlYnVnKCJvdmVyZmxvdywgd2lsbCB3 YWl0LCBwcm9kdWNlZCAldSwgY29uc3VtZWQgJXVcbiIsCj4+IHByb2R1Y2VkLCBjb25zdW1lZCk7 Cj4+ICsgICAgICAgIC8qIFN0YWxsIHRoZSBtYWluIHRocmVhZCBpbiBjYXNlIG9mIG92ZXJmbG93 LCBhcyB0aGVyZSBhcmUgbm8KPj4gKyAgICAgICAgICogYnVmZmVycyBhdmFpbGFibGUgdG8gc3Rv cmUgdGhlIG5ldyBsb2dzLCBvdGhlcndpc2UgdGhlcmUKPj4gKyAgICAgICAgICogY291bGQgYmUg Y29ycnVwdGlvbiBpZiBib3RoIHRocmVhZHMgd29yayBvbiB0aGUgc2FtZSBidWZmZXIuCj4+ICsg ICAgICAgICAqLwo+PiArICAgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmb3ZlcmZsb3dfY29uZCwg Jm11dGV4KTsKPj4gKyAgICB9Owo+PiArICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7 Cj4+ICsKPj4gKyAgICBwdHIgPSByZWFkX2J1ZmZlciArIChwcm9kdWNlZCAlIG51bV9idWZmZXJz KSAqIFNVQkJVRl9TSVpFOwo+PiArCj4+ICsgICAgLyogUmVhZCB0aGUgbG9ncyBmcm9tIHJlbGF5 IGJ1ZmZlciAqLwo+PiArICAgIHJldCA9IHJlYWQocmVsYXlfZmQsIHB0ciwgU1VCQlVGX1NJWkUp Owo+PiArICAgIGlndF9hc3NlcnRfZihyZXQgPj0gMCwgImZhaWxlZCB0byByZWFkIGZyb20gdGhl IGd1YyBsb2cgZmlsZVxuIik7Cj4+ICsgICAgaWd0X2Fzc2VydF9mKCFyZXQgfHwgcmV0ID09IFNV QkJVRl9TSVpFLCAiaW52YWxpZCByZWFkIGZyb20gcmVsYXkKPj4gZmlsZVxuIik7Cj4+ICsKPj4g KyAgICBpZiAocmV0KSB7Cj4+ICsgICAgICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmbXV0ZXgpOwo+ PiArICAgICAgICBwcm9kdWNlZCsrOwo+PiArICAgICAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ1 bmRlcmZsb3dfY29uZCk7Cj4+ICsgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtdXRleCk7 Cj4+ICsgICAgfSBlbHNlIHsKPj4gKyAgICAgICAgLyogT2NjYXNpb25hbGx5ICh2ZXJ5IHJhcmUp IHJlYWQgZnJvbSB0aGUgcmVsYXkgZmlsZSByZXR1cm5zIG5vCj4+ICsgICAgICAgICAqIGRhdGEs IGFsYmVpdCB0aGUgcG9sbGluZyBkb25lIHByaW9yIHRvIHJlYWQgY2FsbCBpbmRpY2F0ZWQKPj4g KyAgICAgICAgICogYXZhaWxhYmlsaXR5IG9mIGRhdGEuCj4+ICsgICAgICAgICAqLwo+PiArICAg ICAgICBpZ3RfZGVidWcoIm5vIGRhdGEgcmVhZCBmcm9tIHRoZSByZWxheSBmaWxlXG4iKTsKPgo+ IFRoaXMgd29ycmllcyBtZS4gUmVsYXlmcyBrZXJuZWwgc2lkZSBpcyBxdWl0ZSBzaW1wbGUgd2hp Y2ggd291bGQgc3VnZ2VzdAo+IHRoZXJlIGlzIG1heWJlIGEgYnVnIGluIHRoZSBsb2dnZXI/IEFu ZCBpdCBpcyB2ZXJ5IGltcG9ydGFudCB0aGF0IHdlCj4gdHJ1c3QgbG9nZ2VyIGNvcnJlY3RseSBj YXB0dXJpbmcgZGF0YS4gQmVjYXVzZSBwZW9wbGUgd2lsbCBzcGVuZCBhIGxvdAo+IG9mIHRpbWUg ZGVidWdnaW5nIGlzc3VlcyBmcm9tIHRoZSBsb2dzIGFuZCBpdCB3b3VsZCBiZSBiYWQgdG8gaGF2 ZSB0bwo+IGNoYXNlIGlycmVndWxhcml0aWVzIGNhdXNlZCBieSBhIHByb2JsZW0gaW4gdGhlIGxv Z2dlci4KPgpBY3R1YWxseSBJIHNlZSB0aGlzIGlzc3VlIHJhcmVseSBhbmQgb25seSBhZnRlciBs b2dnaW5nIHNvbWUgR0JzIG9mIApkYXRhLiBBbmQgbW9zdCBsaWtlbHkgaXQgd29uJ3QgaGF2ZSBh bnkgYmVhcmluZyBvbiB0aGUgY29ycmVjdG5lc3Mgb2YgCmNhcHR1cmVkIGRhdGEsIHRoZSBtaXNz ZWQgc25hcHNob3Qgc2hhbGwgYmUgcHVsbGVkIGluIHRoZSBuZXh0IGl0ZXJhdGlvbiAKb2YgY2Fw dHVyZSBsb29wLiBBbHNvIG5vLW92ZXJ3cml0ZSBtb2RlIG9mIHJlbGF5IGlzIGJlaW5nIHVzZWQu CgpBcyBwZXIgbXkgaHVuY2gsIGl0IGNhbid0IGJlIHJ1bGVkIG91dCB0aGF0IHRoaXMgaXMgbm90 IGEgcmVsYXlmcyBpc3N1ZS4KCj4gQ291bGQgeW91IHBsZWFzZSB0cnkgYW5kIGlkZW50aWZ5IHdo eSBleGFjdGx5IGlzIHRoaXMgaGFwcGVuaW5nPwpXaWxsIHRyeSB0byBpbnZlc3RpZ2F0ZSBib3Ro IGZyb20gcmVsYXlmcyBzaWRlIGFzIHdlbGwgYXMgbG9nZ2VyIHNpZGUsIApidXQgaXQgd291bGQg dGFrZSBzb21lIHRpbWUuClRoaXMgbWF5IG5vdCBiZSBjb25zaWRlcmVkIGEgYmxvY2tlci4KCkJl c3QgcmVnYXJkcwpBa2FzaAo+Cj4gUmVnYXJkcywKPgo+IFR2cnRrbwo+Cj4+ICsgICAgfQo+PiAr fQo+PiArCj4+ICtzdGF0aWMgdm9pZCAqZmx1c2hlcih2b2lkICphcmcpCj4+ICt7Cj4+ICsgICAg Y2hhciAqcHRyOwo+PiArICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICBpZ3RfZGVidWcoImV4ZWN1 dGlvbiBzdGFydGVkIG9mIGZsdXNoZXIgdGhyZWFkXG4iKTsKPj4gKwo+PiArICAgIGRvIHsKPj4g KyAgICAgICAgcHRocmVhZF9tdXRleF9sb2NrKCZtdXRleCk7Cj4+ICsgICAgICAgIHdoaWxlICgh bnVtX2ZpbGxlZF9idWZzKCkpIHsKPj4gKyAgICAgICAgICAgIC8qIEV4aXQgb25seSBhZnRlciBj b21wbGV0aW5nIHRoZSBmbHVzaCBvZiBhbGwgdGhlIGZpbGxlZAo+PiArICAgICAgICAgICAgICog YnVmZmVycyBhcyBVc2VyIHdvdWxkIGV4cGVjdCB0aGF0IGFsbCBsb2dzIGNhcHR1cmVkIHVwCj4+ ICsgICAgICAgICAgICAgKiB0aWxsIHRoZSBwb2ludCBvZiBpbnRlcnJ1cHRpb24vZXhpdCBhcmUg d3JpdHRlbiBvdXQgdG8KPj4gKyAgICAgICAgICAgICAqIHRoZSBkaXNrIGZpbGUuCj4+ICsgICAg ICAgICAgICAgKi8KPj4gKyAgICAgICAgICAgIGlmIChjYXB0dXJpbmdfc3RvcHBlZCkgewo+PiAr ICAgICAgICAgICAgICAgIGlndF9kZWJ1ZygiZmx1c2hlciB0byBleGl0IG5vd1xuIik7Cj4+ICsg ICAgICAgICAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKPj4gKyAgICAgICAg ICAgICAgICByZXR1cm4gTlVMTDsKPj4gKyAgICAgICAgICAgIH0KPj4gKyAgICAgICAgICAgIHB0 aHJlYWRfY29uZF93YWl0KCZ1bmRlcmZsb3dfY29uZCwgJm11dGV4KTsKPj4gKyAgICAgICAgfTsK Pj4gKyAgICAgICAgcHRocmVhZF9tdXRleF91bmxvY2soJm11dGV4KTsKPj4gKwo+PiArICAgICAg ICBwdHIgPSByZWFkX2J1ZmZlciArIChjb25zdW1lZCAlIG51bV9idWZmZXJzKSAqIFNVQkJVRl9T SVpFOwo+PiArCj4+ICsgICAgICAgIHJldCA9IHdyaXRlKG91dGZpbGVfZmQsIHB0ciwgU1VCQlVG X1NJWkUpOwo+PiArICAgICAgICBpZ3RfYXNzZXJ0X2YocmV0ID09IFNVQkJVRl9TSVpFLCAiY291 bGRuJ3QgZHVtcCB0aGUgbG9ncyBpbiBhCj4+IGZpbGVcbiIpOwo+PiArCj4+ICsgICAgICAgIHRv dGFsX2J5dGVzX3dyaXR0ZW4gKz0gcmV0Owo+PiArICAgICAgICBpZiAobWF4X2ZpbGVzaXplICYm ICh0b3RhbF9ieXRlc193cml0dGVuID4gTUIobWF4X2ZpbGVzaXplKSkpIHsKPj4gKyAgICAgICAg ICAgIGlndF9kZWJ1ZygicmVhY2hlZCB0aGUgdGFyZ2V0IG9mICUiIFBSSXU2NCAiIGJ5dGVzXG4i LAo+PiBNQihtYXhfZmlsZXNpemUpKTsKPj4gKyAgICAgICAgICAgIHN0b3BfbG9nZ2luZyA9IHRy dWU7Cj4+ICsgICAgICAgIH0KPj4gKwo+PiArICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm11 dGV4KTsKPj4gKyAgICAgICAgY29uc3VtZWQrKzsKPj4gKyAgICAgICAgcHRocmVhZF9jb25kX3Np Z25hbCgmb3ZlcmZsb3dfY29uZCk7Cj4+ICsgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZt dXRleCk7Cj4+ICsgICAgfSB3aGlsZSgxKTsKPj4gKwo+PiArICAgIHJldHVybiBOVUxMOwo+PiAr fQo+PiArCj4+ICtzdGF0aWMgdm9pZCBpbml0X2ZsdXNoZXJfdGhyZWFkKHZvaWQpCj4+ICt7Cj4+ ICsgICAgc3RydWN0IHNjaGVkX3BhcmFtICAgIHRocmVhZF9zY2hlZDsKPj4gKyAgICBwdGhyZWFk X2F0dHJfdCAgICAgICAgcF9hdHRyOwo+PiArICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICBwdGhy ZWFkX2NvbmRfaW5pdCgmdW5kZXJmbG93X2NvbmQsIE5VTEwpOwo+PiArICAgIHB0aHJlYWRfY29u ZF9pbml0KCZvdmVyZmxvd19jb25kLCBOVUxMKTsKPj4gKyAgICBwdGhyZWFkX211dGV4X2luaXQo Jm11dGV4LCBOVUxMKTsKPj4gKwo+PiArICAgIHJldCA9IHB0aHJlYWRfYXR0cl9pbml0KCZwX2F0 dHIpOwo+PiArICAgIGlndF9hc3NlcnRfZihyZXQgPT0gMCwgImVycm9yIG9idGFpbmluZyBkZWZh dWx0IHRocmVhZAo+PiBhdHRyaWJ1dGVzXG4iKTsKPj4gKwo+PiArICAgIHJldCA9IHB0aHJlYWRf YXR0cl9zZXRpbmhlcml0c2NoZWQoJnBfYXR0ciwgUFRIUkVBRF9FWFBMSUNJVF9TQ0hFRCk7Cj4+ ICsgICAgaWd0X2Fzc2VydF9mKHJldCA9PSAwLCAiY291bGRuJ3Qgc2V0IGluaGVyaXRzY2hlZFxu Iik7Cj4+ICsKPj4gKyAgICByZXQgPSBwdGhyZWFkX2F0dHJfc2V0c2NoZWRwb2xpY3koJnBfYXR0 ciwgU0NIRURfUlIpOwo+PiArICAgIGlndF9hc3NlcnRfZihyZXQgPT0gMCwgImNvdWxkbid0IHNl dCB0aHJlYWQgc2NoZWR1bGluZyBwb2xpY3lcbiIpOwo+PiArCj4+ICsgICAgLyogS2VlcCB0aGUg Zmx1c2hlciB0YXNrIGFsc28gYXQgcnQgcHJpb3JpdHksIHNvIHRoYXQgaXQgZG9lc24ndCBnZXQK Pj4gKyAgICAgKiB0b28gbGF0ZSBpbiBmbHVzaGluZyB0aGUgY29sbGVjdGVkIGxvZ3MgaW4gbG9j YWwgYnVmZmVycyB0bwo+PiB0aGUgZGlzaywKPj4gKyAgICAgKiBhbmQgc28gbWFpbiB0aHJlYWQg YWx3YXlzIGhhdmUgc3BhcmUgYnVmZmVycyB0byBjb2xsZWN0IHRoZSBsb2dzLgo+PiArICAgICAq Lwo+PiArICAgIHRocmVhZF9zY2hlZC5zY2hlZF9wcmlvcml0eSA9IDU7Cj4+ICsgICAgcmV0ID0g cHRocmVhZF9hdHRyX3NldHNjaGVkcGFyYW0oJnBfYXR0ciwgJnRocmVhZF9zY2hlZCk7Cj4+ICsg ICAgaWd0X2Fzc2VydF9mKHJldCA9PSAwLCAiY291bGRuJ3Qgc2V0IHRocmVhZCBwcmlvcml0eVxu Iik7Cj4+ICsKPj4gKyAgICByZXQgPSBwdGhyZWFkX2NyZWF0ZSgmZmx1c2hfdGhyZWFkLCAmcF9h dHRyLCBmbHVzaGVyLCBOVUxMKTsKPj4gKyAgICBpZ3RfYXNzZXJ0X2YocmV0ID09IDAsICJ0aHJl YWQgY3JlYXRpb24gZmFpbGVkXG4iKTsKPj4gKwo+PiArICAgIHJldCA9IHB0aHJlYWRfYXR0cl9k ZXN0cm95KCZwX2F0dHIpOwo+PiArICAgIGlndF9hc3NlcnRfZihyZXQgPT0gMCwgImVycm9yIGRl c3Ryb3lpbmcgdGhyZWFkIGF0dHJpYnV0ZXNcbiIpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCBvcGVuX3JlbGF5X2ZpbGUodm9pZCkKPj4gK3sKPj4gKyAgICByZWxheV9mZCA9IGlndF9kZWJ1 Z2ZzX29wZW4oUkVMQVlfRklMRV9OQU1FLCBPX1JET05MWSk7Cj4+ICsgICAgaWd0X2Fzc2VydF9m KHJlbGF5X2ZkID49IDAsICJjb3VsZG4ndCBvcGVuIHRoZSBndWMgbG9nIGZpbGVcbiIpOwo+PiAr Cj4+ICsgICAgLyogUHVyZ2UgdGhlIG9sZC9ib290LXRpbWUgbG9ncyBmcm9tIHRoZSByZWxheSBi dWZmZXIuCj4+ICsgICAgICogVGhpcyBpcyBtb3JlIGZvciBWYWwgdGVhbSdzIHJlcXVpcmVtZW50 LCB3aGVyZSB0aGV5IGhhdmUgdG8gZmlyc3QKPj4gKyAgICAgKiBwdXJnZSB0aGUgZXhpc3Rpbmcg bG9ncyBiZWZvcmUgc3RhcnRpbmcgdGhlIHRlc3RzIGZvciB3aGljaAo+PiB0aGUgbG9ncwo+PiAr ICAgICAqIGFyZSBhY3R1YWxseSBuZWVkZWQuIEFmdGVyIHRoaXMgbG9nZ2VyIHdpbGwgZW50ZXIg aW50byBhIGxvb3AgYW5kCj4+ICsgICAgICogd2FpdCBmb3IgdGhlIG5ldyBkYXRhLCBhdCB0aGF0 IHBvaW50IGJlbmNobWFyayBjYW4gYmUgbGF1bmNoZWQKPj4gZnJvbQo+PiArICAgICAqIGEgZGlm ZmVyZW50IHNoZWxsLgo+PiArICAgICAqLwo+PiArICAgIGlmIChkaXNjYXJkX29sZGxvZ3MpCj4+ ICsgICAgICAgIHB1bGxfbGVmdG92ZXJfZGF0YSgpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCBvcGVuX291dHB1dF9maWxlKHZvaWQpCj4+ICt7Cj4+ICsgICAgLyogVXNlIERpcmVjdCBJTyBt b2RlIGZvciB0aGUgb3V0cHV0IGZpbGUsIGFzIHRoZSBkYXRhIHdyaXR0ZW4gaXMKPj4gbm90Cj4+ ICsgICAgICogc3VwcG9zZWQgdG8gYmUgYWNjZXNzZWQgYWdhaW4sIHRoaXMgc2F2ZXMgYSBjb3B5 IG9mIGRhdGEgZnJvbQo+PiBBcHAncwo+PiArICAgICAqIGJ1ZmZlciB0byBrZXJuZWwgYnVmZmVy IChQYWdlIGNhY2hlKS4gRHVlIHRvIG5vIGJ1ZmZlcmluZyBvbgo+PiBrZXJuZWwKPj4gKyAgICAg KiBzaWRlLCBkYXRhIGlzIGZsdXNoZWQgb3V0IHRvIGRpc2sgZmFzdGVyIGFuZCBtb3JlIGJ1ZmZl cmluZwo+PiBjYW4gYmUKPj4gKyAgICAgKiBkb25lIG9uIHRoZSBsb2dnZXIgc2lkZSB0byBoaWRl IHRoZSBkaXNrIElPIGxhdGVuY3kuCj4+ICsgICAgICovCj4+ICsgICAgb3V0ZmlsZV9mZCA9IG9w ZW4ob3V0X2ZpbGVuYW1lID8gOiBERUZBVUxUX09VVFBVVF9GSUxFX05BTUUsCj4+ICsgICAgICAg ICAgICAgIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0RJUkVDVCwKPj4gKyAgICAg ICAgICAgICAgMDQ0MCk7Cj4+ICsgICAgaWd0X2Fzc2VydF9mKG91dGZpbGVfZmQgPj0gMCwgImNv dWxkbid0IG9wZW4gdGhlIG91dHB1dCBmaWxlXG4iKTsKPj4gKwo+PiArICAgIGZyZWUob3V0X2Zp bGVuYW1lKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgaW5pdF9tYWluX3RocmVhZCh2b2lk KQo+PiArewo+PiArICAgIHN0cnVjdCBzY2hlZF9wYXJhbSAgICB0aHJlYWRfc2NoZWQ7Cj4+ICsg ICAgaW50IHJldDsKPj4gKwo+PiArICAgIC8qIFJ1biB0aGUgbWFpbiB0aHJlYWQgYXQgaGlnaGVz dCBwcmlvcml0eSB0byBlbnN1cmUgdGhhdCBpdCBhbHdheXMKPj4gKyAgICAgKiBnZXRzIHdva2Vu LXVwIGF0IGVhcmxpZXN0IG9uIGFycml2YWwgb2YgbmV3IGRhdGEgYW5kIHNvIGlzIGFsd2F5cwo+ PiArICAgICAqIHJlYWR5IHRvIHB1bGwgdGhlIGxvZ3MsIG90aGVyd2lzZSB0aGVyZSBjb3VsZCBi ZSBsb3NzIGxvZ3MgaWYKPj4gKyAgICAgKiBHdUMgZmlybXdhcmUgaXMgZ2VuZXJhdGluZyBsb2dz IGF0IGEgdmVyeSBoaWdoIHJhdGUuCj4+ICsgICAgICovCj4+ICsgICAgdGhyZWFkX3NjaGVkLnNj aGVkX3ByaW9yaXR5ID0gMTsKPj4gKyAgICByZXQgPSBzY2hlZF9zZXRzY2hlZHVsZXIoZ2V0cGlk KCksIFNDSEVEX0ZJRk8sICZ0aHJlYWRfc2NoZWQpOwo+PiArICAgIGlndF9hc3NlcnRfZihyZXQg PT0gMCwgImNvdWxkbid0IHNldCB0aGUgcHJpb3JpdHlcbiIpOwo+PiArCj4+ICsgICAgaWYgKHNp Z25hbChTSUdJTlQsIGludF9zaWdfaGFuZGxlcikgPT0gU0lHX0VSUikKPj4gKyAgICAgICAgaWd0 X2Fzc2VydF9mKDAsICJTSUdJTlQgaGFuZGxlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKPj4g Kwo+PiArICAgIGlmIChzaWduYWwoU0lHQUxSTSwgaW50X3NpZ19oYW5kbGVyKSA9PSBTSUdfRVJS KQo+PiArICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgIlNJR0FMUk0gaGFuZGxlciByZWdpc3RyYXRp b24gZmFpbGVkXG4iKTsKPj4gKwo+PiArICAgIC8qIE5lZWQgYW4gYWxpZ25lZCBwb2ludGVyIGZv ciBkaXJlY3QgSU8gKi8KPj4gKyAgICByZXQgPSBwb3NpeF9tZW1hbGlnbigodm9pZCAqKikmcmVh ZF9idWZmZXIsIFBBR0VfU0laRSwKPj4gbnVtX2J1ZmZlcnMgKiBTVUJCVUZfU0laRSk7Cj4+ICsg ICAgaWd0X2Fzc2VydF9mKHJldCA9PSAwLCAiY291bGRuJ3QgYWxsb2NhdGUgdGhlIHJlYWQgYnVm ZmVyXG4iKTsKPj4gKwo+PiArICAgIC8qIEtlZXAgdGhlIHBhZ2VzIGxvY2tlZCBpbiBSQU0sIGF2 b2lkIHBhZ2UgZmF1bHQgb3ZlcmhlYWQgKi8KPj4gKyAgICByZXQgPSBtbG9jayhyZWFkX2J1ZmZl ciwgbnVtX2J1ZmZlcnMgKiBTVUJCVUZfU0laRSk7Cj4+ICsgICAgaWd0X2Fzc2VydF9mKHJldCA9 PSAwLCAiZmFpbGVkIHRvIGxvY2sgbWVtb3J5XG4iKTsKPj4gKwo+PiArICAgIC8qIEVuYWJsZSB0 aGUgbG9nZ2luZywgaXQgbWF5IG5vdCBoYXZlIGJlZW4gZW5hYmxlZCBmcm9tIGJvb3QgYW5kIHNv Cj4+ICsgICAgICogdGhlIHJlbGF5IGZpbGUgYWxzbyB3b3VsZG4ndCBoYXZlIGJlZW4gY3JlYXRl ZC4KPj4gKyAgICAgKi8KPj4gKyAgICBndWNfbG9nX2NvbnRyb2wodHJ1ZSk7Cj4+ICsKPj4gKyAg ICBvcGVuX3JlbGF5X2ZpbGUoKTsKPj4gKyAgICBvcGVuX291dHB1dF9maWxlKCk7Cj4+ICt9Cj4+ ICsKPj4gK3N0YXRpYyBpbnQgcGFyc2Vfb3B0aW9ucyhpbnQgb3B0LCBpbnQgb3B0X2luZGV4LCB2 b2lkICpkYXRhKQo+PiArewo+PiArICAgIGlndF9kZWJ1Zygib3B0ICVjIG9wdGFyZyAlc1xuIiwg b3B0LCBvcHRhcmcpOwo+PiArCj4+ICsgICAgc3dpdGNoKG9wdCkgewo+PiArICAgIGNhc2UgJ3Yn Ogo+PiArICAgICAgICB2ZXJib3NpdHlfbGV2ZWwgPSBhdG9pKG9wdGFyZyk7Cj4+ICsgICAgICAg IGlndF9hc3NlcnRfZih2ZXJib3NpdHlfbGV2ZWwgPCAwIHx8IHZlcmJvc2l0eV9sZXZlbCA+IDMs Cj4+ICJpbnZhbGlkIGlucHV0IGZvciAtdiBvcHRpb25cbiIpOwo+PiArICAgICAgICBpZ3RfZGVi dWcoInZlcmJvc2l0eSBsZXZlbCB0byBiZSB1c2VkIGlzICVkXG4iLAo+PiB2ZXJib3NpdHlfbGV2 ZWwpOwo+PiArICAgICAgICBicmVhazsKPj4gKyAgICBjYXNlICdvJzoKPj4gKyAgICAgICAgb3V0 X2ZpbGVuYW1lID0gc3RyZHVwKG9wdGFyZyk7Cj4+ICsgICAgICAgIGlndF9hc3NlcnRfZihvdXRf ZmlsZW5hbWUsICJDb3VsZG4ndCBhbGxvY2F0ZSB0aGUgby9wCj4+IGZpbGVuYW1lXG4iKTsKPj4g KyAgICAgICAgaWd0X2RlYnVnKCJsb2dzIHRvIGJlIHN0b3JlZCBpbiBmaWxlICVzXG4iLCBvdXRf ZmlsZW5hbWUpOwo+PiArICAgICAgICBicmVhazsKPj4gKyAgICBjYXNlICdiJzoKPj4gKyAgICAg ICAgbnVtX2J1ZmZlcnMgPSBhdG9pKG9wdGFyZyk7Cj4+ICsgICAgICAgIGlndF9hc3NlcnRfZihu dW1fYnVmZmVycyA+IDAsICJpbnZhbGlkIGlucHV0IGZvciAtYiBvcHRpb25cbiIpOwo+PiArICAg ICAgICBpZ3RfZGVidWcoIm51bWJlciBvZiBidWZmZXJzIHRvIGJlIHVzZWQgaXMgJWRcbiIsIG51 bV9idWZmZXJzKTsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSAndCc6Cj4+ICsgICAg ICAgIHRlc3RfZHVyYXRpb24gPSBhdG9pKG9wdGFyZyk7Cj4+ICsgICAgICAgIGlndF9hc3NlcnRf Zih0ZXN0X2R1cmF0aW9uID4gMCwgImludmFsaWQgaW5wdXQgZm9yIC10Cj4+IG9wdGlvblxuIik7 Cj4+ICsgICAgICAgIGlndF9kZWJ1ZygibG9nZ2VyIHRvIHJ1biBmb3IgJWQgc2Vjb25kXG4iLCB0 ZXN0X2R1cmF0aW9uKTsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgY2FzZSAncCc6Cj4+ICsg ICAgICAgIHBvbGxfdGltZW91dCA9IGF0b2kob3B0YXJnKTsKPj4gKyAgICAgICAgaWd0X2Fzc2Vy dF9mKHBvbGxfdGltZW91dCAhPSAwLCAiaW52YWxpZCBpbnB1dCBmb3IgLXAKPj4gb3B0aW9uXG4i KTsKPj4gKyAgICAgICAgaWYgKHBvbGxfdGltZW91dCA+IDApCj4+ICsgICAgICAgICAgICBpZ3Rf ZGVidWcoInBvbGxpbmcgdG8gYmUgZG9uZSB3aXRoICVkIG1pbGxpc2Vjb25kCj4+IHRpbWVvdXRc biIsIHBvbGxfdGltZW91dCk7Cj4+ICsgICAgICAgIGJyZWFrOwo+PiArICAgIGNhc2UgJ3MnOgo+ PiArICAgICAgICBtYXhfZmlsZXNpemUgPSBhdG9pKG9wdGFyZyk7Cj4+ICsgICAgICAgIGlndF9h c3NlcnRfZihtYXhfZmlsZXNpemUgPiAwLCAiaW52YWxpZCBpbnB1dCBmb3IgLXMgb3B0aW9uXG4i KTsKPj4gKyAgICAgICAgaWd0X2RlYnVnKCJtYXggYWxsb3dlZCBzaXplIG9mIHRoZSBvdXRwdXQg ZmlsZSBpcyAlZCBNQlxuIiwKPj4gbWF4X2ZpbGVzaXplKTsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ ICsgICAgY2FzZSAnZCc6Cj4+ICsgICAgICAgIGRpc2NhcmRfb2xkbG9ncyA9IHRydWU7Cj4+ICsg ICAgICAgIGlndF9kZWJ1Zygib2xkL2Jvb3QtdGltZSBsb2dzIHdpbGwgYmUgZGlzY2FyZGVkXG4i KTsKPj4gKyAgICAgICAgYnJlYWs7Cj4+ICsgICAgfQo+PiArCj4+ICsgICAgcmV0dXJuIDA7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHByb2Nlc3NfY29tbWFuZF9saW5lKGludCBhcmdjLCBj aGFyICoqYXJndikKPj4gK3sKPj4gKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlv bnNbXSA9IHsKPj4gKyAgICAgICAgeyJ2ZXJib3NpdHkiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwg J3YnfSwKPj4gKyAgICAgICAgeyJvdXRwdXRmaWxlIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdv J30sCj4+ICsgICAgICAgIHsiYnVmZmVycyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYid9LAo+ PiArICAgICAgICB7InRlc3RkdXJhdGlvbiIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAndCd9LAo+ PiArICAgICAgICB7InBvbGx0aW1lb3V0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdwJ30sCj4+ ICsgICAgICAgIHsic2l6ZSIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAncyd9LAo+PiArICAgICAg ICB7ImRpc2NhcmQiLCBub19hcmd1bWVudCwgMCwgJ2QnfSwKPj4gKyAgICAgICAgeyAwLCAwLCAw LCAwIH0KPj4gKyAgICB9Owo+PiArCj4+ICsgICAgY29uc3QgY2hhciAqaGVscCA9Cj4+ICsgICAg ICAgICIgIC12IC0tdmVyYm9zaXR5PWxldmVsICAgdmVyYm9zaXR5IGxldmVsIG9mIEd1QyBsb2dn aW5nCj4+ICgwLTMpXG4iCj4+ICsgICAgICAgICIgIC1vIC0tb3V0cHV0ZmlsZT1uYW1lICAgbmFt ZSBvZiB0aGUgb3V0cHV0IGZpbGUsIGluY2x1ZGluZwo+PiB0aGUgbG9jYXRpb24sIHdoZXJlIGxv Z3Mgd2lsbCBiZSBzdG9yZWRcbiIKPj4gKyAgICAgICAgIiAgLWIgLS1idWZmZXJzPW51bSAgICAg ICBudW1iZXIgb2YgYnVmZmVycyB0byBiZSBtYWludGFpbmVkCj4+IG9uIGxvZ2dlciBzaWRlIGZv ciBzdG9yaW5nIGxvZ3NcbiIKPj4gKyAgICAgICAgIiAgLXQgLS10ZXN0ZHVyYXRpb249c2VjICBt YXggZHVyYXRpb24gaW4gc2Vjb25kcyBmb3Igd2hpY2gKPj4gdGhlIGxvZ2dlciBzaG91bGQgcnVu XG4iCj4+ICsgICAgICAgICIgIC1wIC0tcG9sbHRpbWVvdXQ9bXMgICAgcG9sbGluZyB0aW1lb3V0 IGluIG1zLCAtMSA9PQo+PiBpbmRlZmluaXRlIHdhaXQgZm9yIHRoZSBuZXcgZGF0YVxuIgo+PiAr ICAgICAgICAiICAtcyAtLXNpemU9TUIgICAgICAgICAgIG1heCBzaXplIG9mIG91dHB1dCBmaWxl IGluIE1Ccwo+PiBhZnRlciB3aGljaCBsb2dnaW5nIHdpbGwgYmUgc3RvcHBlZFxuIgo+PiArICAg ICAgICAiICAtZCAtLWRpc2NhcmQgICAgICAgICAgIGRpc2NhcmQgdGhlIG9sZC9ib290LXRpbWUg bG9ncwo+PiBiZWZvcmUgZW50ZXJpbmcgaW50byB0aGUgY2FwdHVyZSBsb29wXG4iOwo+PiArCj4+ ICsgICAgaWd0X3NpbXBsZV9pbml0X3BhcnNlX29wdHMoJmFyZ2MsIGFyZ3YsICJ2Om86Yjp0OnA6 czpkIiwKPj4gbG9uZ19vcHRpb25zLAo+PiArICAgICAgICAgICAgICAgICAgIGhlbHAsIHBhcnNl X29wdGlvbnMsIE5VTEwpOwo+PiArfQo+PiArCj4+ICtpbnQgbWFpbihpbnQgYXJnYywgY2hhciAq KmFyZ3YpCj4+ICt7Cj4+ICsgICAgc3RydWN0IHBvbGxmZCByZWxheV9wb2xsX2ZkOwo+PiArICAg IGludCBuZmRzOwo+PiArICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICBwcm9jZXNzX2NvbW1hbmRf bGluZShhcmdjLCBhcmd2KTsKPj4gKwo+PiArICAgIGluaXRfbWFpbl90aHJlYWQoKTsKPj4gKwo+ PiArICAgIC8qIFVzZSBhIHNlcGFyYXRlIHRocmVhZCBmb3IgZmx1c2hpbmcgdGhlIGxvZ3MgdG8g YSBmaWxlIG9uIGRpc2suCj4+ICsgICAgICogTWFpbiB0aHJlYWQgd2lsbCBidWZmZXIgdGhlIGRh dGEgZnJvbSByZWxheSBmaWxlIGluIGl0cyBwb29sIG9mCj4+ICsgICAgICogYnVmZmVycyBhbmQg b3RoZXIgdGhyZWFkIHdpbGwgZmx1c2ggdGhlIGRhdGEgdG8gZGlzayBpbgo+PiBiYWNrZ3JvdW5k Lgo+PiArICAgICAqIFRoaXMgaXMgbmVlZGVkLCBhbGJlaXQgYnkgZGVmYXVsdCBkYXRhIGlzIHdy aXR0ZW4gb3V0IHRvIGRpc2sgaW4KPj4gKyAgICAgKiBhc3luYyBtb2RlLCBhcyB3aGVuIHRoZXJl IGFyZSB0b28gbWFueSBkaXJ0eSBwYWdlcyBpbiB0aGUgUkFNLAo+PiArICAgICAqICgvcHJvYy9z eXMvdm0vZGlydHlfcmF0aW8pLCBrZXJuZWwgc3RhcnRzIGJsb2NraW5nIHRoZSBwcm9jZXNzZXMK Pj4gKyAgICAgKiBkb2luZyB0aGUgZmlsZSB3cml0ZXMuCj4+ICsgICAgICovCj4+ICsgICAgaW5p dF9mbHVzaGVyX3RocmVhZCgpOwo+PiArCj4+ICsgICAgcmVsYXlfcG9sbF9mZC5mZCA9IHJlbGF5 X2ZkOwo+PiArICAgIHJlbGF5X3BvbGxfZmQuZXZlbnRzID0gUE9MTElOOwo+PiArICAgIHJlbGF5 X3BvbGxfZmQucmV2ZW50cyA9IDA7Cj4+ICsKPj4gKyAgICBuZmRzID0gMTsgLyogb25seSBvbmUg ZmQgdG8gcG9sbCAqLwo+PiArCj4+ICsgICAgYWxhcm0odGVzdF9kdXJhdGlvbik7IC8qIFN0YXJ0 IHRoZSBhbGFybSAqLwo+PiArCj4+ICsgICAgZG8gewo+PiArICAgICAgICAvKiBXYWl0L3BvbGwg Zm9yIHRoZSBuZXcgZGF0YSB0byBiZSBhdmFpbGFibGUsIHJlbGF5IGRvZXNuJ3QKPj4gKyAgICAg ICAgICogcHJvdmlkZSBhIGJsb2NraW5nIHJlYWQuCj4+ICsgICAgICAgICAqIE9uIG9sZGVyIGtl cm5lbHMgbmVlZCB0byBkbyBwb2xsaW5nIHdpdGggYSB0aW1lb3V0IGluc3RlYWQgb2YKPj4gKyAg ICAgICAgICogaW5kZWZpbml0ZSB3YWl0IHRvIGF2b2lkIHJlbHlpbmcgb24gcmVsYXkgZm9yIHRo ZSB3YWtldXAsIGFzCj4+ICsgICAgICAgICAqIHJlbGF5IHVzZWQgdG8gZG8gdGhlIHdha2V1cCBp biBhIGRlZmVycmVkIG1hbm5lciBvbiBqaWZmaWVzCj4+ICsgICAgICAgICAqIGdyYW51bGFyaXR5 IGJ5IHNjaGVkdWxpbmcgYSB0aW1lciBhbmQgbW9yZW92ZXIgdGhhdCB0aW1lciB3YXMKPj4gKyAg ICAgICAgICogcmUtc2NoZWR1bGVkIG9uIGV2ZXJ5IG5ld2x5IHByb2R1Y2VkIGJ1ZmZlciBhbmQg c28gd2FzIHB1c2hlZAo+PiArICAgICAgICAgKiBvdXQgaWYgdGhlcmUgd2VyZSBtdWx0aXBsZSBm bHVzaCBpbnRlcnJ1cHRzIGluIGEgdmVyeSBxdWljawo+PiArICAgICAgICAgKiBzdWNjZXNzaW9u IChsZXNzIHRoYW4gYSBqaWZmeSBnYXAgYmV0d2VlbiAyIGZsdXNoIGludGVycnVwdHMpCj4+ICsg ICAgICAgICAqIGNhdXNpbmcgcmVsYXkgdG8gcnVuIG91dCBvZiBzdWIgYnVmZmVycyB0byBzdG9y ZSBuZXcgbG9ncy4KPj4gKyAgICAgICAgICovCj4+ICsgICAgICAgIHJldCA9IHBvbGwoJnJlbGF5 X3BvbGxfZmQsIG5mZHMsIHBvbGxfdGltZW91dCk7Cj4+ICsgICAgICAgIGlmIChyZXQgPCAwKSB7 Cj4+ICsgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpCj4+ICsgICAgICAgICAgICAgICAg YnJlYWs7Cj4+ICsgICAgICAgICAgICBpZ3RfYXNzZXJ0X2YoMCwgInBvbGwgY2FsbCBmYWlsZWRc biIpOwo+PiArICAgICAgICB9Cj4+ICsKPj4gKyAgICAgICAgLyogTm8gZGF0YSBhdmFpbGFibGUg eWV0LCBwb2xsIGFnYWluLCBob3BlZnVsbHkgbmV3IGRhdGEgaXMKPj4gcm91bmQgdGhlIGNvcm5l ciAqLwo+PiArICAgICAgICBpZiAoIXJlbGF5X3BvbGxfZmQucmV2ZW50cykKPj4gKyAgICAgICAg ICAgIGNvbnRpbnVlOwo+PiArCj4+ICsgICAgICAgIHB1bGxfZGF0YSgpOwo+PiArICAgIH0gd2hp bGUgKCFzdG9wX2xvZ2dpbmcpOwo+PiArCj4+ICsgICAgLyogUGF1c2UgbG9nZ2luZyBvbiB0aGUg R3VDIHNpZGUgKi8KPj4gKyAgICBndWNfbG9nX2NvbnRyb2woZmFsc2UpOwo+PiArCj4+ICsgICAg LyogU2lnbmFsIGZsdXNoZXIgdGhyZWFkIHRvIG1ha2UgYW4gZXhpdCAqLwo+PiArICAgIGNhcHR1 cmluZ19zdG9wcGVkID0gMTsKPj4gKyAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ1bmRlcmZsb3df Y29uZCk7Cj4+ICsgICAgcHRocmVhZF9qb2luKGZsdXNoX3RocmVhZCwgTlVMTCk7Cj4+ICsKPj4g KyAgICBwdWxsX2xlZnRvdmVyX2RhdGEoKTsKPj4gKyAgICBpZ3RfaW5mbygidG90YWwgYnl0ZXMg d3JpdHRlbiAlIiBQUkl1NjQgIlxuIiwgdG90YWxfYnl0ZXNfd3JpdHRlbik7Cj4+ICsKPj4gKyAg ICBmcmVlKHJlYWRfYnVmZmVyKTsKPj4gKyAgICBjbG9zZShyZWxheV9mZCk7Cj4+ICsgICAgY2xv c2Uob3V0ZmlsZV9mZCk7Cj4+ICsgICAgaWd0X2V4aXQoKTsKPj4gK30KPgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0 CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK