From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ian Campbell Subject: Re: [PATCH v5] x86/p2m: use large pages for MMIO mappings Date: Mon, 25 Jan 2016 17:18:33 +0000 Message-ID: <1453742313.4320.209.camel@citrix.com> References: <56A25C0602000078000CA367@prv-mh.provo.novell.com> <1453724207.4320.137.camel@citrix.com> <56A6371802000078000CAA6B@prv-mh.provo.novell.com> <1453730752.4320.164.camel@citrix.com> <56A63C4002000078000CAAA7@prv-mh.provo.novell.com> <1453731704.4320.173.camel@citrix.com> <56A658FE02000078000CAC3D@prv-mh.provo.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aNkms-0000v1-Nh for xen-devel@lists.xenproject.org; Mon, 25 Jan 2016 17:18:47 +0000 In-Reply-To: <56A658FE02000078000CAC3D@prv-mh.provo.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich , xen-devel Cc: Kevin Tian , Wei Liu , Stefano Stabellini , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Jun Nakajima , Keir Fraser List-Id: xen-devel@lists.xenproject.org T24gTW9uLCAyMDE2LTAxLTI1IGF0IDA5OjE4IC0wNzAwLCBKYW4gQmV1bGljaCB3cm90ZToKPiBX aGVuIG1hcHBpbmcgbGFyZ2UgQkFScyAoZS5nLiB0aGUgZnJhbWUgYnVmZmVyIG9mIGEgZ3JhcGhp Y3MgY2FyZCkgdGhlCj4gb3ZlcmhlYWQgb2YgZXN0YWJsaXNoaW5nIHN1Y2ggbWFwcGluZ3MgdXNp bmcgb25seSA0ayBwYWdlcyBoYXMsCj4gcGFydGljdWxhcmx5IGFmdGVyIHRoZSBYU0EtMTI1IGZp eCwgYmVjb21lIHVuYWNjZXB0YWJsZS4gQWx0ZXIgdGhlCj4gWEVOX0RPTUNUTF9tZW1vcnlfbWFw cGluZyBzZW1hbnRpY3Mgb25jZSBhZ2Fpbiwgc28gdGhhdCB0aGVyZSdzIG5vCj4gbG9uZ2VyIGEg Zml4ZWQgYW1vdW50IG9mIGd1ZXN0IGZyYW1lcyB0aGF0IHJlcHJlc2VudHMgdGhlIHVwcGVyIGxp bWl0Cj4gb2Ygd2hhdCBhIHNpbmdsZSBpbnZvY2F0aW9uIGNhbiBtYXAuIEluc3RlYWQgYm91bmQg ZXhlY3V0aW9uIHRpbWUgYnkKPiBsaW1pdGluZyB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgKHJl Z2FyZGxlc3Mgb2YgcGFnZSBzaXplKS4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBKYW4gQmV1bGljaCA8 amJldWxpY2hAc3VzZS5jb20+CgpUb29scyBhbmQgZG9tY3RsIEFQSSBzaWRlOgoKQWNrZWQtYnk6 IElhbiBDYW1wYmVsbCA8aWFuLmNhbXBiZWxsQGNpdHJpeC5jb20+Cgo+IC0tLQo+IE9wZW4gaXNz dWVzIChwZXJoYXBzIGZvciBzdWJzZXF1ZW50IGNoYW5nZXMpOgo+IC0gQVJNIHNpZGUgdW5pbXBs ZW1lbnRlZCAoYW5kIGhlbmNlIGxpYnhjIGZvciBub3cgbWFkZSBjb3BlIHdpdGggYm90aAo+IMKg IG1vZGVscyksIHRoZSBtYWluIGlzc3VlIChiZXNpZGVzIG15IGluYWJpbGl0eSB0byB0ZXN0IGFu eSBjaGFuZ2UKPiDCoCB0aGVyZSkgYmVpbmcgdGhlIG1hbnkgaW50ZXJuYWwgdXNlcyBvZiBtYXBf bW1pb19yZWdpb25zKCkpCj4gLSBpb21tdV97LHVufW1hcF9wYWdlKCkgaW50ZXJmYWNlcyBkb24n dCBzdXBwb3J0ICJvcmRlciIgKGhlbmNlCj4gwqAgbW1pb19vcmRlcigpIGZvciBub3cgcmV0dXJu cyB6ZXJvIHdoZW4gIWlvbW11X2hhcF9wdF9zaGFyZSwgd2hpY2ggaW4KPiDCoCBwYXJ0aWN1bGFy IG1lYW5zIHRoZSBBTUQgc2lkZSBpc24ndCBiZWluZyB0YWtlbiBjYXJlIG9mIGp1c3QgeWV0LCBi dXQKPiDCoCBub3RlIHRoYXQgdGhpcyBhbHNvIGhhcyB0aGUgaW50ZW5kZWQgZWZmZWN0IG9mIHN1 cHByZXNzaW5nIG5vbi16ZXJvCj4gwqAgb3JkZXIgbWFwcGluZ3MgaW4gdGhlIHNoYWRvdyBtb2Rl IGNhc2UpCj4gLS0tCj4gdjU6IFJlZmluZSBjb21tZW50IGluIGRvbWN0bC5oLgo+IHY0OiBNb3Zl IGNsZWFudXAgZHV0eSBlbnRpcmVseSB0byB0aGUgY2FsbGVyIG9mIHRoZSBoeXBlcmNhbGwuIE1v dmUKPiDCoMKgwqDCoHJldHVybiB2YWx1ZSBkZXNjcmlwdGlvbiB0byBmcm9tIGNvbW1pdCBtZXNz YWdlIHRvIGRvbWN0bC5oLgo+IHYzOiBSZS1iYXNlIG9uIHRvcCBvZiAieDg2L2h2bTogZm9sZCBv cHRfaGFwX3sybWIsMWdifSBpbnRvCj4gwqDCoMKgwqBoYXBfY2FwYWJpbGl0aWVzIi4gRXh0ZW5k IGRlc2NyaXB0aW9uIHRvIHNwZWxsIG91dCBuZXcgcmV0dXJuIHZhbHVlCj4gwqDCoMKgwqBtZWFu aW5nLiBBZGQgYSBjb3VwbGUgb2YgY29kZSBjb21tZW50cy4gVXNlIFBBR0VfT1JERVJfNEsgaW5z dGVhZAo+IMKgwqDCoMKgb2YgbGl0ZXJhbCAwLiBUYWtlIGludG8gY29uc2lkZXJhdGlvbiByL28g TU1JTyBwYWdlcy4KPiB2MjogUHJvZHVjZSB2YWxpZCBlbnRyaWVzIGZvciBsYXJnZSBwMm1fbW1p b19kaXJlY3QgbWFwcGluZ3MgaW4KPiDCoMKgwqDCoHAybV9wdF9zZXRfZW50cnkoKS4gRG9uJ3Qg b3BlbiBjb2RlIGlvbW11X3VzZV9oYXBfcHQoKSBpbgo+IMKgwqDCoMKgbW1pb19vcmRlcigpLiBV cGRhdGUgZnVuY3Rpb24gY29tbWVudCBvZiBzZXRfdHlwZWRfcDJtX2VudHJ5KCkgYW5kCj4gwqDC oMKgwqBjbGVhcl9tbWlvX3AybV9lbnRyeSgpLiBVc2UgUFJJX21mbi4gQWRkIEFTU0VSVCgpcyB0 bwo+IMKgwqDCoMKgeyx1bn1tYXBfbW1pb19yZWdpb25zKCkgdG8gZGV0ZWN0IG90aGVyd2lzZSBl bmRsZXNzIGxvb3BzLgo+IAo+IC0tLSBhL3Rvb2xzL2xpYnhjL3hjX2RvbWFpbi5jCj4gKysrIGIv dG9vbHMvbGlieGMveGNfZG9tYWluLmMKPiBAQCAtMjE3NCw3ICsyMTc0LDcgQEAgaW50IHhjX2Rv bWFpbl9tZW1vcnlfbWFwcGluZygKPiDCoHsKPiDCoMKgwqDCoMKgREVDTEFSRV9ET01DVEw7Cj4g wqDCoMKgwqDCoHhjX2RvbWluZm9fdCBpbmZvOwo+IC3CoMKgwqDCoGludCByZXQgPSAwLCBlcnI7 Cj4gK8KgwqDCoMKgaW50IHJldCA9IDAsIHJjOwo+IMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGRv bmUgPSAwLCBuciwgbWF4X2JhdGNoX3N6Owo+IMKgCj4gwqDCoMKgwqDCoGlmICggeGNfZG9tYWlu X2dldGluZm8oeGNoLCBkb21pZCwgMSwgJmluZm8pICE9IDEgfHwKPiBAQCAtMjE5OSwxOSArMjE5 OSwyNCBAQCBpbnQgeGNfZG9tYWluX21lbW9yeV9tYXBwaW5nKAo+IMKgwqDCoMKgwqDCoMKgwqDC oGRvbWN0bC51Lm1lbW9yeV9tYXBwaW5nLm5yX21mbnMgPSBucjsKPiDCoMKgwqDCoMKgwqDCoMKg wqBkb21jdGwudS5tZW1vcnlfbWFwcGluZy5maXJzdF9nZm4gPSBmaXJzdF9nZm4gKyBkb25lOwo+ IMKgwqDCoMKgwqDCoMKgwqDCoGRvbWN0bC51Lm1lbW9yeV9tYXBwaW5nLmZpcnN0X21mbiA9IGZp cnN0X21mbiArIGRvbmU7Cj4gLcKgwqDCoMKgwqDCoMKgwqBlcnIgPSBkb19kb21jdGwoeGNoLCAm ZG9tY3RsKTsKPiAtwqDCoMKgwqDCoMKgwqDCoGlmICggZXJyICYmIGVycm5vID09IEUyQklHICkK PiArwqDCoMKgwqDCoMKgwqDCoHJjID0gZG9fZG9tY3RsKHhjaCwgJmRvbWN0bCk7Cj4gK8KgwqDC oMKgwqDCoMKgwqBpZiAoIHJjIDwgMCAmJiBlcnJubyA9PSBFMkJJRyApCj4gwqDCoMKgwqDCoMKg wqDCoMKgewo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCBtYXhfYmF0Y2hfc3ogPD0g MSApCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgbWF4X2JhdGNoX3N6ID4+PSAxOwo+IMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgY29udGludWU7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKgwqDC oMKgaWYgKCByYyA+IDAgKQo+ICvCoMKgwqDCoMKgwqDCoMKgewo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBkb25lICs9IHJjOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBjb250aW51ZTsK PiArwqDCoMKgwqDCoMKgwqDCoH0KPiDCoMKgwqDCoMKgwqDCoMKgwqAvKiBTYXZlIHRoZSBmaXJz dCBlcnJvci4uLiAqLwo+IMKgwqDCoMKgwqDCoMKgwqDCoGlmICggIXJldCApCj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHJldCA9IGVycjsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0 ID0gcmM7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgLyogLi4gYW5kIGlnbm9yZSB0aGUgcmVzdCBvZiB0 aGVtIHdoZW4gcmVtb3ZpbmcuICovCj4gLcKgwqDCoMKgwqDCoMKgwqBpZiAoIGVyciAmJiBhZGRf bWFwcGluZyAhPSBEUENJX1JFTU9WRV9NQVBQSU5HICkKPiArwqDCoMKgwqDCoMKgwqDCoGlmICgg cmMgJiYgYWRkX21hcHBpbmcgIT0gRFBDSV9SRU1PVkVfTUFQUElORyApCj4gwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqBicmVhazsKPiDCoAo+IMKgwqDCoMKgwqDCoMKgwqDCoGRvbmUgKz0gbnI7 Cj4gLS0tIGEveGVuL2FyY2gveDg2L2RvbWFpbl9idWlsZC5jCj4gKysrIGIveGVuL2FyY2gveDg2 L2RvbWFpbl9idWlsZC5jCj4gQEAgLTQzNiw3ICs0MzYsOCBAQCBzdGF0aWMgX19pbml0IHZvaWQg cHZoX2FkZF9tZW1fbWFwcGluZyhzCj4gwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+IMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgYSA9IHAybV9hY2Nlc3Nfcnc7Cj4gwqAKPiAtwqDCoMKgwqDCoMKg wqDCoGlmICggKHJjID0gc2V0X21taW9fcDJtX2VudHJ5KGQsIGdmbiArIGksIF9tZm4obWZuICsg aSksIGEpKSApCj4gK8KgwqDCoMKgwqDCoMKgwqBpZiAoIChyYyA9IHNldF9tbWlvX3AybV9lbnRy eShkLCBnZm4gKyBpLCBfbWZuKG1mbiArIGkpLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgUEFHRV9P UkRFUl80SywgYSkpICkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHBhbmljKCJwdmhfYWRk X21lbV9tYXBwaW5nOiBnZm46JWx4IG1mbjolbHggaTolbGQgcmM6JWRcbiIsCj4gwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBnZm4sIG1mbiwgaSwgcmMpOwo+IMKgwqDCoMKg wqDCoMKgwqDCoGlmICggIShpICYgMHhmZmZmZikgKQo+IC0tLSBhL3hlbi9hcmNoL3g4Ni9odm0v dm14L3ZteC5jCj4gKysrIGIveGVuL2FyY2gveDg2L2h2bS92bXgvdm14LmMKPiBAQCAtMjQ5MSw3 ICsyNDkxLDcgQEAgc3RhdGljIGludCB2bXhfYWxsb2NfdmxhcGljX21hcHBpbmcoc3RydQo+IMKg wqDCoMKgwqBzaGFyZV94ZW5fcGFnZV93aXRoX2d1ZXN0KHBnLCBkLCBYRU5TSEFSRV93cml0YWJs ZSk7Cj4gwqDCoMKgwqDCoGQtPmFyY2guaHZtX2RvbWFpbi52bXguYXBpY19hY2Nlc3NfbWZuID0g bWZuOwo+IMKgwqDCoMKgwqBzZXRfbW1pb19wMm1fZW50cnkoZCwgcGFkZHJfdG9fcGZuKEFQSUNf REVGQVVMVF9QSFlTX0JBU0UpLAo+IF9tZm4obWZuKSwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAybV9nZXRfaG9zdHAybShkKS0+ZGVmYXVsdF9hY2Nl c3MpOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgUEFH RV9PUkRFUl80SywgcDJtX2dldF9ob3N0cDJtKGQpLQo+ID5kZWZhdWx0X2FjY2Vzcyk7Cj4gwqAK PiDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gwqB9Cj4gLS0tIGEveGVuL2FyY2gveDg2L21tL3AybS5j Cj4gKysrIGIveGVuL2FyY2gveDg2L21tL3AybS5jCj4gQEAgLTg5OSw0OCArODk5LDYyIEBAIHZv aWQgcDJtX2NoYW5nZV90eXBlX3JhbmdlKHN0cnVjdCBkb21haW4KPiDCoMKgwqDCoMKgcDJtX3Vu bG9jayhwMm0pOwo+IMKgfQo+IMKgCj4gLS8qIFJldHVybnM6IDAgZm9yIHN1Y2Nlc3MsIC1lcnJu byBmb3IgZmFpbHVyZSAqLwo+ICsvKgo+ICsgKiBSZXR1cm5zOgo+ICsgKsKgwqDCoMKgMMKgwqDC oMKgwqDCoMKgwqBmb3Igc3VjY2Vzcwo+ICsgKsKgwqDCoMKgLWVycm5vwqDCoMKgZm9yIGZhaWx1 cmUKPiArICrCoMKgwqDCoG9yZGVyKzHCoMKgZm9yIGNhbGxlciB0byByZXRyeSB3aXRoIG9yZGVy IChndWFyYW50ZWVkIHNtYWxsZXIgdGhhbgo+ICsgKsKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg dGhlIG9yZGVyIHZhbHVlIHBhc3NlZCBpbikKPiArICovCj4gwqBzdGF0aWMgaW50IHNldF90eXBl ZF9wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBnZm4sCj4gbWZuX3Qg bWZuLAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHAybV90eXBlX3QgZ2ZuX3AybXQsIHAybV9hY2Nlc3NfdCBhY2Nlc3MpCj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgdW5zaWduZWQgaW50IG9yZGVyLCBwMm1fdHlwZV90IGdmbl9wMm10LAo+ICvCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAy bV9hY2Nlc3NfdCBhY2Nlc3MpCj4gwqB7Cj4gwqDCoMKgwqDCoGludCByYyA9IDA7Cj4gwqDCoMKg wqDCoHAybV9hY2Nlc3NfdCBhOwo+IMKgwqDCoMKgwqBwMm1fdHlwZV90IG90Owo+IMKgwqDCoMKg wqBtZm5fdCBvbWZuOwo+ICvCoMKgwqDCoHVuc2lnbmVkIGludCBjdXJfb3JkZXIgPSAwOwo+IMKg wqDCoMKgwqBzdHJ1Y3QgcDJtX2RvbWFpbiAqcDJtID0gcDJtX2dldF9ob3N0cDJtKGQpOwo+IMKg Cj4gwqDCoMKgwqDCoGlmICggIXBhZ2luZ19tb2RlX3RyYW5zbGF0ZShkKSApCj4gwqDCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIC1FSU87Cj4gwqAKPiAtwqDCoMKgwqBnZm5fbG9jayhwMm0sIGdmbiwg MCk7Cj4gLcKgwqDCoMKgb21mbiA9IHAybS0+Z2V0X2VudHJ5KHAybSwgZ2ZuLCAmb3QsICZhLCAw LCBOVUxMLCBOVUxMKTsKPiArwqDCoMKgwqBnZm5fbG9jayhwMm0sIGdmbiwgb3JkZXIpOwo+ICvC oMKgwqDCoG9tZm4gPSBwMm0tPmdldF9lbnRyeShwMm0sIGdmbiwgJm90LCAmYSwgMCwgJmN1cl9v cmRlciwgTlVMTCk7Cj4gK8KgwqDCoMKgaWYgKCBjdXJfb3JkZXIgPCBvcmRlciApCj4gK8KgwqDC oMKgewo+ICvCoMKgwqDCoMKgwqDCoMKgZ2ZuX3VubG9jayhwMm0sIGdmbiwgb3JkZXIpOwo+ICvC oMKgwqDCoMKgwqDCoMKgcmV0dXJuIGN1cl9vcmRlciArIDE7Cj4gK8KgwqDCoMKgfQo+IMKgwqDC oMKgwqBpZiAoIHAybV9pc19ncmFudChvdCkgfHwgcDJtX2lzX2ZvcmVpZ24ob3QpICkKPiDCoMKg wqDCoMKgewo+IC3CoMKgwqDCoMKgwqDCoMKgZ2ZuX3VubG9jayhwMm0sIGdmbiwgMCk7Cj4gK8Kg wqDCoMKgwqDCoMKgwqBnZm5fdW5sb2NrKHAybSwgZ2ZuLCBvcmRlcik7Cj4gwqDCoMKgwqDCoMKg wqDCoMKgZG9tYWluX2NyYXNoKGQpOwo+IMKgwqDCoMKgwqDCoMKgwqDCoHJldHVybiAtRU5PRU5U Owo+IMKgwqDCoMKgwqB9Cj4gwqDCoMKgwqDCoGVsc2UgaWYgKCBwMm1faXNfcmFtKG90KSApCj4g wqDCoMKgwqDCoHsKPiArwqDCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgaTsKPiArCj4gwqDC oMKgwqDCoMKgwqDCoMKgQVNTRVJUKG1mbl92YWxpZChvbWZuKSk7Cj4gLcKgwqDCoMKgwqDCoMKg wqBzZXRfZ3Bmbl9mcm9tX21mbihtZm5feChvbWZuKSwgSU5WQUxJRF9NMlBfRU5UUlkpOwo+ICvC oMKgwqDCoMKgwqDCoMKgZm9yICggaSA9IDA7IGkgPCAoMVVMIDw8IG9yZGVyKTsgKytpICkKPiAr wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgc2V0X2dwZm5fZnJvbV9tZm4obWZuX3gob21mbikgKyBp LCBJTlZBTElEX00yUF9FTlRSWSk7Cj4gwqDCoMKgwqDCoH0KPiDCoAo+IMKgwqDCoMKgwqBQMk1f REVCVUcoInNldCAlZCAlbHggJWx4XG4iLCBnZm5fcDJtdCwgZ2ZuLCBtZm5feChtZm4pKTsKPiAt wqDCoMKgwqByYyA9IHAybV9zZXRfZW50cnkocDJtLCBnZm4sIG1mbiwgUEFHRV9PUkRFUl80Sywg Z2ZuX3AybXQsCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBhY2Nlc3MpOwo+ICvCoMKgwqDCoHJjID0gcDJtX3NldF9lbnRyeShwMm0sIGdmbiwgbWZuLCBv cmRlciwgZ2ZuX3AybXQsIGFjY2Vzcyk7Cj4gwqDCoMKgwqDCoGlmICggcmMgKQo+IC3CoMKgwqDC oMKgwqDCoMKgZ2RwcmludGsoWEVOTE9HX0VSUiwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCJwMm1fc2V0X2VudHJ5IGZhaWxlZCEgbWZuPSUwOGx4IHJjOiVkXG4iLAo+IC3C oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWZuX3goZ2V0X2dmbl9xdWVyeV91bmxv Y2tlZChwMm0tPmRvbWFpbiwgZ2ZuLCAmb3QpKSwKPiByYyk7Cj4gK8KgwqDCoMKgwqDCoMKgwqBn ZHByaW50ayhYRU5MT0dfRVJSLCAicDJtX3NldF9lbnRyeTogJSNseDoldSAtPiAlZAo+ICgweCUi UFJJX21mbiIpXG4iLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZ2ZuLCBv cmRlciwgcmMsIG1mbl94KG1mbikpOwo+IMKgwqDCoMKgwqBlbHNlIGlmICggcDJtX2lzX3BvZChv dCkgKQo+IMKgwqDCoMKgwqB7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgcG9kX2xvY2socDJtKTsKPiAt wqDCoMKgwqDCoMKgwqDCoHAybS0+cG9kLmVudHJ5X2NvdW50LS07Cj4gK8KgwqDCoMKgwqDCoMKg wqBwMm0tPnBvZC5lbnRyeV9jb3VudCAtPSAxVUwgPDwgb3JkZXI7Cj4gwqDCoMKgwqDCoMKgwqDC oMKgQlVHX09OKHAybS0+cG9kLmVudHJ5X2NvdW50IDwgMCk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKg cG9kX3VubG9jayhwMm0pOwo+IMKgwqDCoMKgwqB9Cj4gLcKgwqDCoMKgZ2ZuX3VubG9jayhwMm0s IGdmbiwgMCk7Cj4gK8KgwqDCoMKgZ2ZuX3VubG9jayhwMm0sIGdmbiwgb3JkZXIpOwo+IMKgCj4g wqDCoMKgwqDCoHJldHVybiByYzsKPiDCoH0KPiBAQCAtOTQ5LDE0ICs5NjMsMjEgQEAgc3RhdGlj IGludCBzZXRfdHlwZWRfcDJtX2VudHJ5KHN0cnVjdCBkbwo+IMKgc3RhdGljIGludCBzZXRfZm9y ZWlnbl9wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBnZm4sCj4gwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqBtZm5fdCBtZm4pCj4gwqB7Cj4gLcKgwqDCoMKgcmV0dXJuIHNldF90eXBlZF9wMm1f ZW50cnkoZCwgZ2ZuLCBtZm4sIHAybV9tYXBfZm9yZWlnbiwKPiArwqDCoMKgwqByZXR1cm4gc2V0 X3R5cGVkX3AybV9lbnRyeShkLCBnZm4sIG1mbiwgUEFHRV9PUkRFUl80SywKPiBwMm1fbWFwX2Zv cmVpZ24sCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoHAybV9nZXRfaG9zdHAybShkKS0+ZGVmYXVsdF9hY2Nlc3MpOwo+IMKg fQo+IMKgCj4gwqBpbnQgc2V0X21taW9fcDJtX2VudHJ5KHN0cnVjdCBkb21haW4gKmQsIHVuc2ln bmVkIGxvbmcgZ2ZuLCBtZm5fdCBtZm4sCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqBwMm1fYWNjZXNzX3QgYWNjZXNzKQo+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgaW50IG9yZGVyLCBwMm1fYWNj ZXNzX3QgYWNjZXNzKQo+IMKgewo+IC3CoMKgwqDCoHJldHVybiBzZXRfdHlwZWRfcDJtX2VudHJ5 KGQsIGdmbiwgbWZuLCBwMm1fbW1pb19kaXJlY3QsIGFjY2Vzcyk7Cj4gK8KgwqDCoMKgaWYgKCBv cmRlciAmJgo+ICvCoMKgwqDCoMKgwqDCoMKgwqByYW5nZXNldF9vdmVybGFwc19yYW5nZShtbWlv X3JvX3JhbmdlcywgbWZuX3gobWZuKSwKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWZuX3gobWZuKSArICgxVUwgPDwg b3JkZXIpIC0gMSkgJiYKPiArwqDCoMKgwqDCoMKgwqDCoMKgIXJhbmdlc2V0X2NvbnRhaW5zX3Jh bmdlKG1taW9fcm9fcmFuZ2VzLCBtZm5feChtZm4pLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoG1mbl94KG1mbikg KyAoMVVMIDw8IG9yZGVyKSAtIDEpICkKPiArwqDCoMKgwqDCoMKgwqDCoHJldHVybiBvcmRlcjsK PiArCj4gK8KgwqDCoMKgcmV0dXJuIHNldF90eXBlZF9wMm1fZW50cnkoZCwgZ2ZuLCBtZm4sIG9y ZGVyLCBwMm1fbW1pb19kaXJlY3QsCj4gYWNjZXNzKTsKPiDCoH0KPiDCoAo+IMKgaW50IHNldF9p ZGVudGl0eV9wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBnZm4sCj4g QEAgLTEwMDksMjAgKzEwMzAsMzMgQEAgaW50IHNldF9pZGVudGl0eV9wMm1fZW50cnkoc3RydWN0 IGRvbWFpbgo+IMKgwqDCoMKgwqByZXR1cm4gcmV0Owo+IMKgfQo+IMKgCj4gLS8qIFJldHVybnM6 IDAgZm9yIHN1Y2Nlc3MsIC1lcnJubyBmb3IgZmFpbHVyZSAqLwo+IC1pbnQgY2xlYXJfbW1pb19w Mm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBnZm4sIG1mbl90IG1mbikK PiArLyoKPiArICogUmV0dXJuczoKPiArICrCoMKgwqDCoDDCoMKgwqDCoMKgwqDCoMKgZm9yIHN1 Y2Nlc3MKPiArICrCoMKgwqDCoC1lcnJub8KgwqDCoGZvciBmYWlsdXJlCj4gKyAqwqDCoMKgwqBv cmRlcisxwqDCoGZvciBjYWxsZXIgdG8gcmV0cnkgd2l0aCBvcmRlciAoZ3VhcmFudGVlZCBzbWFs bGVyIHRoYW4KPiArICrCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHRoZSBvcmRlciB2YWx1ZSBw YXNzZWQgaW4pCj4gKyAqLwo+ICtpbnQgY2xlYXJfbW1pb19wMm1fZW50cnkoc3RydWN0IGRvbWFp biAqZCwgdW5zaWduZWQgbG9uZyBnZm4sIG1mbl90IG1mbiwKPiArwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBpbnQgb3JkZXIpCj4gwqB7 Cj4gwqDCoMKgwqDCoGludCByYyA9IC1FSU5WQUw7Cj4gwqDCoMKgwqDCoG1mbl90IGFjdHVhbF9t Zm47Cj4gwqDCoMKgwqDCoHAybV9hY2Nlc3NfdCBhOwo+IMKgwqDCoMKgwqBwMm1fdHlwZV90IHQ7 Cj4gK8KgwqDCoMKgdW5zaWduZWQgaW50IGN1cl9vcmRlciA9IDA7Cj4gwqDCoMKgwqDCoHN0cnVj dCBwMm1fZG9tYWluICpwMm0gPSBwMm1fZ2V0X2hvc3RwMm0oZCk7Cj4gwqAKPiDCoMKgwqDCoMKg aWYgKCAhcGFnaW5nX21vZGVfdHJhbnNsYXRlKGQpICkKPiDCoMKgwqDCoMKgwqDCoMKgwqByZXR1 cm4gLUVJTzsKPiDCoAo+IC3CoMKgwqDCoGdmbl9sb2NrKHAybSwgZ2ZuLCAwKTsKPiAtwqDCoMKg wqBhY3R1YWxfbWZuID0gcDJtLT5nZXRfZW50cnkocDJtLCBnZm4sICZ0LCAmYSwgMCwgTlVMTCwg TlVMTCk7Cj4gK8KgwqDCoMKgZ2ZuX2xvY2socDJtLCBnZm4sIG9yZGVyKTsKPiArwqDCoMKgwqBh Y3R1YWxfbWZuID0gcDJtLT5nZXRfZW50cnkocDJtLCBnZm4sICZ0LCAmYSwgMCwgJmN1cl9vcmRl ciwgTlVMTCk7Cj4gK8KgwqDCoMKgaWYgKCBjdXJfb3JkZXIgPCBvcmRlciApCj4gK8KgwqDCoMKg ewo+ICvCoMKgwqDCoMKgwqDCoMKgcmMgPSBjdXJfb3JkZXIgKyAxOwo+ICvCoMKgwqDCoMKgwqDC oMKgZ290byBvdXQ7Cj4gK8KgwqDCoMKgfQo+IMKgCj4gwqDCoMKgwqDCoC8qIERvIG5vdCB1c2Ug bWZuX3ZhbGlkKCkgaGVyZSBhcyBpdCB3aWxsIHVzdWFsbHkgZmFpbCBmb3IgTU1JTwo+IHBhZ2Vz LiAqLwo+IMKgwqDCoMKgwqBpZiAoIChJTlZBTElEX01GTiA9PSBtZm5feChhY3R1YWxfbWZuKSkg fHwgKHQgIT0gcDJtX21taW9fZGlyZWN0KSApCj4gQEAgLTEwMzUsMTEgKzEwNjksMTEgQEAgaW50 IGNsZWFyX21taW9fcDJtX2VudHJ5KHN0cnVjdCBkb21haW4gKgo+IMKgwqDCoMKgwqDCoMKgwqDC oGdkcHJpbnRrKFhFTkxPR19XQVJOSU5HLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCJubyBtYXBwaW5nIGJldHdlZW4gbWZuICUwOGx4IGFuZCBnZm4gJTA4bHhcbiIsCj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgbWZuX3gobWZuKSwgZ2ZuKTsKPiAt wqDCoMKgwqByYyA9IHAybV9zZXRfZW50cnkocDJtLCBnZm4sIF9tZm4oSU5WQUxJRF9NRk4pLCBQ QUdFX09SREVSXzRLLAo+IHAybV9pbnZhbGlkLAo+ICvCoMKgwqDCoHJjID0gcDJtX3NldF9lbnRy eShwMm0sIGdmbiwgX21mbihJTlZBTElEX01GTiksIG9yZGVyLCBwMm1faW52YWxpZCwKPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwMm0tPmRlZmF1bHRf YWNjZXNzKTsKPiDCoAo+IMKgIG91dDoKPiAtwqDCoMKgwqBnZm5fdW5sb2NrKHAybSwgZ2ZuLCAw KTsKPiArwqDCoMKgwqBnZm5fdW5sb2NrKHAybSwgZ2ZuLCBvcmRlcik7Cj4gwqAKPiDCoMKgwqDC oMKgcmV0dXJuIHJjOwo+IMKgfQo+IEBAIC0yMDk1LDYgKzIxMjksMjUgQEAgdm9pZCAqbWFwX2Rv bWFpbl9nZm4oc3RydWN0IHAybV9kb21haW4gKgo+IMKgwqDCoMKgwqByZXR1cm4gbWFwX2RvbWFp bl9wYWdlKCptZm4pOwo+IMKgfQo+IMKgCj4gK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1pb19vcmRl cihjb25zdCBzdHJ1Y3QgZG9tYWluICpkLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgc3RhcnRfZm4s IHVuc2lnbmVkIGxvbmcgbnIpCj4gK3sKPiArwqDCoMKgwqBpZiAoICFuZWVkX2lvbW11KGQpIHx8 ICFpb21tdV91c2VfaGFwX3B0KGQpIHx8Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoChzdGFydF9mbiAm ICgoMVVMIDw8IFBBR0VfT1JERVJfMk0pIC0gMSkpIHx8ICEobnIgPj4KPiBQQUdFX09SREVSXzJN KSApCj4gK8KgwqDCoMKgwqDCoMKgwqByZXR1cm4gMDsKPiArCj4gK8KgwqDCoMKgaWYgKCAhKHN0 YXJ0X2ZuICYgKCgxVUwgPDwgUEFHRV9PUkRFUl8xRykgLSAxKSkgJiYgKG5yID4+Cj4gUEFHRV9P UkRFUl8xRykgJiYKPiArwqDCoMKgwqDCoMKgwqDCoMKgaGFwX2hhc18xZ2IgKQo+ICvCoMKgwqDC oMKgwqDCoMKgcmV0dXJuIFBBR0VfT1JERVJfMUc7Cj4gKwo+ICvCoMKgwqDCoGlmICggaGFwX2hh c18ybWIgKQo+ICvCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIFBBR0VfT1JERVJfMk07Cj4gKwo+ICvC oMKgwqDCoHJldHVybiAwOwo+ICt9Cj4gKwo+ICsjZGVmaW5lIE1BUF9NTUlPX01BWF9JVEVSIDY0 IC8qIHByZXR0eSBhcmJpdHJhcnkgKi8KPiArCj4gwqBpbnQgbWFwX21taW9fcmVnaW9ucyhzdHJ1 Y3QgZG9tYWluICpkLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgdW5zaWduZWQgbG9uZyBzdGFydF9nZm4sCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIG5yLAo+IEBAIC0yMTAyLDIyICsyMTU1LDI5 IEBAIGludCBtYXBfbW1pb19yZWdpb25zKHN0cnVjdCBkb21haW4gKmQsCj4gwqB7Cj4gwqDCoMKg wqDCoGludCByZXQgPSAwOwo+IMKgwqDCoMKgwqB1bnNpZ25lZCBsb25nIGk7Cj4gK8KgwqDCoMKg dW5zaWduZWQgaW50IGl0ZXIsIG9yZGVyOwo+IMKgCj4gwqDCoMKgwqDCoGlmICggIXBhZ2luZ19t b2RlX3RyYW5zbGF0ZShkKSApCj4gwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIDA7Cj4gwqAKPiAt wqDCoMKgwqBmb3IgKCBpID0gMDsgIXJldCAmJiBpIDwgbnI7IGkrKyApCj4gK8KgwqDCoMKgZm9y ICggaXRlciA9IGkgPSAwOyBpIDwgbnIgJiYgaXRlciA8IE1BUF9NTUlPX01BWF9JVEVSOwo+ICvC oMKgwqDCoMKgwqDCoMKgwqDCoGkgKz0gMVVMIDw8IG9yZGVyLCArK2l0ZXIgKQo+IMKgwqDCoMKg wqB7Cj4gLcKgwqDCoMKgwqDCoMKgwqByZXQgPSBzZXRfbW1pb19wMm1fZW50cnkoZCwgc3RhcnRf Z2ZuICsgaSwgX21mbihtZm4gKyBpKSwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcDJtX2dldF9ob3N0cDJtKGQpLT5k ZWZhdWx0X2FjY2Vzcyk7Cj4gLcKgwqDCoMKgwqDCoMKgwqBpZiAoIHJldCApCj4gK8KgwqDCoMKg wqDCoMKgwqAvKiBPUidpbmcgZ2ZuIGFuZCBtZm4gdmFsdWVzIHdpbGwgcmV0dXJuIGFuIG9yZGVy IHN1aXRhYmxlIHRvCj4gYm90aC4gKi8KPiArwqDCoMKgwqDCoMKgwqDCoGZvciAoIG9yZGVyID0g bW1pb19vcmRlcihkLCAoc3RhcnRfZ2ZuICsgaSkgfCAobWZuICsgaSksIG5yIC0KPiBpKTsgOwo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgb3JkZXIgPSByZXQgLSAxICkKPiDCoMKgwqDC oMKgwqDCoMKgwqB7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVubWFwX21taW9fcmVnaW9u cyhkLCBzdGFydF9nZm4sIGksIG1mbik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFr Owo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBzZXRfbW1pb19wMm1fZW50cnkoZCwg c3RhcnRfZ2ZuICsgaSwgX21mbihtZm4gKyBpKSwKPiBvcmRlciwKPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqBwMm1fZ2V0X2hvc3RwMm0oZCktCj4gPmRlZmF1bHRfYWNjZXNzKTsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgaWYgKCByZXQgPD0gMCApCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoEFTU0VSVChyZXQgPD0gb3Jk ZXIpOwo+IMKgwqDCoMKgwqDCoMKgwqDCoH0KPiArwqDCoMKgwqDCoMKgwqDCoGlmICggcmV0IDwg MCApCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+IMKgwqDCoMKgwqB9Cj4gwqAK PiAtwqDCoMKgwqByZXR1cm4gcmV0Owo+ICvCoMKgwqDCoHJldHVybiBpID09IG5yID8gMCA6IGkg PzogcmV0Owo+IMKgfQo+IMKgCj4gwqBpbnQgdW5tYXBfbW1pb19yZWdpb25zKHN0cnVjdCBkb21h aW4gKmQsCj4gQEAgLTIxMjUsMjAgKzIxODUsMzAgQEAgaW50IHVubWFwX21taW9fcmVnaW9ucyhz dHJ1Y3QgZG9tYWluICpkLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgbnIsCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgbG9uZyBtZm4pCj4gwqB7Cj4gLcKgwqDCoMKg aW50IGVyciA9IDA7Cj4gK8KgwqDCoMKgaW50IHJldCA9IDA7Cj4gwqDCoMKgwqDCoHVuc2lnbmVk IGxvbmcgaTsKPiArwqDCoMKgwqB1bnNpZ25lZCBpbnQgaXRlciwgb3JkZXI7Cj4gwqAKPiDCoMKg wqDCoMKgaWYgKCAhcGFnaW5nX21vZGVfdHJhbnNsYXRlKGQpICkKPiDCoMKgwqDCoMKgwqDCoMKg wqByZXR1cm4gMDsKPiDCoAo+IC3CoMKgwqDCoGZvciAoIGkgPSAwOyBpIDwgbnI7IGkrKyApCj4g K8KgwqDCoMKgZm9yICggaXRlciA9IGkgPSAwOyBpIDwgbnIgJiYgaXRlciA8IE1BUF9NTUlPX01B WF9JVEVSOwo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoGkgKz0gMVVMIDw8IG9yZGVyLCArK2l0ZXIg KQo+IMKgwqDCoMKgwqB7Cj4gLcKgwqDCoMKgwqDCoMKgwqBpbnQgcmV0ID0gY2xlYXJfbW1pb19w Mm1fZW50cnkoZCwgc3RhcnRfZ2ZuICsgaSwgX21mbihtZm4gKyBpKSk7Cj4gLcKgwqDCoMKgwqDC oMKgwqBpZiAoIHJldCApCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVyciA9IHJldDsKPiAr wqDCoMKgwqDCoMKgwqDCoC8qIE9SJ2luZyBnZm4gYW5kIG1mbiB2YWx1ZXMgd2lsbCByZXR1cm4g YW4gb3JkZXIgc3VpdGFibGUgdG8KPiBib3RoLiAqLwo+ICvCoMKgwqDCoMKgwqDCoMKgZm9yICgg b3JkZXIgPSBtbWlvX29yZGVyKGQsIChzdGFydF9nZm4gKyBpKSB8IChtZm4gKyBpKSwgbnIgLQo+ IGkpOyA7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBvcmRlciA9IHJldCAtIDEgKQo+ ICvCoMKgwqDCoMKgwqDCoMKgewo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBjbGVh cl9tbWlvX3AybV9lbnRyeShkLCBzdGFydF9nZm4gKyBpLCBfbWZuKG1mbiArIGkpLAo+IG9yZGVy KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCByZXQgPD0gMCApCj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oEFTU0VSVChyZXQgPD0gb3JkZXIpOwo+ICvCoMKgwqDCoMKgwqDCoMKgfQo+ICvCoMKgwqDCoMKg wqDCoMKgaWYgKCByZXQgPCAwICkKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgYnJlYWs7Cj4g wqDCoMKgwqDCoH0KPiDCoAo+IC3CoMKgwqDCoHJldHVybiBlcnI7Cj4gK8KgwqDCoMKgcmV0dXJu IGkgPT0gbnIgPyAwIDogaSA/OiByZXQ7Cj4gwqB9Cj4gwqAKPiDCoHVuc2lnbmVkIGludCBwMm1f ZmluZF9hbHRwMm1fYnlfZXB0cChzdHJ1Y3QgZG9tYWluICpkLCB1aW50NjRfdCBlcHRwKQo+IC0t LSBhL3hlbi9hcmNoL3g4Ni9tbS9wMm0tZXB0LmMKPiArKysgYi94ZW4vYXJjaC94ODYvbW0vcDJt LWVwdC5jCj4gQEAgLTEzNiw2ICsxMzYsNyBAQCBzdGF0aWMgdm9pZCBlcHRfcDJtX3R5cGVfdG9f ZmxhZ3Moc3RydWN0Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbnRyeS0+ciA9IGVudHJ5 LT54ID0gMTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVudHJ5LT53ID0gIXJhbmdlc2V0 X2NvbnRhaW5zX3NpbmdsZXRvbihtbWlvX3JvX3JhbmdlcywKPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZW50cnktPm1mbik7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoEFTU0VSVChlbnRyeS0+dyB8fCAhaXNfZXB0ZV9zdXBlcnBhZ2UoZW50cnkp KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVudHJ5LT5hID0gISFjcHVfaGFzX3ZteF9l cHRfYWQ7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBlbnRyeS0+ZCA9IGVudHJ5LT53ICYm IGNwdV9oYXNfdm14X2VwdF9hZDsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ IC0tLSBhL3hlbi9hcmNoL3g4Ni9tbS9wMm0tcHQuYwo+ICsrKyBiL3hlbi9hcmNoL3g4Ni9tbS9w Mm0tcHQuYwo+IEBAIC03Miw3ICs3Miw4IEBAIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBn dFtdID0gewo+IMKgwqDCoMKgwqBQR1RfbDNfcGFnZV90YWJsZQo+IMKgfTsKPiDCoAo+IC1zdGF0 aWMgdW5zaWduZWQgbG9uZyBwMm1fdHlwZV90b19mbGFncyhwMm1fdHlwZV90IHQsIG1mbl90IG1m bikKPiArc3RhdGljIHVuc2lnbmVkIGxvbmcgcDJtX3R5cGVfdG9fZmxhZ3MocDJtX3R5cGVfdCB0 LCBtZm5fdCBtZm4sCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHVuc2lnbmVkIGludCBsZXZlbCkK PiDCoHsKPiDCoMKgwqDCoMKgdW5zaWduZWQgbG9uZyBmbGFnczsKPiDCoMKgwqDCoMKgLyoKPiBA QCAtMTA3LDYgKzEwOCw4IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIHAybV90eXBlX3RvX2ZsYWdz KHAKPiDCoMKgwqDCoMKgY2FzZSBwMm1fbW1pb19kaXJlY3Q6Cj4gwqDCoMKgwqDCoMKgwqDCoMKg aWYgKCAhcmFuZ2VzZXRfY29udGFpbnNfc2luZ2xldG9uKG1taW9fcm9fcmFuZ2VzLCBtZm5feCht Zm4pKSApCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBmbGFncyB8PSBfUEFHRV9SVzsKPiAr wqDCoMKgwqDCoMKgwqDCoGVsc2UKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgQVNTRVJUKCFs ZXZlbCk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIGZsYWdzIHwgUDJNX0JBU0VfRkxBR1Mg fCBfUEFHRV9QQ0Q7Cj4gwqDCoMKgwqDCoH0KPiDCoH0KPiBAQCAtNDM2LDcgKzQzOSw3IEBAIHN0 YXRpYyBpbnQgZG9fcmVjYWxjKHN0cnVjdCBwMm1fZG9tYWluICoKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoHAybV90eXBlX3QgcDJtdCA9IHAybV9pc19sb2dkaXJ0eV9yYW5nZShwMm0sIGdm biAmIG1hc2ssIGdmbgo+IHwgfm1hc2spCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA/IHAybV9yYW1fbG9nZGlydHkgOiBwMm1f cmFtX3J3Owo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgbG9uZyBtZm4gPSBs MWVfZ2V0X3BmbihlKTsKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgdW5zaWduZWQgbG9uZyBm bGFncyA9IHAybV90eXBlX3RvX2ZsYWdzKHAybXQsIF9tZm4obWZuKSk7Cj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwMm1fdHlwZV90b19mbGFncyhwMm10 LCBfbWZuKG1mbiksCj4gbGV2ZWwpOwo+IMKgCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBp ZiAoIGxldmVsICkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHsKPiBAQCAtNTczLDcgKzU3 Niw3IEBAIHAybV9wdF9zZXRfZW50cnkoc3RydWN0IHAybV9kb21haW4gKnAybSwKPiDCoMKgwqDC oMKgwqDCoMKgwqBBU1NFUlQoIW1mbl92YWxpZChtZm4pIHx8IHAybXQgIT0gcDJtX21taW9fZGly ZWN0KTsKPiDCoMKgwqDCoMKgwqDCoMKgwqBsM2VfY29udGVudCA9IG1mbl92YWxpZChtZm4pIHx8 IHAybV9hbGxvd3NfaW52YWxpZF9tZm4ocDJtdCkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oD8gbDNlX2Zyb21fcGZuKG1mbl94KG1mbiksCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAybV90eXBlX3RvX2ZsYWdzKHAybXQsIG1mbikg fCBfUEFHRV9QU0UpCj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHAybV90eXBlX3RvX2ZsYWdzKHAybXQsIG1mbiwgMikgfCBfUEFHRV9QU0Up Cj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqA6IGwzZV9lbXB0eSgpOwo+IMKgwqDCoMKgwqDC oMKgwqDCoGVudHJ5X2NvbnRlbnQubDEgPSBsM2VfY29udGVudC5sMzsKPiDCoAo+IEBAIC02MDks NyArNjEyLDcgQEAgcDJtX3B0X3NldF9lbnRyeShzdHJ1Y3QgcDJtX2RvbWFpbiAqcDJtLAo+IMKg Cj4gwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCBtZm5fdmFsaWQobWZuKSB8fCBwMm1fYWxsb3dzX2lu dmFsaWRfbWZuKHAybXQpICkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGVudHJ5X2NvbnRl bnQgPSBwMm1fbDFlX2Zyb21fcGZuKG1mbl94KG1mbiksCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoHAybV90eXBlX3RvX2ZsYWdzKHAybXQsCj4gbWZuKSk7Cj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAybV90eXBlX3RvX2ZsYWdzKHAybXQsCj4gbWZuLCAw KSk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg ZW50cnlfY29udGVudCA9IGwxZV9lbXB0eSgpOwo+IMKgCj4gQEAgLTY0NSw3ICs2NDgsNyBAQCBw Mm1fcHRfc2V0X2VudHJ5KHN0cnVjdCBwMm1fZG9tYWluICpwMm0sCj4gwqDCoMKgwqDCoMKgwqDC oMKgQVNTRVJUKCFtZm5fdmFsaWQobWZuKSB8fCBwMm10ICE9IHAybV9tbWlvX2RpcmVjdCk7Cj4g wqDCoMKgwqDCoMKgwqDCoMKgaWYgKCBtZm5fdmFsaWQobWZuKSB8fCBwMm1fYWxsb3dzX2ludmFs aWRfbWZuKHAybXQpICkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGwyZV9jb250ZW50ID0g bDJlX2Zyb21fcGZuKG1mbl94KG1mbiksCj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAybV90eXBl X3RvX2ZsYWdzKHAybXQsIG1mbikgfAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwMm1fdHlwZV90 b19mbGFncyhwMm10LCBtZm4sIDEpIHwKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoF9QQUdFX1BT RSk7Cj4gwqDCoMKgwqDCoMKgwqDCoMKgZWxzZQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg bDJlX2NvbnRlbnQgPSBsMmVfZW1wdHkoKTsKPiAtLS0gYS94ZW4vY29tbW9uL2RvbWN0bC5jCj4g KysrIGIveGVuL2NvbW1vbi9kb21jdGwuYwo+IEBAIC0xMDQ2LDEwICsxMDQ2LDEyIEBAIGxvbmcg ZG9fZG9tY3RsKFhFTl9HVUVTVF9IQU5ETEVfUEFSQU0oeGUKPiDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgKGdmbiArIG5yX21mbnMgLSAxKSA8IGdmbiApIC8qIHdyYXA/ICovCj4gwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqBicmVhazsKPiDCoAo+ICsjaWZuZGVmIENPTkZJR19YODYgLyog WFhYIEFSTSE/ICovCj4gwqDCoMKgwqDCoMKgwqDCoMKgcmV0ID0gLUUyQklHOwo+IMKgwqDCoMKg wqDCoMKgwqDCoC8qIE11c3QgYnJlYWsgaHlwZXJjYWxsIHVwIGFzIHRoaXMgY291bGQgdGFrZSBh IHdoaWxlLiAqLwo+IMKgwqDCoMKgwqDCoMKgwqDCoGlmICggbnJfbWZucyA+IDY0ICkKPiDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoGJyZWFrOwo+ICsjZW5kaWYKPiDCoAo+IMKgwqDCoMKgwqDC oMKgwqDCoHJldCA9IC1FUEVSTTsKPiDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoICFpb21lbV9hY2Nl c3NfcGVybWl0dGVkKGN1cnJlbnQtPmRvbWFpbiwgbWZuLCBtZm5fZW5kKSB8fAo+IEBAIC0xMDY3 LDcgKzEwNjksNyBAQCBsb25nIGRvX2RvbWN0bChYRU5fR1VFU1RfSEFORExFX1BBUkFNKHhlCj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGQtPmRvbWFpbl9pZCwgZ2Zu LCBtZm4sIG5yX21mbnMpOwo+IMKgCj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqByZXQgPSBt YXBfbW1pb19yZWdpb25zKGQsIGdmbiwgbnJfbWZucywgbWZuKTsKPiAtwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgaWYgKCByZXQgKQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBpZiAoIHJldCA8 IDAgKQo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqBwcmludGsoWEVOTE9HX0df V0FSTklORwo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCJtZW1vcnlfbWFwOmZhaWw6IGRvbSVkIGdmbj0lbHggbWZuPSVseCBucj0lbHgKPiByZXQ6JWxk XG4iLAo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoGQt PmRvbWFpbl9pZCwgZ2ZuLCBtZm4sIG5yX21mbnMsIHJldCk7Cj4gQEAgLTEwNzksNyArMTA4MSw3 IEBAIGxvbmcgZG9fZG9tY3RsKFhFTl9HVUVTVF9IQU5ETEVfUEFSQU0oeGUKPiDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgZC0+ZG9tYWluX2lkLCBnZm4sIG1mbiwgbnJf bWZucyk7Cj4gwqAKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHJldCA9IHVubWFwX21taW9f cmVnaW9ucyhkLCBnZm4sIG5yX21mbnMsIG1mbik7Cj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oGlmICggcmV0ICYmIGlzX2hhcmR3YXJlX2RvbWFpbihjdXJyZW50LT5kb21haW4pICkKPiArwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgaWYgKCByZXQgPCAwICYmIGlzX2hhcmR3YXJlX2RvbWFpbihj dXJyZW50LT5kb21haW4pICkKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcHJp bnRrKFhFTkxPR19FUlIKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAibWVtb3J5X21hcDogZXJyb3IgJWxkIHJlbW92aW5nIGRvbSVkIGFjY2VzcyB0bwo+ IFslbHgsJWx4XVxuIiwKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqByZXQsIGQtPmRvbWFpbl9pZCwgbWZuLCBtZm5fZW5kKTsKPiAtLS0gYS94ZW4vY29t bW9uL21lbW9yeS5jCj4gKysrIGIveGVuL2NvbW1vbi9tZW1vcnkuYwo+IEBAIC0yNTksNyArMjU5 LDcgQEAgaW50IGd1ZXN0X3JlbW92ZV9wYWdlKHN0cnVjdCBkb21haW4gKmQsCj4gwqDCoMKgwqDC oH0KPiDCoMKgwqDCoMKgaWYgKCBwMm10ID09IHAybV9tbWlvX2RpcmVjdCApCj4gwqDCoMKgwqDC oHsKPiAtwqDCoMKgwqDCoMKgwqDCoGNsZWFyX21taW9fcDJtX2VudHJ5KGQsIGdtZm4sIF9tZm4o bWZuKSk7Cj4gK8KgwqDCoMKgwqDCoMKgwqBjbGVhcl9tbWlvX3AybV9lbnRyeShkLCBnbWZuLCBf bWZuKG1mbiksIDApOwo+IMKgwqDCoMKgwqDCoMKgwqDCoHB1dF9nZm4oZCwgZ21mbik7Cj4gwqDC oMKgwqDCoMKgwqDCoMKgcmV0dXJuIDE7Cj4gwqDCoMKgwqDCoH0KPiAtLS0gYS94ZW4vaW5jbHVk ZS9hc20teDg2L3AybS5oCj4gKysrIGIveGVuL2luY2x1ZGUvYXNtLXg4Ni9wMm0uaAo+IEBAIC01 NzQsOCArNTc0LDkgQEAgaW50IHAybV9pc19sb2dkaXJ0eV9yYW5nZShzdHJ1Y3QgcDJtX2RvbQo+ IMKgCj4gwqAvKiBTZXQgbW1pbyBhZGRyZXNzZXMgaW4gdGhlIHAybSB0YWJsZSAoZm9yIHBhc3Mt dGhyb3VnaCkgKi8KPiDCoGludCBzZXRfbW1pb19wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwg dW5zaWduZWQgbG9uZyBnZm4sIG1mbl90IG1mbiwKPiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoHAybV9hY2Nlc3NfdCBhY2Nlc3MpOwo+IC1pbnQgY2xlYXJf bW1pb19wMm1fZW50cnkoc3RydWN0IGRvbWFpbiAqZCwgdW5zaWduZWQgbG9uZyBnZm4sIG1mbl90 Cj4gbWZuKTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHVuc2lnbmVkIGludCBvcmRlciwgcDJtX2FjY2Vzc190IGFjY2Vzcyk7Cj4gK2ludCBjbGVhcl9t bWlvX3AybV9lbnRyeShzdHJ1Y3QgZG9tYWluICpkLCB1bnNpZ25lZCBsb25nIGdmbiwgbWZuX3Qg bWZuLAo+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oHVuc2lnbmVkIGludCBvcmRlcik7Cj4gwqAKPiDCoC8qIFNldCBpZGVudGl0eSBhZGRyZXNzZXMg aW4gdGhlIHAybSB0YWJsZSAoZm9yIHBhc3MtdGhyb3VnaCkgKi8KPiDCoGludCBzZXRfaWRlbnRp dHlfcDJtX2VudHJ5KHN0cnVjdCBkb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgZ2ZuLAo+IC0tLSBh L3hlbi9pbmNsdWRlL3B1YmxpYy9kb21jdGwuaAo+ICsrKyBiL3hlbi9pbmNsdWRlL3B1YmxpYy9k b21jdGwuaAo+IEBAIC01NDIsOCArNTQyLDE1IEBAIERFRklORV9YRU5fR1VFU1RfSEFORExFKHhl bl9kb21jdGxfYmluZF8KPiDCoAo+IMKgCj4gwqAvKiBCaW5kIG1hY2hpbmUgSS9PIGFkZHJlc3Mg cmFuZ2UgLT4gSFZNIGFkZHJlc3MgcmFuZ2UuICovCj4gLS8qIElmIHRoaXMgcmV0dXJucyAtRTJC SUcgbG93ZXIgbnJfbWZucyB2YWx1ZS4gKi8KPiDCoC8qIFhFTl9ET01DVExfbWVtb3J5X21hcHBp bmcgKi8KPiArLyogUmV0dXJucwo+ICvCoMKgwqAtIHplcm/CoMKgwqDCoMKgc3VjY2VzcywgZXZl cnl0aGluZyBkb25lCj4gK8KgwqDCoC0gLUUyQklHwqDCoMKgcGFzc2VkIGluIG5yX21mbnMgdmFs dWUgdG9vIGxhcmdlIGZvciB0aGUgaW1wbGVtZW50YXRpb24KPiArwqDCoMKgLSBwb3NpdGl2ZSBw YXJ0aWFsIHN1Y2Nlc3MgZm9yIHRoZSBmaXJzdCA8cmVzdWx0PiBwYWdlIGZyYW1lcyAod2l0aAo+ ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPHJlc3VsdD4gbGVzcyB0aGFuIG5yX21mbnMp LCByZXF1aXJpbmcgcmUtaW52b2NhdGlvbiBieQo+IHRoZQo+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgY2FsbGVyIGFmdGVyIHVwZGF0aW5nIGlucHV0cwo+ICvCoMKgwqAtIG5lZ2F0aXZl IGVycm9yOyBvdGhlciB0aGFuIC1FMkJJRwo+ICsqLwo+IMKgI2RlZmluZSBEUENJX0FERF9NQVBQ SU5HwqDCoMKgwqDCoMKgwqDCoMKgMQo+IMKgI2RlZmluZSBEUENJX1JFTU9WRV9NQVBQSU5HwqDC oMKgwqDCoMKgMAo+IMKgc3RydWN0IHhlbl9kb21jdGxfbWVtb3J5X21hcHBpbmcgewo+IAo+IApf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwg bWFpbGluZyBsaXN0Clhlbi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHA6Ly9saXN0cy54ZW4ub3Jn L3hlbi1kZXZlbAo=