From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: Re: [PATCH v8 for Xen 4.7 4/4] xl: enable per-VCPU parameter for RTDS Date: Thu, 31 Mar 2016 21:16:51 +0100 Message-ID: <20160331201651.GA23878@citrix.com> References: <1458336385-2606-1-git-send-email-lichong659@gmail.com> <1458336385-2606-5-git-send-email-lichong659@gmail.com> <1459444677.5082.203.camel@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <1459444677.5082.203.camel@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Dario Faggioli Cc: Chong Li , wei.liu2@citrix.com, Sisu Xi , george.dunlap@eu.citrix.com, xen-devel@lists.xen.org, Meng Xu , Chong Li , dgolomb@seas.upenn.edu List-Id: xen-devel@lists.xenproject.org T24gVGh1LCBNYXIgMzEsIDIwMTYgYXQgMDc6MTc6NTdQTSArMDIwMCwgRGFyaW8gRmFnZ2lvbGkg d3JvdGU6ClsuLi5dCj4gPiArMykgVXNlcnMgY2FuIHNldCB0aGUgYnVkZ2V0IGFuZCBwZXJpb2Qg b2YgbXVsdGlwbGUgVkNQVXMgb2YgYcKgCj4gPiArc3BlY2lmaWMgZG9tYWluIHdpdGggb25seSBv bmUgY29tbWFuZCzCoAo+IMKgSXQgaXMgcG9zc2libGUgdG8gY2hhbmdlIHRoZSBidWRnZXQgYW5k IHRoZSBwZXJpb2Qgb2YgbXVsdGlwbGUgVkNQVXPCoAo+IMKgb2YgYSBkb21haW4gd2l0aCBqdXN0 IG9uZSBjb21tYW5kLCBmb3IgaW5zdGFuY2U6Cj4gCj4gPiArZS5nLiwgInhsIHNjaGVkLXJ0ZHMg LWQgdm0xIC12IDAgLXAgMTAwIC1iIDUwIC12IDMgLXAgMzAwIC1iIDE1MCIuCj4gPiArCj4gPiAr VXNlcnMgY2FuIHNldCBhbGwgVkNQVXMgd2l0aCB0aGUgc2FtZSBwYXJhbWV0ZXJzLCBieSBvbmUg Y29tbWFuZC4KPiDCoFRvIGNoYW5nZSB0aGUgcGFyYW1ldGVycyBvZiBhbGwgdGhlIFZDUFVzIG9m IGEgZG9tYWluLCB1c2UgQjwtdiBhbGw+Ogo+IAoKRG9jdW1lbnRhdGlvbnMgYXJlIGFsd2F5cyBv cGVuIHRvIGltcHJvdmVtZW50IGV2ZW4gYWZ0ZXIgZnJlZXplLCBzbyBJCnRoaW5rIHdlJ3JlIG1v c3RseSBmaW5lIGhlcmUuIFdoZXRoZXIgQ2hvbmcgZml4ZXMgdGhhdCBpbiB0aGUgbmV4dAp2ZXJz aW9uIG9yIHN1Ym1pdCBzdWJzZXF1ZW50IHBhdGNoIGZvciBkb2NzIGlzIGZpbmUuCgpMZXQncyBm b2N1cyBvbiB0aGUgY29kZSBpdHNlbGYgbm93LCB0aGF0J3Mgc29tZXRoaW5nIHdlIG5lZWQgdG8g Z2V0CnJpZ2h0LgoKPiA+IC0tLSBhL3Rvb2xzL2xpYnhsL3hsX2NtZGltcGwuYwo+ID4gKysrIGIv dG9vbHMvbGlieGwveGxfY21kaW1wbC5jCj4gPiBAQCAtNTgyMyw2ICs1ODIzLDUyIEBAIHN0YXRp YyBpbnQgc2NoZWRfZG9tYWluX3NldChpbnQgZG9taWQsIGNvbnN0Cj4gPiBsaWJ4bF9kb21haW5f c2NoZWRfcGFyYW1zICpzY2luZm8pCj4gPiDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiDCoH0KPiA+ IMKgCj4gPiArc3RhdGljIGludCBzY2hlZF92Y3B1X2dldChsaWJ4bF9zY2hlZHVsZXIgc2NoZWQs IGludCBkb21pZCwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKnNjaW5mbykKPiA+ICt7Cj4gPiAr wqDCoMKgwqBpbnQgcmM7Cj4gPiArCj4gPiArwqDCoMKgwqByYyA9IGxpYnhsX3ZjcHVfc2NoZWRf cGFyYW1zX2dldChjdHgsIGRvbWlkLCBzY2luZm8pOwo+ID4gK8KgwqDCoMKgaWYgKHJjKSB7Cj4g PiArwqDCoMKgwqDCoMKgwqDCoGZwcmludGYoc3RkZXJyLCAibGlieGxfdmNwdV9zY2hlZF9wYXJh bXNfZ2V0IGZhaWxlZC5cbiIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqBleGl0KC0xKTsKPiA+ICvC oMKgwqDCoH0KPiBGb3IgbmV3IGNvZGUsIGxldCdzIHVzZSBFWElUX1NVQ0NFU1MgYW5kIEVYSVRf RkFJTFVSRS4KPiAKPiBPaCwganVzdCBpbiBjYXNlLCB0aGF0IGFwcGxpZXMgdG8gd2hlbiBleGl0 KCkgaXMgdXNlZCwgc28uLi4KPiAKClRoaXMgbmVlZHMgZml4aW5nLgoKPiA+ICvCoMKgwqDCoGlm IChzY2luZm8tPnNjaGVkICE9IHNjaGVkKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGZwcmludGYo c3RkZXJyLCAibGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfZ2V0IHJldHVybmVkICVzIG5vdAo+ID4g JXMuXG4iLAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlieGxfc2NoZWR1 bGVyX3RvX3N0cmluZyhzY2luZm8tPnNjaGVkKSwKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoGxpYnhsX3NjaGVkdWxlcl90b19zdHJpbmcoc2NoZWQpKTsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIDE7Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqByZXR1 cm4gMDsKPiA+ICt9Cj4gPiArCj4gLi4uIHRoZXNlIHR3byByZXR1cm5zIGFyZSBvayB0byBiZSAx IGFuZCAwLgo+IAo+ID4gK3N0YXRpYyBpbnQgc2NoZWRfdmNwdV9zZXQoaW50IGRvbWlkLCBjb25z dCBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcwo+ID4gKnNjaW5mbykKPiA+ICt7Cj4gPiArwqDCoMKg wqBpbnQgcmM7Cj4gPiArCj4gPiArwqDCoMKgwqByYyA9IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1z X3NldChjdHgsIGRvbWlkLCBzY2luZm8pOwo+ID4gK8KgwqDCoMKgaWYgKHJjKSB7Cj4gPiArwqDC oMKgwqDCoMKgwqDCoGZwcmludGYoc3RkZXJyLCAibGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfc2V0 IGZhaWxlZC5cbiIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqBleGl0KC0xKTsKPiA+ICvCoMKgwqDC oH0KPiA+ICsKPiA+ICvCoMKgwqDCoHJldHVybiByYzsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IGludCBzY2hlZF92Y3B1X3NldF9hbGwoaW50IGRvbWlkLCBjb25zdAo+ID4gbGlieGxfdmNwdV9z Y2hlZF9wYXJhbXMgKnNjaW5mbykKPiA+ICt7Cj4gPiArwqDCoMKgwqBpbnQgcmM7Cj4gPiArCj4g PiArwqDCoMKgwqByYyA9IGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldF9hbGwoY3R4LCBkb21p ZCwgc2NpbmZvKTsKPiA+ICvCoMKgwqDCoGlmIChyYykgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqBm cHJpbnRmKHN0ZGVyciwgImxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX3NldCBmYWlsZWQuXG4iKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgZXhpdCgtMSk7Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4gPiAr wqDCoMKgwqByZXR1cm4gcmM7Cj4gPiArfQo+ID4gKwo+IFRoZXNlIHR3byBmdW5jdGlvbnMgZWl0 aGVyIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSwgb3IgcmV0dXJuIDAuIFRoYXQKPiBtZWFucyB0aGV5 IGNhbiBiZSB2b2lkLgo+IAoKTmljZSB0byBoYXZlLCBidXQgbm90IHN0cmljdGx5IHJlcXVpcmVk LiBJdCdzIG5vdCBhIGJ1ZyBwZXIgc2UuIEkgd29uJ3QKYmxvY2sgdGhpcyBzZXJpZXMganVzdCBi ZWNhdXNlIG9mIHRoaXMuCgo+ID4gQEAgLTU5NDIsNiArNTk4OCwzNyBAQCBzdGF0aWMgaW50IHNj aGVkX3J0ZHNfZG9tYWluX291dHB1dCgKPiA+IMKgwqDCoMKgwqByZXR1cm4gMDsKPiA+IMKgfQo+ ID4gwqAKPiA+ICtzdGF0aWMgaW50IHNjaGVkX3J0ZHNfdmNwdV9vdXRwdXQoaW50IGRvbWlkLCBs aWJ4bF92Y3B1X3NjaGVkX3BhcmFtcwo+ID4gKnNjaW5mbykKPiA+ICt7Cj4gPiArwqDCoMKgwqBj aGFyICpkb21uYW1lOwo+ID4gK8KgwqDCoMKgaW50IHJjID0gMDsKPiA+ICvCoMKgwqDCoGludCBp Owo+ID4gKwo+ID4gK8KgwqDCoMKgaWYgKGRvbWlkIDwgMCkgewo+ID4gK8KgwqDCoMKgwqDCoMKg wqBwcmludGYoIiUtMzNzICU0cyAlNHMgJTlzICU5c1xuIiwgIk5hbWUiLCAiSUQiLAo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCJWQ1BVIiwgIlBlcmlvZCIsICJCdWRnZXQiKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4gPiAr wqDCoMKgwqByYyA9IHNjaGVkX3ZjcHVfZ2V0KExJQlhMX1NDSEVEVUxFUl9SVERTLCBkb21pZCwg c2NpbmZvKTsKPiA+ICvCoMKgwqDCoGlmIChyYykKPiA+ICvCoMKgwqDCoMKgwqDCoMKgZ290byBv dXQ7Cj4gPiArCj4gSSBkb24ndCBzZWUgdGhlIG5lZWQgZm9yIHByb3BhZ2F0aW5nIHJjLi4uIFRo aXMgc2hvdWxkIGp1c3QgcmV0dXJuIDAgb3IKPiAxLCBsaWtlLCBmb3IgaW5zdGFuY2UsIHNjaGVk X2NyZWRpdF9kb21haW5fb3V0cHV0KCkgaXMgZG9pbmcsIGRvZXNuJ3QKPiBpdD8KPiAKCkFnYWlu LCBuaWNlIHRvIGhhdmUuIEdvb2QgdG8gYmUgY29uc2lzdGVudC4gTm90IGEgYnVnIHBlciBzZS4g Tm90IGEKYmxvY2tlci4KCj4gPiBAQCAtNjAxNSw2ICs2MDkyLDY1IEBAIHN0YXRpYyBpbnQgc2No ZWRfZG9tYWluX291dHB1dChsaWJ4bF9zY2hlZHVsZXIKPiA+IHNjaGVkLCBpbnQgKCpvdXRwdXQp KGludCksCj4gPiDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gPiDCoH0KPiA+IMKgCj4gPiArc3RhdGlj IGludCBzY2hlZF92Y3B1X291dHB1dChsaWJ4bF9zY2hlZHVsZXIgc2NoZWQsCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCAo Km91dHB1dCkoaW50LAo+ID4gbGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgKiksCj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGludCAo KnBvb2xvdXRwdXQpKHVpbnQzMl90KSwgY29uc3QgY2hhcgo+ID4gKmNwdXBvb2wpCj4gPiArewo+ ID4gK8KgwqDCoMKgbGlieGxfZG9taW5mbyAqaW5mbzsKPiA+ICvCoMKgwqDCoGxpYnhsX2NwdXBv b2xpbmZvICpwb29saW5mbyA9IE5VTEw7Cj4gPiArwqDCoMKgwqB1aW50MzJfdCBwb29saWQ7Cj4g PiArwqDCoMKgwqBpbnQgbmJfZG9tYWluLCBuX3Bvb2xzID0gMCwgaSwgcDsKPiA+ICvCoMKgwqDC oGludCByYyA9IDA7Cj4gPiArCj4gPiArwqDCoMKgwqBpZiAoY3B1cG9vbCkgewo+ID4gK8KgwqDC oMKgwqDCoMKgwqBpZiAobGlieGxfY3B1cG9vbF9xdWFsaWZpZXJfdG9fY3B1cG9vbGlkKGN0eCwg Y3B1cG9vbCwKPiA+ICZwb29saWQsIE5VTEwpCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg fHwgIWxpYnhsX2NwdXBvb2xpZF9pc192YWxpZChjdHgsIHBvb2xpZCkpIHsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBmcHJpbnRmKHN0ZGVyciwgInVua25vd24gY3B1cG9vbCBcJyVzXCdc biIsIGNwdXBvb2wpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAxOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqB9Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4gPiArwqDCoMKgwqBpbmZv ID0gbGlieGxfbGlzdF9kb21haW4oY3R4LCAmbmJfZG9tYWluKTsKPiA+ICvCoMKgwqDCoGlmICgh aW5mbykgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqBmcHJpbnRmKHN0ZGVyciwgImxpYnhsX2xpc3Rf ZG9tYWluIGZhaWxlZC5cbiIpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqByZXR1cm4gMTsKPiA+ICvC oMKgwqDCoH0KPiA+ICvCoMKgwqDCoHBvb2xpbmZvID0gbGlieGxfbGlzdF9jcHVwb29sKGN0eCwg Jm5fcG9vbHMpOwo+ID4gK8KgwqDCoMKgaWYgKCFwb29saW5mbykgewo+ID4gK8KgwqDCoMKgwqDC oMKgwqBmcHJpbnRmKHN0ZGVyciwgImVycm9yIGdldHRpbmcgY3B1cG9vbCBpbmZvXG4iKTsKPiA+ ICvCoMKgwqDCoMKgwqDCoMKgbGlieGxfZG9taW5mb19saXN0X2ZyZWUoaW5mbywgbmJfZG9tYWlu KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDE7Cj4gPiArwqDCoMKgwqB9Cj4gPiArCj4g PiArwqDCoMKgwqBmb3IgKHAgPSAwOyAhcmMgJiYgKHAgPCBuX3Bvb2xzKTsgcCsrKSB7Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoGlmICgocG9vbGluZm9bcF0uc2NoZWQgIT0gc2NoZWQpIHx8Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKGNwdXBvb2wgJiYgKHBvb2xpZCAhPSBwb29saW5mb1tw XS5wb29saWQpKSkKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPiA+ICsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgcG9vbG91dHB1dChwb29saW5mb1twXS5wb29saWQpOwo+ID4g Kwo+ID4gK8KgwqDCoMKgwqDCoMKgwqBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyBzY2luZm9fb3V0 Owo+ID4KPiBWYXJpYWJsZXMgc2hvdWxkIGJlIGRlY2xhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2Yg dGhlIGJsb2NrLCBpLmUuLCBqdXN0Cj4gYmVsb3cgZm9yKCl7LCBpbiB0aGlzIGNhc2UuCj4gCgpU aGlzIG5lZWRzIGZpeGluZy4gSXQgbWlnaHQgdHJpcCBvdmVyIHN0cmljdCBjb21waWxlciBzZXR0 aW5nLgoKPiA+ICvCoMKgwqDCoMKgwqDCoMKgbGlieGxfdmNwdV9zY2hlZF9wYXJhbXNfaW5pdCgm c2NpbmZvX291dCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoG91dHB1dCgtMSwgJnNjaW5mb19vdXQp Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19kaXNwb3NlKCZz Y2luZm9fb3V0KTsKPiA+Cj4gQW5kIGJ5IHRoZSB3YXksIHdoZW4gY2FsbGluZyBvdXRwdXQoKSB3 aXRoIC0xLCB3aGljaCBJIHRoaW5rIG1lYW5zCj4gImp1c3QgcHJpbnQgdGhlIHRhYmxlIGhlYWRl ciwgZG8gd2UgcmVhbGx5IG5lZWQgYSB2YWxpZCBhbmQgaW5pdGVkCj4gbGlieGxfdmNwdV9zY2hl ZF9wYXJhbXM/IENhbid0IGl0IGJlIE5VTEwgKHNjaGVkX3J0ZHNfdmNwdV9vdXRwdXQoKQo+IGxv b2tzIGFscmVhZHkgYWJsZSB0byB3b3JrIHdlbGwgaW4gdGhpcyBjYXNlIHRvIG1lKS4KPiAKClJp Z2h0LCB0aGlzIGxvb2tzIHNpbXBsZSBlbm91Z2ggdG8gZml4LgoKPiA+ICvCoMKgwqDCoMKgwqDC oMKgZm9yIChpID0gMDsgaSA8IG5iX2RvbWFpbjsgaSsrKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgKGluZm9baV0uY3B1cG9vbCAhPSBwb29saW5mb1twXS5wb29saWQpCj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBsaWJ4bF92Y3B1X3NjaGVkX3BhcmFtcyBzY2luZm87Cj4gPgo+IERpdHRv IGFib3V0IHZhcmlhYmxlIGRlY2xhcmF0aW9uLgo+IAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2luaXQoJnNjaW5mbyk7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgc2NpbmZvLm51bV92Y3B1cyA9IDA7Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgcmMgPSBvdXRwdXQoaW5mb1tpXS5kb21pZCwgJnNjaW5mbyk7Cj4gPgo+IE1tLi4g c28gMCBiZWNhdXNlIHdlIHdhbnQgdG8gYWxsIHZjcHVzLiBVZ2x5LiBBcyBpdCB3YXMgdWdseSBp biB0aGUgc2V0Cj4gY2FzZSwgYW5kIHRoYXQgaXMgd2h5IHdlIGFkZGVkIGxpYnhsXypfc2V0X2Fs bCgpLiBJJ20gc29ycnkgSSdtCj4gc3BvdHRpbmcgdGhpcyBvbmx5IG5vdywgYnV0IEkgdGhpbmsg d2UgbmVlZAo+IGHCoGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2dldF9hbGwoKS4gOi0vCj4gCgpZ ZXMsIHRoaXMgbWFrZXMgc2Vuc2UuCgo+ID4gQEAgLTYyMTUsODQgKzYzNTEsMTgzIEBAIGludCBt YWluX3NjaGVkX2NyZWRpdDIoaW50IGFyZ2MsIGNoYXIKPiA+ICoqYXJndikKPiA+IMKgCj4gPiDC oC8qCj4gPiDCoCAqIDxub3RoaW5nPsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoDogTGlzdCBhbGwg ZG9tYWluIHBhcmFtdGVycyBhbmQgc2NoZWQgcGFyYW1zCj4gPiAtICogLWQgW2RvbWlkXcKgwqDC oMKgwqDCoMKgwqDCoMKgwqA6IExpc3QgZG9tYWluIHBhcmFtcyBmb3IgZG9tYWluCj4gPiArICog LWQgW2RvbWlkXcKgwqDCoMKgwqDCoMKgwqDCoMKgwqA6IExpc3QgZGVmYXVsdCBkb21haW4gcGFy YW1zIGZvciBkb21haW4KPiA+IMKgICogLWQgW2RvbWlkXSBbcGFyYW1zXcKgwqA6IFNldCBkb21h aW4gcGFyYW1zIGZvciBkb21haW4KPiA+ICsgKiAtZCBbZG9taWRdIC12IFt2Y3B1aWQgMV0gLXYg W3ZjcHVpZCAyXSAuLi7CoMKgOgo+ID4gKyAqIExpc3QgcGVyLVZDUFUgcGFyYW1zIGZvciBkb21h aW4KPiA+ICsgKiAtZCBbZG9taWRdIC12IGFsbMKgwqA6IExpc3QgYWxsIHBlci1WQ1BVIHBhcmFt cyBmb3IgZG9tYWluCj4gPiArICogLXYgYWxswqDCoDogTGlzdCBhbGwgcGVyLVZDUFUgcGFyYW1z IGZvciBhbGwgZG9tYWlucwo+ID4gKyAqIC1kIFtkb21pZF0gLXYgW3ZjcHVpZCAxXSBbcGFyYW1z XSAtdiBbdmNwdWlkIDJdIFtwYXJhbXNdIC4uLsKgwqA6Cj4gPiArICogU2V0IHBlci1WQ1BVIHBh cmFtcyBmb3IgZG9tYWluCj4gPiArICogLWQgW2RvbWlkXSAtdiBhbGwgW3BhcmFtc13CoMKgOiBT ZXQgYWxsIHBlci1WQ1BVIHBhcmFtcyBmb3IgZG9tYWluCj4gPiDCoCAqLwo+ID4gwqBpbnQgbWFp bl9zY2hlZF9ydGRzKGludCBhcmdjLCBjaGFyICoqYXJndikKPiA+IMKgewo+ID4gwqDCoMKgwqDC oGNvbnN0IGNoYXIgKmRvbSA9IE5VTEw7Cj4gPiDCoMKgwqDCoMKgY29uc3QgY2hhciAqY3B1cG9v bCA9IE5VTEw7Cj4gPiAtwqDCoMKgwqBpbnQgcGVyaW9kID0gMDsgLyogcGVyaW9kIGlzIGluIG1p Y3Jvc2Vjb25kICovCj4gPiAtwqDCoMKgwqBpbnQgYnVkZ2V0ID0gMDsgLyogYnVkZ2V0IGlzIGlu IG1pY3Jvc2Vjb25kICovCj4gPiArwqDCoMKgwqBpbnQgKnZjcHVzID0gKGludCAqKXhtYWxsb2Mo c2l6ZW9mKGludCkpOyAvKiBJRHMgb2YgVkNQVXMgdGhhdAo+ID4gY2hhbmdlICovCj4gPiArwqDC oMKgwqBpbnQgKnBlcmlvZHMgPSAoaW50ICopeG1hbGxvYyhzaXplb2YoaW50KSk7IC8qIHBlcmlv ZCBpcyBpbgo+ID4gbWljcm9zZWNvbmQgKi8KPiA+ICvCoMKgwqDCoGludCAqYnVkZ2V0cyA9IChp bnQgKil4bWFsbG9jKHNpemVvZihpbnQpKTsgLyogYnVkZ2V0IGlzIGluCj4gPiBtaWNyb3NlY29u ZCAqLwo+ID4gK8KgwqDCoMKgaW50IHZfc2l6ZSA9IDE7IC8qIHNpemUgb2YgdmNwdXMgYXJyYXkg Ki8KPiA+ICvCoMKgwqDCoGludCBwX3NpemUgPSAxOyAvKiBzaXplIG9mIHBlcmlvZHMgYXJyYXkg Ki8KPiA+ICvCoMKgwqDCoGludCBiX3NpemUgPSAxOyAvKiBzaXplIG9mIGJ1ZGdldHMgYXJyYXkg Ki8KPiA+ICvCoMKgwqDCoGludCB2X2luZGV4ID0gMDsgLyogaW5kZXggaW4gdmNwdXMgYXJyYXkg Ki8KPiA+ICvCoMKgwqDCoGludCBwX2luZGV4ID0wOyAvKiBpbmRleCBpbiBwZXJpb2RzIGFycmF5 ICovCj4gPiArwqDCoMKgwqBpbnQgYl9pbmRleCA9MDsgLyogaW5kZXggZm9yIGluIGJ1ZGdldHMg YXJyYXkgKi8KPiA+IMKgwqDCoMKgwqBib29sIG9wdF9wID0gZmFsc2U7Cj4gPiDCoMKgwqDCoMKg Ym9vbCBvcHRfYiA9IGZhbHNlOwo+ID4gLcKgwqDCoMKgaW50IG9wdCwgcmM7Cj4gPiArwqDCoMKg wqBib29sIG9wdF92ID0gZmFsc2U7Cj4gPiArwqDCoMKgwqBib29sIG9wdF9hbGwgPSBmYWxzZTsg Lyogb3V0cHV0IHBlci1kb20gcGFyYW1ldGVycyAqLwo+ID4gK8KgwqDCoMKgaW50IG9wdCwgaSwg cmM7Cj4gPiDCoMKgwqDCoMKgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0c1tdID0gewo+ID4gwqDC oMKgwqDCoMKgwqDCoMKgeyJkb21haW4iLCAxLCAwLCAnZCd9LAo+ID4gwqDCoMKgwqDCoMKgwqDC oMKgeyJwZXJpb2QiLCAxLCAwLCAncCd9LAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgeyJidWRnZXQi LCAxLCAwLCAnYid9LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqB7InZjcHVpZCIsMSwgMCwgJ3YnfSwK PiA+IMKgwqDCoMKgwqDCoMKgwqDCoHsiY3B1cG9vbCIsIDEsIDAsICdjJ30sCj4gPiDCoMKgwqDC oMKgwqDCoMKgwqBDT01NT05fTE9OR19PUFRTCj4gPiDCoMKgwqDCoMKgfTsKPiA+IMKgCj4gPiAt wqDCoMKgwqBTV0lUQ0hfRk9SRUFDSF9PUFQob3B0LCAiZDpwOmI6YzoiLCBvcHRzLCAic2NoZWQt cnRkcyIsIDApIHsKPiA+ICvCoMKgwqDCoFNXSVRDSF9GT1JFQUNIX09QVChvcHQsICJkOnA6Yjp2 OmMiLCBvcHRzLCAic2NoZWQtcnRkcyIsIDApIHsKPiA+IMKgwqDCoMKgwqBjYXNlICdkJzoKPiA+ IMKgwqDCoMKgwqDCoMKgwqDCoGRvbSA9IG9wdGFyZzsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoGJy ZWFrOwo+ID4gwqDCoMKgwqDCoGNhc2UgJ3AnOgo+ID4gLcKgwqDCoMKgwqDCoMKgwqBwZXJpb2Qg PSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGlmIChwX2lu ZGV4ID49IHBfc2l6ZSkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoC8qIHBlcmlvZHMg YXJyYXkgaXMgZnVsbAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgKiBkb3VibGUgdGhl IGFycmF5IHNpemUgZm9yIG5ldyBlbGVtZW50cwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgKi8KPiBDb21tZW50IHN0eWxlLgo+IAoKVGhpcyBuZWVkcyBmaXhpbmcuCgo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHBfc2l6ZSAqPSAyOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoHBlcmlvZHMgPSB4cmVhbGxvYyhwZXJpb2RzLCBwX3NpemUpOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqB9Cj4gPiArwqDCoMKgwqDCoMKgwqDCoHBlcmlvZHNbcF9pbmRleCsrXSA9IHN0cnRvbChv cHRhcmcsIE5VTEwsIDEwKTsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoG9wdF9wID0gMTsKPiA+IMKg wqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ID4gwqDCoMKgwqDCoGNhc2UgJ2InOgo+ID4gLcKgwqDC oMKgwqDCoMKgwqBidWRnZXQgPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Cj4gPiArwqDCoMKg wqDCoMKgwqDCoGlmIChiX2luZGV4ID49IGJfc2l6ZSkgeyAvKiBidWRnZXRzIGFycmF5IGlzIGZ1 bGwgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBiX3NpemUgKj0gMjsKPiA+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBidWRnZXRzID0geHJlYWxsb2MoYnVkZ2V0cywgYl9zaXplKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqBidWRnZXRzW2JfaW5k ZXgrK10gPSBzdHJ0b2wob3B0YXJnLCBOVUxMLCAxMCk7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgwqBv cHRfYiA9IDE7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiA+ICvCoMKgwqDCoGNhc2Ug J3YnOgo+ID4gK8KgwqDCoMKgwqDCoMKgwqBpZiAoIXN0cmNtcChvcHRhcmcsICJhbGwiKSkgeyAv KiBnZXQgb3Igc2V0IGFsbCB2Y3B1cyBvZiBhCj4gPiBkb21haW4gKi8KPiA+ICvCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBvcHRfYWxsID0gMTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBi cmVhazsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgfQo+ID4gK8KgwqDCoMKgwqDCoMKgwqBpZiAodl9p bmRleCA+PSB2X3NpemUpIHsgLyogdmNwdXMgYXJyYXkgaXMgZnVsbCAqLwo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHZfc2l6ZSAqPSAyOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHZjcHVzID0geHJlYWxsb2ModmNwdXMsIHZfc2l6ZSk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoH0K PiA+ICvCoMKgwqDCoMKgwqDCoMKgdmNwdXNbdl9pbmRleCsrXSA9IHN0cnRvbChvcHRhcmcsIE5V TEwsIDEwKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgb3B0X3YgPSAxOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqBicmVhazsKPiA+IMKgwqDCoMKgwqBjYXNlICdjJzoKPiA+IMKgwqDCoMKgwqDCoMKgwqDC oGNwdXBvb2wgPSBvcHRhcmc7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiA+IMKgwqDC oMKgwqB9Cj4gPiDCoAo+ID4gLcKgwqDCoMKgaWYgKGNwdXBvb2wgJiYgKGRvbSB8fCBvcHRfcCB8 fCBvcHRfYikpIHsKPiA+ICvCoMKgwqDCoGlmIChjcHVwb29sICYmIChkb20gfHwgb3B0X3AgfHwg b3B0X2IgfHwgb3B0X3YgfHwgb3B0X2FsbCkpIHsKPiA+IMKgwqDCoMKgwqDCoMKgwqDCoGZwcmlu dGYoc3RkZXJyLCAiU3BlY2lmeWluZyBhIGNwdXBvb2wgaXMgbm90IGFsbG93ZWQgd2l0aCAiCj4g PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIm90aGVyIG9wdGlvbnMuXG4iKTsK PiA+IC3CoMKgwqDCoMKgwqDCoMKgcmV0dXJuIEVYSVRfRkFJTFVSRTsKPiA+ICvCoMKgwqDCoMKg wqDCoMKgcmMgPSBFWElUX0ZBSUxVUkU7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ ID4gwqDCoMKgwqDCoH0KPiA+IC3CoMKgwqDCoGlmICghZG9tICYmIChvcHRfcCB8fCBvcHRfYikp IHsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgZnByaW50ZihzdGRlcnIsICJNdXN0IHNwZWNpZnkgYSBk b21haW4uXG4iKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgcmV0dXJuIEVYSVRfRkFJTFVSRTsKPiA+ ICvCoMKgwqDCoGlmICghZG9tICYmIChvcHRfcCB8fCBvcHRfYiB8fCBvcHRfdikpIHsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgZnByaW50ZihzdGRlcnIsICJNaXNzaW5nIHBhcmFtZXRlcnMuXG4iKTsK PiA+ICvCoMKgwqDCoMKgwqDCoMKgcmMgPSBFWElUX0ZBSUxVUkU7Cj4gPiArwqDCoMKgwqDCoMKg wqDCoGdvdG8gb3V0Owo+ID4gwqDCoMKgwqDCoH0KPiA+IC3CoMKgwqDCoGlmIChvcHRfcCAhPSBv cHRfYikgewo+ID4gLcKgwqDCoMKgwqDCoMKgwqBmcHJpbnRmKHN0ZGVyciwgIk11c3Qgc3BlY2lm eSBwZXJpb2QgYW5kIGJ1ZGdldFxuIik7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoHJldHVybiBFWElU X0ZBSUxVUkU7Cj4gPiArwqDCoMKgwqBpZiAoZG9tICYmICFvcHRfdiAmJiAhb3B0X2FsbCAmJiAo b3B0X3AgfHwgb3B0X2IpKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGZwcmludGYoc3RkZXJyLCAi TXVzdCBzcGVjaWZ5IFZDUFUuXG4iKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgcmMgPSBFWElUX0ZB SUxVUkU7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ID4gK8KgwqDCoMKgfQo+ID4g K8KgwqDCoMKgaWYgKG9wdF92ICYmIG9wdF9hbGwpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgZnBy aW50ZihzdGRlcnIsICJJbmNvcnJlY3QgVkNQVSBJRHMuXG4iKTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgcmMgPSBFWElUX0ZBSUxVUkU7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ID4g K8KgwqDCoMKgfQo+ID4gK8KgwqDCoMKgaWYgKCgodl9pbmRleCA+IGJfaW5kZXgpICYmIG9wdF9i KSB8fCAoKHZfaW5kZXggPiBwX2luZGV4KSAmJgo+ID4gb3B0X3ApCj4gPiArwqDCoMKgwqDCoMKg wqDCoHx8IHBfaW5kZXggIT0gYl9pbmRleCkgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqBmcHJpbnRm KHN0ZGVyciwgIkluY29ycmVjdCBudW1iZXIgb2YgcGVyaW9kIGFuZCBidWRnZXRcbiIpOwo+ID4g K8KgwqDCoMKgwqDCoMKgwqByYyA9IEVYSVRfRkFJTFVSRTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg Z290byBvdXQ7Cj4gPiDCoMKgwqDCoMKgfQo+ID4gwqAKPiA+IC3CoMKgwqDCoGlmICghZG9tKSB7 IC8qIGxpc3QgYWxsIGRvbWFpbidzIHJ0IHNjaGVkdWxlciBpbmZvICovCj4gPiAtwqDCoMKgwqDC oMKgwqDCoGlmIChzY2hlZF9kb21haW5fb3V0cHV0KExJQlhMX1NDSEVEVUxFUl9SVERTLAo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzY2hlZF9ydGRzX2RvbWFpbl9vdXRwdXQsCj4gPiArwqDCoMKgwqBpZiAoKCFkb20p ICYmIG9wdF9hbGwpIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgLyogZ2V0IGFsbCBkb21haW4ncyBw ZXItdmNwdSBydGRzIHNjaGVkdWxlciBwYXJhbWV0ZXJzICovCj4gPiArwqDCoMKgwqDCoMKgwqDC oHJjID0gLXNjaGVkX3ZjcHVfb3V0cHV0KExJQlhMX1NDSEVEVUxFUl9SVERTLAo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBzY2hlZF9ydGRzX3ZjcHVfb3V0cHV0LAo+ID4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2NoZWRfcnRkc19wb29sX291 dHB1dCwKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgY3B1cG9vbCkpCj4gPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg cmV0dXJuIEVYSVRfRkFJTFVSRTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgY3B1cG9vbCk7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoGdvdG8gb3V0Owo+ID4gK8KgwqDCoMKgfSBlbHNlIGlmICghZG9tICYmICFvcHRfYWxs KSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoC8qIGxpc3QgYWxsIGRvbWFpbidzIGRlZmF1bHQgc2No ZWR1bGluZyBwYXJhbWV0ZXJzICovCj4gPiArwqDCoMKgwqDCoMKgwqDCoHJjID0gLXNjaGVkX2Rv bWFpbl9vdXRwdXQoTElCWExfU0NIRURVTEVSX1JURFMsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzY2hlZF9y dGRzX2RvbWFpbl9vdXRwdXQsCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzY2hlZF9ydGRzX3Bvb2xfb3V0cHV0 LAo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgY3B1cG9vbCk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0 Owo+ID4gwqDCoMKgwqDCoH0gZWxzZSB7Cj4gPiDCoMKgwqDCoMKgwqDCoMKgwqB1aW50MzJfdCBk b21pZCA9IGZpbmRfZG9tYWluKGRvbSk7Cj4gPiAtwqDCoMKgwqDCoMKgwqDCoGlmICghb3B0X3Ag JiYgIW9wdF9iKSB7IC8qIG91dHB1dCBydCBzY2hlZHVsZXIgaW5mbyAqLwo+ID4gK8KgwqDCoMKg wqDCoMKgwqBpZiAoIW9wdF92ICYmICFvcHRfYWxsKSB7IC8qIG91dHB1dCBkZWZhdWx0IHNjaGVk dWxpbmcKPiA+IHBhcmFtZXRlcnMgKi8KPiA+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2No ZWRfcnRkc19kb21haW5fb3V0cHV0KC0xKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAoc2NoZWRfcnRkc19kb21haW5fb3V0cHV0KGRvbWlkKSkKPiA+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldHVybiBFWElUX0ZBSUxVUkU7Cj4gPiAtwqDCoMKgwqDCoMKgwqDC oH0gZWxzZSB7IC8qIHNldCBydCBzY2hlZHVsZXIgcGFyYW1hdGVycyAqLwo+ID4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXMgc2NpbmZvOwo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfaW5pdCgmc2Np bmZvKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IC1zY2hlZF9ydGRzX2RvbWFp bl9vdXRwdXQoZG9taWQpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ ID4gK8KgwqDCoMKgwqDCoMKgwqB9IGVsc2UgaWYgKCFvcHRfcCAmJiAhb3B0X2IpIHsKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAvKiBnZXQgcGVyLXZjcHUgcnRkcyBzY2hlZHVsaW5nIHBh cmFtZXRlcnMgKi8KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBsaWJ4bF92Y3B1X3NjaGVk X3BhcmFtcyBzY2luZm87Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbGlieGxfdmNwdV9z Y2hlZF9wYXJhbXNfaW5pdCgmc2NpbmZvKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBz Y2hlZF9ydGRzX3ZjcHVfb3V0cHV0KC0xLCAmc2NpbmZvKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBzY2luZm8ubnVtX3ZjcHVzID0gdl9pbmRleDsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBpZiAodl9pbmRleCA+IDApCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqBzY2luZm8udmNwdXMgPSAobGlieGxfc2NoZWRfcGFyYW1zICopCj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB4bWFs bG9jKHNpemVvZihsaWJ4bF9zY2hlZF9wYXJhbXMpICoKPiA+ICh2X2luZGV4KSk7Cj4gPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IHZfaW5kZXg7IGkrKykKPiA+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNjaW5mby52Y3B1c1tpXS52Y3B1aWQgPSB2 Y3B1c1tpXTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IC1zY2hlZF9ydGRzX3Zj cHVfb3V0cHV0KGRvbWlkLCAmc2NpbmZvKTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBs aWJ4bF92Y3B1X3NjaGVkX3BhcmFtc19kaXNwb3NlKCZzY2luZm8pOwo+ID4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ID4gK8KgwqDCoMKgfSBlbHNlIGlmIChvcHRfdiB8fCBv cHRfYWxsKSB7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgLyogc2V0IHBlci12Y3B1IHJ0 ZHMgc2NoZWR1bGluZyBwYXJhbWV0ZXJzICovCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bGlieGxfdmNwdV9zY2hlZF9wYXJhbXMgc2NpbmZvOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2luaXQoJnNjaW5mbyk7Cj4gPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHNjaW5mby5zY2hlZCA9IExJQlhMX1NDSEVEVUxFUl9SVERTOwo+ID4g LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNjaW5mby5wZXJpb2QgPSBwZXJpb2Q7Cj4gPiAtwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgc2NpbmZvLmJ1ZGdldCA9IGJ1ZGdldDsKPiA+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBpZiAodl9pbmRleCA+IDApIHsKPiA+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHNjaW5mby5udW1fdmNwdXMgPSB2X2luZGV4Owo+ID4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2NpbmZvLnZjcHVzID0gKGxpYnhsX3NjaGVkX3BhcmFt cyAqKQo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgeG1hbGxvYyhzaXplb2YobGlieGxfc2NoZWRfcGFyYW1zKSAqCj4gPiAo dl9pbmRleCkpOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZm9yIChpID0g MDsgaSA8IHZfaW5kZXg7IGkrKykgewo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqBzY2luZm8udmNwdXNbaV0udmNwdWlkID0gdmNwdXNbaV07Cj4gPiArwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNjaW5mby52Y3B1c1tpXS5wZXJpb2Qg PSBwZXJpb2RzW2ldOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBzY2luZm8udmNwdXNbaV0uYnVkZ2V0ID0gYnVkZ2V0c1tpXTsKPiA+ICvCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHJjID0gc2NoZWRfdmNwdV9zZXQoZG9taWQsICZzY2luZm8pOwo+ID4gK8KgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoH0gZWxzZSB7IC8qIHNldCBwYXJhbXMgZm9yIGFsbCB2Y3B1cyAqLwo+ID4gK8Kg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2NpbmZvLm51bV92Y3B1cyA9IDE7Cj4gPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBzY2luZm8udmNwdXMgPSAobGlieGxfc2No ZWRfcGFyYW1zICopCj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB4bWFsbG9jKHNpemVvZihsaWJ4bF9zY2hlZF9wYXJhbXMp KTsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHNjaW5mby52Y3B1c1swXS5w ZXJpb2QgPSBwZXJpb2RzWzBdOwo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg c2NpbmZvLnZjcHVzWzBdLmJ1ZGdldCA9IGJ1ZGdldHNbMF07Cj4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqByYyA9IHNjaGVkX3ZjcHVfc2V0X2FsbChkb21pZCwgJnNjaW5mbyk7 Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfQo+ID4gwqAKPiA+IC3CoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqByYyA9IHNjaGVkX2RvbWFpbl9zZXQoZG9taWQsICZzY2luZm8pOwo+ID4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGxpYnhsX2RvbWFpbl9zY2hlZF9wYXJhbXNfZGlzcG9zZSgm c2NpbmZvKTsKPiA+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAocmMpCj4gPiAtwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXR1cm4gRVhJVF9GQUlMVVJFOwo+ID4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoGxpYnhsX3ZjcHVfc2NoZWRfcGFyYW1zX2Rpc3Bvc2UoJnNjaW5m byk7Cj4gPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKHJjKSB7Cj4gPiArwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByYyA9IC1yYzsKPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoGdvdG8gb3V0Owo+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+ IMKgwqDCoMKgwqDCoMKgwqDCoH0KPiA+IMKgwqDCoMKgwqB9Cj4gPiDCoAo+ID4gLcKgwqDCoMKg cmV0dXJuIEVYSVRfU1VDQ0VTUzsKPiA+ICvCoMKgwqDCoHJjID0gRVhJVF9TVUNDRVNTOwo+ID4g K291dDoKPiA+ICvCoMKgwqDCoGZyZWUodmNwdXMpOwo+ID4gK8KgwqDCoMKgZnJlZShwZXJpb2Rz KTsKPiA+ICvCoMKgwqDCoGZyZWUoYnVkZ2V0cyk7Cj4gPiArwqDCoMKgwqByZXR1cm4gcmM7Cj4g PiDCoH0KPiA+Cj4gU28sIHRoZSBsb2dpYyBoZXJlIGlzIHJlYWxseSBjb21wbGV4LCBidXQgSSB0 aGluayBpdCdzIGNvcnJlY3QuIFRoZQo+IG9ubHkgcHJvYmxlbSBJIHNwb3QgaXMgdGhlIGZ1bmN0 aW9uIHJldHVybiB2YWx1ZSAod2hpY2ggaXMgYW4gYWN0dWFsCj4gZXhpdCBjb2RlIGZvciB4bCwg c2luY2UgdGhpcyBpcyBhIG1haW5fYmxhKCkga2luZCBvZiBmdW5jdGlvbikuCj4gCj4gVGhlIGZ1 bmN0aW9uIHNob3VsZCByZXR1cm4gZWl0aGVyIEVYSVRfU1VDQ0VTUyBvciBFWElUX0ZBSUxVUkUu Cj4gCj4gV2l0aCB5b3VyIGNoYW5nZXMsIEkgdGhpbmsgdGhlcmUgYXJlIGNoYW5jZXMgZm9yIHRo aXMgdG8gbm90IGJlIHRoZQo+IGNhc2UsIGUuZy46Cj4gCj4gK8KgwqDCoCB9IGVsc2UgaWYgKCFk b20gJiYgIW9wdF9hbGwpIHsKPiArwqDCoMKgwqDCoMKgwqAgLyogbGlzdCBhbGwgZG9tYWluJ3Mg ZGVmYXVsdCBzY2hlZHVsaW5nIHBhcmFtZXRlcnMgKi8KPiArwqDCoMKgwqDCoMKgwqAgcmMgPSAt c2NoZWRfZG9tYWluX291dHB1dChMSUJYTF9TQ0hFRFVMRVJfUlREUywKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNj aGVkX3J0ZHNfZG9tYWluX291dHB1dCwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNjaGVkX3J0ZHNfcG9vbF9vdXRw dXQsCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBjcHVwb29sKTsKPiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7Cj4g Cj4gQW0gSSByaWdodD8KPiAKPiBJTU8sIHRoaXMgc2hvdWxkIGJlIGZpeGVkLCB0byBwcmV2ZW50 IGV2ZW4gbW9yZSBpbmNvbnNpc3RlbmN5IGluIHhsCj4gdGhhbiB3aGF0IHdlIGhhdmUgYWxyZWFk eSBvbiB0aGlzIGZyb250Cj4gCgpZZXMsIHRoaXMgbmVlZHMgZml4aW5nLCB0b28uCgpDaG9uZywg d2hlbiB5b3UgZmluaXNoIHlvdXIgbmV3IHNlcmllcywgY2FuIHlvdSBhbHNvIHByb3ZpZGUgYSBn aXQKYnJhbmNoIGZvciBpdC4gVGhhbmtzLgoKV2VpLgoKPiBBIG1pbm9yIHRoaW5nLCB3aGlsZSB5 b3UncmUgdGhlcmUsIGRvbid0IHVzZSBhIHZhcmlhYmxlIGNhbGxlZCByYyBmb3IKPiB0aGlzICgn cmV0JyBvciAncicgd291bGQgYmUgYSBiZXR0ZXIgZml0IHdpdGggdGhpcyBjb21wb25lbnQncyBj b2RpbmcKPiBzdHlsZSkuCj4gCj4gU29ycnkgYWdhaW4gZm9yIHRoZSBkZWxheSByZXBseWluZyB0 byB0aGlzLgo+IAo+IFJlZ2FyZHMsCj4gRGFyaW8KPiAtLSAKPiA8PFRoaXMgaGFwcGVucyBiZWNh dXNlIEkgY2hvb3NlIGl0IHRvIGhhcHBlbiE+PiAoUmFpc3RsaW4gTWFqZXJlKQo+IC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t Cj4gRGFyaW8gRmFnZ2lvbGksIFBoLkQsIGh0dHA6Ly9hYm91dC5tZS9kYXJpby5mYWdnaW9saQo+ IFNlbmlvciBTb2Z0d2FyZSBFbmdpbmVlciwgQ2l0cml4IFN5c3RlbXMgUiZEIEx0ZC4sIENhbWJy aWRnZSAoVUspCj4gCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fClhlbi1kZXZlbCBtYWlsaW5nIGxpc3QKWGVuLWRldmVsQGxpc3RzLnhlbi5vcmcKaHR0 cDovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==