From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 05/15] drm/i915: GuC-specific firmware loader Date: Mon, 6 Jul 2015 16:28:22 +0200 Message-ID: <20150706142822.GJ2156@phenom.ffwll.local> References: <1435926637-30892-1-git-send-email-david.s.gordon@intel.com> <1435926637-30892-6-git-send-email-david.s.gordon@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by gabe.freedesktop.org (Postfix) with ESMTPS id 199186E401 for ; Mon, 6 Jul 2015 07:25:37 -0700 (PDT) Received: by wibdq8 with SMTP id dq8so155121055wib.1 for ; Mon, 06 Jul 2015 07:25:35 -0700 (PDT) Content-Disposition: inline In-Reply-To: <1435926637-30892-6-git-send-email-david.s.gordon@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Dave Gordon Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gRnJpLCBKdWwgMDMsIDIwMTUgYXQgMDE6MzA6MjdQTSArMDEwMCwgRGF2ZSBHb3Jkb24gd3Jv dGU6Cj4gRnJvbTogQWxleCBEYWkgPHl1LmRhaUBpbnRlbC5jb20+Cj4gCj4gVGhpcyB1c2VzIHRo ZSBjb21tb24gZmlybXdhcmUgbG9hZGVyIHRvIGZldGNoIHRoZSBmaXJtd2FyZSBpbWFnZSwKPiB0 aGVuIGxvYWRzIGl0IGludG8gdGhlIEd1QydzIG1lbW9yeSB2aWEgYSBkZWRpY2F0ZWQgRE1BIGVu Z2luZS4KPiAKPiBUaGlzIHBhdGNoIGlzIGRlcml2ZWQgZnJvbSBHdUMgbG9hZGluZyB3b3JrIG9y aWdpbmFsbHkgZG9uZSBieQo+IFZpbml0IEF6YWQgYW5kIEJlbiBXaWRhd3NreS4gSXQgaGFzIGJl ZW4gcmVjb25zdHJ1Y3RlZCB0byBhY2NvcmQKPiB3aXRoIHRoZSBjb21tb24gZmlybXdhcmUgbG9h ZGluZyBtZWNoYW5pc20gYnkgRGF2ZSBHb3Jkb24gYXMgd2VsbAo+IGFzIG5ldyBmaXJtd2FyZSBs YXlvdXQgZXRjLgo+IAo+IHYyOgo+ICAgICBWYXJpb3VzIGltcHJvdmVtZW50cyBwZXIgcmV2aWV3 IGNvbW1lbnRzIGJ5IENocmlzIFdpbHNvbgo+IAo+IHYzOgo+ICAgICBSZW1vdmVkICd3YWl0JyBw YXJhbWV0ZXIgdG8gaW50ZWxfZ3VjX3Vjb2RlX2xvYWQoKSBhcyBwcmVmZXRjaAo+ICAgICAgICAg aXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiB0aGUgY29tbW9uIGZpcm13YXJlIGxvYWRlciwgcGVy Cj4gCURhbmllbCBWZXR0ZXIncyByZXF1ZXN0Lgo+ICAgICBGL3cgY2hlY2tlciBjYWxsYmFjayBm biBub3cgcmV0dXJucyBlcnJubyByYXRoZXIgdGhhbiBib29sLgo+IAo+IElzc3VlOiBWSVotNDg4 NAo+IFNpZ25lZC1vZmYtYnk6IEFsZXggRGFpIDx5dS5kYWlAaW50ZWwuY29tPgo+IFNpZ25lZC1v ZmYtYnk6IERhdmUgR29yZG9uIDxkYXZpZC5zLmdvcmRvbkBpbnRlbC5jb20+Cj4gLS0tCj4gIGRy aXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlICAgICAgICAgICB8ICAgMyArCj4gIGRyaXZlcnMv Z3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgICAgICAgICB8ICAgNCArCj4gIGRyaXZlcnMvZ3B1L2Ry bS9pOTE1L2k5MTVfZHJ2LmggICAgICAgICB8ICAxMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2k5MTVfZ2VtLmMgICAgICAgICB8ICAgOCArCj4gIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf cmVnLmggICAgICAgICB8ICAgNCArLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9ndWMu aCAgICAgICAgfCAgNDkgKysrKwo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9ndWNfbG9h ZGVyLmMgfCA0NDggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgNyBmaWxlcyBj aGFuZ2VkLCA1MjYgaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYwo+IAo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L01ha2VmaWxlCj4gaW5kZXggZjFmODBmYy4uNjJhOGM4MyAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2Vm aWxlCj4gQEAgLTQyLDYgKzQyLDkgQEAgaTkxNS15ICs9IGk5MTVfY21kX3BhcnNlci5vIFwKPiAg IyBnZW5lcmljIGFuY2lsbGlhcnkgbWljcm9jb250cm9sbGVyIHN1cHBvcnQKPiAgaTkxNS15ICs9 IGludGVsX3VjX2xvYWRlci5vCj4gIAo+ICsjIGdlbmVyYWwtcHVycG9zZSBtaWNyb2NvbnRyb2xs ZXIgKEd1Qykgc3VwcG9ydAo+ICtpOTE1LXkgKz0gaW50ZWxfZ3VjX2xvYWRlci5vCj4gKwo+ICAj IGF1dG9nZW5lcmF0ZWQgbnVsbCByZW5kZXIgc3RhdGUKPiAgaTkxNS15ICs9IGludGVsX3JlbmRl cnN0YXRlX2dlbjYubyBcCj4gIAkgIGludGVsX3JlbmRlcnN0YXRlX2dlbjcubyBcCj4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9pOTE1X2RtYS5jCj4gaW5kZXggYzUzNDlmYS4uNzMwZDkxYiAxMDA2NDQKPiAtLS0gYS9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvaTkxNV9kbWEuYwo+IEBAIC00NjksNiArNDY5LDcgQEAgc3RhdGljIGludCBpOTE1X2xvYWRf bW9kZXNldF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gIAo+ICBjbGVhbnVwX2dlbToK PiAgCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKPiArCWludGVsX2d1Y191Y29kZV9m aW5pKGRldik7Cj4gIAlpOTE1X2dlbV9jbGVhbnVwX3JpbmdidWZmZXIoZGV2KTsKPiAgCWk5MTVf Z2VtX2NvbnRleHRfZmluaShkZXYpOwo+ICAJbXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRl eCk7Cj4gQEAgLTg2Niw2ICs4NjcsOCBAQCBpbnQgaTkxNV9kcml2ZXJfbG9hZChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCB1bnNpZ25lZCBsb25nIGZsYWdzKQo+ICAKPiAgCWludGVsX3VuY29yZV9p bml0KGRldik7Cj4gIAo+ICsJaW50ZWxfZ3VjX3Vjb2RlX2luaXQoZGV2KTsKPiArCj4gIAkvKiBM b2FkIENTUiBGaXJtd2FyZSBmb3IgU0tMICovCj4gIAlpbnRlbF9jc3JfdWNvZGVfaW5pdChkZXYp Owo+ICAKPiBAQCAtMTExNyw2ICsxMTIwLDcgQEAgaW50IGk5MTVfZHJpdmVyX3VubG9hZChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2KQo+ICAJZmx1c2hfd29ya3F1ZXVlKGRldl9wcml2LT53cSk7Cj4g IAo+ICAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+ICsJaW50ZWxfZ3VjX3Vjb2Rl X2ZpbmkoZGV2KTsKPiAgCWk5MTVfZ2VtX2NsZWFudXBfcmluZ2J1ZmZlcihkZXYpOwo+ICAJaTkx NV9nZW1fY29udGV4dF9maW5pKGRldik7Cj4gIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211 dGV4KTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPiBpbmRleCA5NjE4ZjU3Li5hN2NjYWM1IDEw MDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCj4gQEAgLTUwLDYgKzUwLDcgQEAKPiAgI2luY2x1 ZGUgPGxpbnV4L2ludGVsLWlvbW11Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9rcmVmLmg+Cj4gICNp bmNsdWRlIDxsaW51eC9wbV9xb3MuaD4KPiArI2luY2x1ZGUgImludGVsX2d1Yy5oIgo+ICAKPiAg LyogR2VuZXJhbCBjdXN0b21pemF0aW9uOgo+ICAgKi8KPiBAQCAtMTY4Nyw2ICsxNjg4LDggQEAg c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgewo+ICAKPiAgCXN0cnVjdCBpOTE1X3ZpcnR1YWxfZ3B1 IHZncHU7Cj4gIAo+ICsJc3RydWN0IGludGVsX2d1YyBndWM7Cj4gKwo+ICAJc3RydWN0IGludGVs X2NzciBjc3I7Cj4gIAo+ICAJLyogRGlzcGxheSBDU1ItcmVsYXRlZCBwcm90ZWN0aW9uICovCj4g QEAgLTE5MzEsNiArMTkzNCwxMSBAQCBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfdG9faTkxNShzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gIAlyZXR1cm4gdG9faTkxNShk ZXZfZ2V0X2RydmRhdGEoZGV2KSk7Cj4gIH0KPiAgCj4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmd1Y190b19pOTE1KHN0cnVjdCBpbnRlbF9ndWMgKmd1YykKPiArewo+ ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihndWMsIHN0cnVjdCBkcm1faTkxNV9wcml2YXRlLCBndWMp Owo+ICt9Cj4gKwo+ICAvKiBJdGVyYXRlIG92ZXIgaW5pdGlhbGlzZWQgcmluZ3MgKi8KPiAgI2Rl ZmluZSBmb3JfZWFjaF9yaW5nKHJpbmdfXywgZGV2X3ByaXZfXywgaV9fKSBcCj4gIAlmb3IgKChp X18pID0gMDsgKGlfXykgPCBJOTE1X05VTV9SSU5HUzsgKGlfXykrKykgXAo+IEBAIC0yNTM5LDYg KzI1NDcsOSBAQCBzdHJ1Y3QgZHJtX2k5MTVfY21kX3RhYmxlIHsKPiAgCj4gICNkZWZpbmUgSEFT X0NTUihkZXYpCShJU19TS1lMQUtFKGRldikpCj4gIAo+ICsjZGVmaW5lIEhBU19HVUNfVUNPREUo ZGV2KQkoSVNfR0VOOShkZXYpKQo+ICsjZGVmaW5lIEhBU19HVUNfU0NIRUQoZGV2KQkoSVNfR0VO OShkZXYpKQo+ICsKPiAgI2RlZmluZSBJTlRFTF9QQ0hfREVWSUNFX0lEX01BU0sJCTB4ZmYwMAo+ ICAjZGVmaW5lIElOVEVMX1BDSF9JQlhfREVWSUNFX0lEX1RZUEUJCTB4M2IwMAo+ICAjZGVmaW5l IElOVEVMX1BDSF9DUFRfREVWSUNFX0lEX1RZUEUJCTB4MWMwMAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9n ZW0uYwo+IGluZGV4IGFhOGY0YzMuLjgwZDc4OTAgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaTkxNV9nZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2Vt LmMKPiBAQCAtNTA3Niw2ICs1MDc2LDE0IEBAIGk5MTVfZ2VtX2luaXRfaHcoc3RydWN0IGRybV9k ZXZpY2UgKmRldikKPiAgCQkJZ290byBvdXQ7Cj4gIAl9Cj4gIAo+ICsJLyoKPiArCSAqIFdlIGNh bid0IGVuYWJsZSBjb250ZXh0cyB1bnRpbCBhbGwgZmlybXdhcmUgaXMgbG9hZGVkOyBpZiB0aGlz Cj4gKwkgKiBmYWlscywgZGlzYWJsZSBHdUMgc3VibWlzc2lvbnMgYW5kIGZhbGwgYmFjayB0byBl eGVjbGlzdCBtb2RlCj4gKwkgKi8KPiArCXJldCA9IGludGVsX2d1Y191Y29kZV9sb2FkKGRldik7 Cj4gKwlpZiAocmV0KQo+ICsJCWk5MTUuZW5hYmxlX2d1Y19zdWJtaXNzaW9uID0gZmFsc2U7CgpJ IHdhbnQgYW4gLUVJTyBvciBzaW1pbGFyIGhlcmUgc2luY2UgcnVudGltZSBmYWxsYmFja3MgdG8g b3RoZXIgbW9kZXMKcmVhbGx5IGFyZW4ndCBncmVhdCBmcm9tIGEgbWFpbnRhaW5hbmNlIHBlcnNw ZWN0aXZlLCBzZWUgbXkgY29tbWVudHMgb24KdGhlIGlycSByb3V0aW5nIGNvZGUuCgpZZXMgd2Ug Y2FuIG1ha2UgdGhpcyB3b3JrLCBidXQgZ2l2aW4gb3VyIHN0ZWxsYXIgdHJhY2sgcmVjb3JkIHdp dGgga2VlcGluZwpkaXNhYmxlZCBmZWF0dXJlcyB3b3JraW5nIGl0IHdvbid0IHdvcmsgZm9yIGxv bmcuIEFuZCBpdCB3aWxsIGltcGFjdCB1cwp3aXRoIGFkZGl0aW9uYWwgY29uc3RyYWludHMgdW50 aWwgd2UgZ2l2ZSB1cCBhbmQgcmlwIGl0IG91dCBhZ2Fpbi4gTm90CndvcnRoIGl0IGltbyAtIGlm IHdlIGRlY2lkZSB0byB1c2UgdGhlIGd1YyBvbiBhIGdpdmVuIHBsYXRmb3JtIHdlIHNob3VsZApp bW8gcmVxdWlyZSBpdCBhbmQgc3RpY2sgdG8gdGhhdCBkZWNpc2lvbiBmb3IgYXQgbGVhc3QgYXMg bG9uZyBhcyB0aGUKZHJpdmVyIGlzIGxvYWRlZC4gRGV2ZWxvcGVycyBjYW4gc3RpbGwgY2hhbmdl IHRoZSBvcHRpb24gd2hlbiByZWxvYWRpbmcgdGhlCmRyaXZlciwgdXNlcnMgd29uJ3QgaGF2ZSBh IGNoYW5jZSB0byBjYXVzZSB0cm91YmxlLgotRGFuaWVsCgo+ICsKPiAgCS8qIE5vdyBpdCBpcyBz YWZlIHRvIGdvIGJhY2sgcm91bmQgYW5kIGRvIGV2ZXJ5dGhpbmcgZWxzZTogKi8KPiAgCWZvcl9l YWNoX3JpbmcocmluZywgZGV2X3ByaXYsIGkpIHsKPiAgCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3Jl cXVlc3QgKnJlcTsKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcu aCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKPiBpbmRleCAzMTNiMWY5Li5lZWZi ODQ3IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCj4gQEAgLTY4MzcsNyArNjgzNyw5IEBA IGVudW0gc2tsX2Rpc3BfcG93ZXJfd2VsbHMgewo+ICAjZGVmaW5lICAgR0VOOV9QR0NUTF9TU0Jf RVUzMTFfQUNLCSgxIDw8IDE0KQo+ICAKPiAgI2RlZmluZSBHRU43X01JU0NDUENUTAkJCSgweDk0 MjQpCj4gLSNkZWZpbmUgICBHRU43X0RPUF9DTE9DS19HQVRFX0VOQUJMRQkoMTw8MCkKPiArI2Rl ZmluZSAgIEdFTjdfRE9QX0NMT0NLX0dBVEVfRU5BQkxFCQkoMTw8MCkKPiArI2RlZmluZSAgIEdF TjhfRE9QX0NMT0NLX0dBVEVfQ0ZDTEtfRU5BQkxFCSgxPDwyKQo+ICsjZGVmaW5lICAgR0VOOF9E T1BfQ0xPQ0tfR0FURV9HVUNfRU5BQkxFCSgxPDw0KQo+ICAKPiAgLyogSVZZQlJJREdFIERQRiAq Lwo+ICAjZGVmaW5lIEdFTjdfTDNDREVSUlNUMQkJCTB4QjAwOCAvKiBMM0NEIEVycm9yIFN0YXR1 cyAxICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2d1Yy5oIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ IGluZGV4IDAwMDAwMDAuLmIzOGQyYjAKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfZ3VjLmgKPiBAQCAtMCwwICsxLDQ5IEBACj4gKy8qCj4gKyAqIENv cHlyaWdodCDCqSAyMDE0IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBlcm1pc3Npb24g aXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0 aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJl IHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KPiArICog dGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1 dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUs IGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2FyZSBpcyBmdXJu aXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgo+ICsg Kgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5v dGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVk ZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKPiArICogU29m dHdhcmUuCj4gKyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJRUQsIElOQ0xV RElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ LAo+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VN RU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhP TERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKPiArICogTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUg U09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBUSEUgU09GVFdB UkUuCj4gKyAqCj4gKyAqLwo+ICsjaWZuZGVmIF9JTlRFTF9HVUNfSF8KPiArI2RlZmluZSBfSU5U RUxfR1VDX0hfCj4gKwo+ICsjaW5jbHVkZSAiaW50ZWxfdWNfbG9hZGVyLmgiCj4gKyNpbmNsdWRl ICJpbnRlbF9ndWNfZndpZi5oIgo+ICsjaW5jbHVkZSAiaTkxNV9ndWNfcmVnLmgiCj4gKwo+ICtz dHJ1Y3QgaW50ZWxfZ3VjIHsKPiArCS8qIEdlbmVyaWMgdUMgZmlybXdhcmUgbWFuYWdlbWVudCAq Lwo+ICsJc3RydWN0IGludGVsX3VjX2Z3IGd1Y19mdzsKPiArCj4gKwkvKiBHdUMtc3BlY2lmaWMg YWRkaXRpb25zICovCj4gKwl1aW50MTZfdCBmd19tYWpvcl93YW50ZWQ7Cj4gKwl1aW50MTZfdCBm d19taW5vcl93YW50ZWQ7Cj4gKwl1aW50MTZfdCBmd19tYWpvcl9mb3VuZDsKPiArCXVpbnQxNl90 IGZ3X21pbm9yX2ZvdW5kOwo+ICsKPiArCXVpbnQzMl90IGxvZ19mbGFnczsKPiArfTsKPiArCj4g Ky8qIGludGVsX2d1Y19sb2FkZXIuYyAqLwo+ICtleHRlcm4gdm9pZCBpbnRlbF9ndWNfdWNvZGVf aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPiArZXh0ZXJuIGludCBpbnRlbF9ndWNfdWNv ZGVfbG9hZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPiArZXh0ZXJuIHZvaWQgaW50ZWxfZ3Vj X3Vjb2RlX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldik7Cj4gKwo+ICsjZW5kaWYKPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaW50ZWxfZ3VjX2xvYWRlci5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiBpbmRleCAwMDAwMDAwLi40OTI5ODM4Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX2d1Y19sb2FkZXIuYwo+IEBAIC0wLDAgKzEsNDQ4IEBACj4gKy8q Cj4gKyAqIENvcHlyaWdodCDCqSAyMDE0IEludGVsIENvcnBvcmF0aW9uCj4gKyAqCj4gKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u IG9idGFpbmluZyBhCj4gKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCj4gKyAqIHRvIGRlYWwgaW4gdGhl IFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRp b24KPiArICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCj4gKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQo+ICsgKiBTb2Z0d2Fy ZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRp b25zOgo+ICsgKgo+ICsgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJt aXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0Cj4gKyAqIHBhcmFncmFwaCkgc2hhbGwg YmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUK PiArICogU29mdHdhcmUuCj4gKyAqCj4gKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMg SVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCj4gKyAqIElNUExJ RUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZLAo+ICsgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9O SU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKPiArICogVEhFIEFVVEhPUlMgT1IgQ09Q WVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIK PiArICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsIEFSSVNJTkcKPiArICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUwo+ICsgKiBJTiBU SEUgU09GVFdBUkUuCj4gKyAqCj4gKyAqIEF1dGhvcnM6Cj4gKyAqICAgIFZpbml0IEF6YWQgPHZp bml0LmF6YWRAaW50ZWwuY29tPgo+ICsgKiAgICBCZW4gV2lkYXdza3kgPGJlbkBid2lkYXdzay5u ZXQ+Cj4gKyAqICAgIERhdmUgR29yZG9uIDxkYXZpZC5zLmdvcmRvbkBpbnRlbC5jb20+Cj4gKyAq ICAgIEFsZXggRGFpIDx5dS5kYWlAaW50ZWwuY29tPgo+ICsgKi8KPiArI2luY2x1ZGUgPGxpbnV4 L2Zpcm13YXJlLmg+Cj4gKyNpbmNsdWRlICJpOTE1X2Rydi5oIgo+ICsjaW5jbHVkZSAiaW50ZWxf Z3VjLmgiCj4gKwo+ICsvKioKPiArICogRE9DOiBHdUMKPiArICoKPiArICogaW50ZWxfZ3VjOgo+ ICsgKiBUb3AgbGV2ZWwgc3RydWN0dXJlIG9mIGd1Yy4gSXQgaGFuZGxlcyBmaXJtd2FyZSBsb2Fk aW5nIGFuZCBtYW5hZ2VzIGNsaWVudAo+ICsgKiBwb29sIGFuZCBkb29yYmVsbHMuIGludGVsX2d1 YyBvd25zIGEgaTkxNV9ndWNfY2xpZW50IHRvIHJlcGxhY2UgdGhlIGxlZ2FjeQo+ICsgKiBFeGVj TGlzdCBzdWJtaXNzaW9uLgo+ICsgKgo+ICsgKiBGaXJtd2FyZSB2ZXJzaW9uaW5nOgo+ICsgKiBU aGUgZmlybXdhcmUgYnVpbGQgcHJvY2VzcyB3aWxsIGdlbmVyYXRlIGEgdmVyc2lvbiBoZWFkZXIg ZmlsZSB3aXRoIG1ham9yIGFuZAo+ICsgKiBtaW5vciB2ZXJzaW9uIGRlZmluZWQuIFRoZSB2ZXJz aW9ucyBhcmUgYnVpbHQgaW50byBDU1MgaGVhZGVyIG9mIGZpcm13YXJlLgo+ICsgKiBpOTE1IGtl cm5lbCBkcml2ZXIgc2V0IHRoZSBtaW5pbWFsIGZpcm13YXJlIHZlcnNpb24gcmVxdWlyZWQgcGVy IHBsYXRmb3JtLgo+ICsgKiBUaGUgZmlybXdhcmUgaW5zdGFsbGF0aW9uIHBhY2thZ2Ugd2lsbCBp bnN0YWxsIChzeW1ib2xpYyBsaW5rKSBwcm9wZXIgdmVyc2lvbgo+ICsgKiBvZiBmaXJtd2FyZS4K PiArICoKPiArICogR3VDIGFkZHJlc3Mgc3BhY2U6Cj4gKyAqIEd1QyBkb2VzIG5vdCBhbGxvdyBh bnkgZ2Z4IEdHVFQgYWRkcmVzcyB0aGF0IGZhbGxzIGludG8gcmFuZ2UgWzAsIFdPUENNX1RPUCks Cj4gKyAqIHdoaWNoIGlzIHJlc2VydmVkIGZvciBCb290IFJPTSwgU1JBTSBhbmQgV09QQ00uIEN1 cnJlbnRseSB0aGlzIHRvcCBhZGRyZXNzIGlzCj4gKyAqIDUxMksuIEluIG9yZGVyIHRvIGV4Y2x1 ZGUgMC01MTJLIGFkZHJlc3Mgc3BhY2UgZnJvbSBHR1RULCBhbGwgZ2Z4IG9iamVjdHMKPiArICog dXNlZCBieSBHdUMgaXMgcGlubmVkIHdpdGggUElOX09GRlNFVF9CSUFTIGFsb25nIHdpdGggc2l6 ZSBvZiBXT1BDTS4KPiArICoKPiArICogRmlybXdhcmUgbG9nOgo+ICsgKiBGaXJtd2FyZSBsb2cg aXMgZW5hYmxlZCBieSBzZXR0aW5nIGk5MTUuZ3VjX2xvZ19sZXZlbCB0byBub24tbmVnYXRpdmUg bGV2ZWwuCj4gKyAqIExvZyBkYXRhIGlzIHByaW50ZWQgb3V0IHZpYSByZWFkaW5nIGRlYnVnZnMg aTkxNV9ndWNfbG9nX2R1bXAuIFJlYWRpbmcgZnJvbQo+ICsgKiBpOTE1X2d1Y19sb2FkX3N0YXR1 cyB3aWxsIHByaW50IG91dCBmaXJtd2FyZSBsb2FkaW5nIHN0YXR1cyBhbmQgc2NyYXRjaAo+ICsg KiByZWdpc3RlcnMgdmFsdWUuCj4gKyAqCj4gKyAqLwo+ICsKPiArI2RlZmluZSBJOTE1X1NLTF9H VUNfVUNPREUgImk5MTUvc2tsX2d1Y192ZXIzLmJpbiIKPiArTU9EVUxFX0ZJUk1XQVJFKEk5MTVf U0tMX0dVQ19VQ09ERSk7Cj4gKwo+ICtzdGF0aWMgdTMyIGdldF9ndHR5cGUoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQo+ICt7Cj4gKwkvKiBYWFg6IEdUIHR5cGUgYmFzZWQgb24g UENJIGRldmljZSBJRD8gZmllbGQgc2VlbXMgdW51c2VkIGJ5IGZ3ICovCj4gKwlyZXR1cm4gMDsK PiArfQo+ICsKPiArc3RhdGljIHUzMiBnZXRfY29yZV9mYW1pbHkoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KQo+ICt7Cj4gKwlzd2l0Y2ggKElOVEVMX0lORk8oZGV2X3ByaXYpLT5n ZW4pIHsKPiArCWNhc2UgODoKPiArCQlyZXR1cm4gR0ZYQ09SRV9GQU1JTFlfR0VOODsKPiArCWNh c2UgOToKPiArCQlyZXR1cm4gR0ZYQ09SRV9GQU1JTFlfR0VOOTsKPiArCWRlZmF1bHQ6Cj4gKwkJ RFJNX0VSUk9SKCJHVUM6IHVua25vd24gZ2VuIGZvciBzY2hlZHVsZXIgaW5pdFxuIik7Cj4gKwkJ cmV0dXJuIEdGWENPUkVfRkFNSUxZX0ZPUkNFX1VMT05HOwo+ICsJfQo+ICt9Cj4gKwo+ICtzdGF0 aWMgdm9pZCBzZXRfZ3VjX2luaXRfcGFyYW1zKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdikKPiArewo+ICsJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gJmRldl9wcml2LT5ndWM7Cj4g Kwl1MzIgcGFyYW1zW0dVQ19DVExfTUFYX0RXT1JEU107Cj4gKwlpbnQgaTsKPiArCj4gKwltZW1z ZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwo+ICsKPiArCXBhcmFtc1tHVUNfQ1RMX0RF VklDRV9JTkZPXSB8PQo+ICsJCShnZXRfZ3R0eXBlKGRldl9wcml2KSA8PCBHVUNfQ1RMX0dUVFlQ RV9TSElGVCkgfAo+ICsJCShnZXRfY29yZV9mYW1pbHkoZGV2X3ByaXYpIDw8IEdVQ19DVExfQ09S RUZBTUlMWV9TSElGVCk7Cj4gKwo+ICsJLyogR3VDIEFSQVQgaW5jcmVtZW50IGlzIDEwIG5zLiBH dUMgZGVmYXVsdCBzY2hlZHVsZXIgcXVhbnR1bSBpcyBvbmUKPiArCSAqIHNlY29uZC4gVGhpcyBB UkFSIGlzIGNhbGN1bGF0ZWQgYnk6Cj4gKwkgKiBTY2hlZHVsZXItUXVhbnR1bS1pbi1ucyAvIEFS QVQtaW5jcmVtZW50LWluLW5zID0gMTAwMDAwMDAwMCAvIDEwCj4gKwkgKi8KPiArCXBhcmFtc1tH VUNfQ1RMX0FSQVRfSElHSF0gPSAwOwo+ICsJcGFyYW1zW0dVQ19DVExfQVJBVF9MT1ddID0gMTAw MDAwMDAwOwo+ICsKPiArCXBhcmFtc1tHVUNfQ1RMX1dBXSB8PSBHVUNfQ1RMX1dBX1VLX0JZX0RS SVZFUjsKPiArCj4gKwlwYXJhbXNbR1VDX0NUTF9GRUFUVVJFXSB8PSBHVUNfQ1RMX0RJU0FCTEVf U0NIRURVTEVSIHwKPiArCQkJR1VDX0NUTF9WQ1MyX0VOQUJMRUQ7Cj4gKwo+ICsJaWYgKGk5MTUu Z3VjX2xvZ19sZXZlbCA+PSAwKSB7Cj4gKwkJcGFyYW1zW0dVQ19DVExfTE9HX1BBUkFNU10gPSBn dWMtPmxvZ19mbGFnczsKPiArCQlwYXJhbXNbR1VDX0NUTF9ERUJVR10gPQo+ICsJCQlpOTE1Lmd1 Y19sb2dfbGV2ZWwgPDwgR1VDX0xPR19WRVJCT1NJVFlfU0hJRlQ7Cj4gKwl9Cj4gKwo+ICsJSTkx NV9XUklURShTT0ZUX1NDUkFUQ0goMCksIDApOwo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBHVUNf Q1RMX01BWF9EV09SRFM7IGkrKykKPiArCQlJOTE1X1dSSVRFKFNPRlRfU0NSQVRDSCgxICsgaSks IHBhcmFtc1tpXSk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIFJlYWQgdGhlIEd1QyBzdGF0dXMgcmVn aXN0ZXIgKEdVQ19TVEFUVVMpIGFuZCBzdG9yZSBpdCBpbiB0aGUKPiArICogc3BlY2lmaWVkIGxv Y2F0aW9uOyB0aGVuIHJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyCj4gKyAqIHRo ZSB2YWx1ZSBtYXRjaGVzIGVpdGhlciBvZiB0d28gdmFsdWVzIHJlcHJlc2VudGluZyBjb21wbGV0 aW9uCj4gKyAqIG9mIHRoZSBHdUMgYm9vdCBwcm9jZXNzLgo+ICsgKgo+ICsgKiBUaGlzIGlzIHVz ZWQgZm9yIHBvbGxpbmcgdGhlIEd1QyBzdGF0dXMgaW4gYSB3YWl0X2Zvcl9hdG9taWMoKQo+ICsg KiBsb29wIGJlbG93Lgo+ICsgKi8KPiArc3RhdGljIGlubGluZSBib29sIGd1Y191Y29kZV9yZXNw b25zZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCj4gKwkJCQkgICAgICB1MzIg KnN0YXR1cykKPiArewo+ICsJdTMyIHZhbCA9IEk5MTVfUkVBRChHVUNfU1RBVFVTKTsKPiArCSpz dGF0dXMgPSB2YWw7Cj4gKwlyZXR1cm4gKCh2YWwgJiBHU19VS0VSTkVMX01BU0spID09IEdTX1VL RVJORUxfUkVBRFkgfHwKPiArCQkodmFsICYgR1NfVUtFUk5FTF9NQVNLKSA9PSBHU19VS0VSTkVM X0xBUElDX0RPTkUpOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUcmFuc2ZlciB0aGUgZmlybXdhcmUg aW1hZ2UgdG8gUkFNIGZvciBleGVjdXRpb24gYnkgdGhlIG1pY3JvY29udHJvbGxlci4KPiArICoK PiArICogR3VDIEZpcm13YXJlIGxheW91dDoKPiArICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0rICAtLS0tCj4gKyAqIHwgICAgICAgICAgQ1NTIGhlYWRlciAgICAgICAgICAgfCAg MTI4Qgo+ICsgKiB8IGNvbnRhaW5zIG1ham9yL21pbm9yIHZlcnNpb24gIHwKPiArICogKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAtLS0tCj4gKyAqIHwgICAgICAgICAgICAgdUNv ZGUgICAgICAgICAgICAgfAo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsg IC0tLS0KPiArICogfCAgICAgICAgIFJTQSBzaWduYXR1cmUgICAgICAgICB8ICAyNTZCCj4gKyAq ICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgLS0tLQo+ICsgKiB8ICAgICAgICAg UlNBIHB1YmxpYyBLZXkgICAgICAgIHwgIDI1NkIKPiArICogKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0rICAtLS0tCj4gKyAqIHwgICAgICAgUHVibGljIGtleSBtb2R1bHVzICAgICAg fCAgICA0Qgo+ICsgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIC0tLS0KPiAr ICoKPiArICogQXJjaGl0ZWN0dXJhbGx5LCB0aGUgRE1BIGVuZ2luZSBpcyBiaWRpcmVjdGlvbmFs LCBhbmQgY2FuIHBvdGVudGlhbGx5IGV2ZW4KPiArICogdHJhbnNmZXIgYmV0d2VlbiBHVFQgbG9j YXRpb25zLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgbGVmdCBvdXQgb2YgdGhlIEFQSQo+ICsgKiBm b3Igbm93IGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGl0Lgo+ICsgKgo+ICsgKiBOb3RlIHRoYXQg R3VDIG5lZWRzIHRoZSBDU1MgaGVhZGVyIHBsdXMgdUtlcm5lbCBjb2RlIHRvIGJlIGNvcGllZCBi eSB0aGUKPiArICogRE1BIGVuZ2luZSBpbiBvbmUgb3BlcmF0aW9uLCB3aGVyZWFzIHRoZSBSU0Eg c2lnbmF0dXJlIGlzIGxvYWRlZCB2aWEgTU1JTy4KPiArICovCj4gKwo+ICsjZGVmaW5lIFVPU19D U1NfSEVBREVSX09GRlNFVAkJMAo+ICsjZGVmaW5lIFVPU19WRVJfTUlOT1JfT0ZGU0VUCQkweDQ0 Cj4gKyNkZWZpbmUgVU9TX1ZFUl9NQUpPUl9PRkZTRVQJCTB4NDYKPiArI2RlZmluZSBVT1NfQ1NT X0hFQURFUl9TSVpFCQkweDgwCj4gKyNkZWZpbmUgVU9TX1JTQV9TSUdfU0laRQkJMHgxMDAKPiAr I2RlZmluZSBVT1NfQ1NTX1NJR05JTkdfU0laRQkJMHgyMDQKPiArCj4gK3N0YXRpYyBpbnQgZ3Vj X3Vjb2RlX3hmZXJfZG1hKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKPiArewo+ ICsJc3RydWN0IGludGVsX3VjX2Z3ICpndWNfZncgPSAmZGV2X3ByaXYtPmd1Yy5ndWNfZnc7Cj4g KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqZndfb2JqID0gZ3VjX2Z3LT51Y19md19vYmo7 Cj4gKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKPiArCXN0cnVjdCBzZ190YWJsZSAqc2cgPSBmd19v YmotPnBhZ2VzOwo+ICsJdTMyIHN0YXR1cywgdWNvZGVfc2l6ZSwgcnNhW1VPU19SU0FfU0lHX1NJ WkUgLyBzaXplb2YodTMyKV07Cj4gKwlpbnQgaSwgcmV0ID0gMDsKPiArCj4gKwkvKiB1Q29kZSBz aXplLCBhbHNvIGlzIHdoZXJlIFJTQSBzaWduYXR1cmUgc3RhcnRzICovCj4gKwlvZmZzZXQgPSB1 Y29kZV9zaXplID0gZ3VjX2Z3LT51Y19md19zaXplIC0gVU9TX0NTU19TSUdOSU5HX1NJWkU7Cj4g Kwo+ICsJLyogQ29weSBSU0Egc2lnbmF0dXJlIGZyb20gdGhlIGZ3IGltYWdlIHRvIEhXIGZvciB2 ZXJpZmljYXRpb24gKi8KPiArCXNnX3Bjb3B5X3RvX2J1ZmZlcihzZy0+c2dsLCBzZy0+bmVudHMs IHJzYSwgVU9TX1JTQV9TSUdfU0laRSwgb2Zmc2V0KTsKPiArCWZvciAoaSA9IDA7IGkgPCBVT1Nf UlNBX1NJR19TSVpFIC8gc2l6ZW9mKHUzMik7IGkrKykKPiArCQlJOTE1X1dSSVRFKFVPU19SU0Ff U0NSQVRDSF8wICsgaSAqIHNpemVvZih1MzIpLCByc2FbaV0pOwo+ICsKPiArCS8qIFNldCB0aGUg c291cmNlIGFkZHJlc3MgZm9yIHRoZSBuZXcgYmxvYiAqLwo+ICsJb2Zmc2V0ID0gaTkxNV9nZW1f b2JqX2dndHRfb2Zmc2V0KGZ3X29iaik7Cj4gKwlJOTE1X1dSSVRFKERNQV9BRERSXzBfTE9XLCBs b3dlcl8zMl9iaXRzKG9mZnNldCkpOwo+ICsJSTkxNV9XUklURShETUFfQUREUl8wX0hJR0gsIHVw cGVyXzMyX2JpdHMob2Zmc2V0KSAmIDB4RkZGRik7Cj4gKwo+ICsJLyogU2V0IHRoZSBkZXN0aW5h dGlvbi4gQ3VycmVudCB1Q29kZSBleHBlY3RzIGFuIDhrIHN0YWNrIHN0YXJ0aW5nIGZyb20KPiAr CSAqIG9mZnNldCAwLiAqLwo+ICsJSTkxNV9XUklURShETUFfQUREUl8xX0xPVywgMHgyMDAwKTsK PiArCj4gKwkvKiBYWFg6IFRoZSBpbWFnZSBpcyBhdXRvbWF0aWNhbGx5IHRyYW5zZmVyZWQgdG8g U1JBTSBhZnRlciB0aGUgUlNBCj4gKwkgKiB2ZXJpZmljYXRpb24uIFRoaXMgaXMgd2h5IHRoZSBh ZGRyZXNzIHNwYWNlIGlzIGNob3NlbiBhcyBzdWNoLiAqLwo+ICsJSTkxNV9XUklURShETUFfQURE Ul8xX0hJR0gsIERNQV9BRERSRVNTX1NQQUNFX1dPUENNKTsKPiArCj4gKwlJOTE1X1dSSVRFKERN QV9DT1BZX1NJWkUsIHVjb2RlX3NpemUpOwo+ICsKPiArCS8qIEZpbmFsbHkgc3RhcnQgdGhlIERN QSAqLwo+ICsJSTkxNV9XUklURShETUFfQ1RSTCwgX01BU0tFRF9CSVRfRU5BQkxFKFVPU19NT1ZF IHwgU1RBUlRfRE1BKSk7Cj4gKwo+ICsJLyoKPiArCSAqIFNwaW4td2FpdCBmb3IgdGhlIERNQSB0 byBjb21wbGV0ZSAmIHRoZSBHdUMgdG8gc3RhcnQgdXAuCj4gKwkgKiBOQjogRG9jcyByZWNvbW1l bmQgbm90IHVzaW5nIHRoZSBpbnRlcnJ1cHQgZm9yIGNvbXBsZXRpb24uCj4gKwkgKiBNZWFzdXJl bWVudHMgaW5kaWNhdGUgdGhpcyBzaG91bGQgdGFrZSBubyBtb3JlIHRoYW4gMjBtcywgc28gYQo+ ICsJICogdGltZW91dCBoZXJlIGluZGljYXRlcyB0aGF0IHRoZSBHdUMgaGFzIGZhaWxlZCBhbmQg aXMgdW51c2FibGUuCj4gKwkgKiAoSGlnaGVyIGxldmVscyBvZiB0aGUgZHJpdmVyIHdpbGwgYXR0 ZW1wdCB0byBmYWxsIGJhY2sgdG8KPiArCSAqIGV4ZWNsaXN0IG1vZGUgaWYgdGhpcyBoYXBwZW5z LikKPiArCSAqLwo+ICsJcmV0ID0gd2FpdF9mb3JfYXRvbWljKGd1Y191Y29kZV9yZXNwb25zZShk ZXZfcHJpdiwgJnN0YXR1cyksIDEwMCk7Cj4gKwo+ICsJRFJNX0RFQlVHX0RSSVZFUigiRE1BIHN0 YXR1cyAweCV4LCBHdUMgc3RhdHVzIDB4JXhcbiIsCj4gKwkJCUk5MTVfUkVBRChETUFfQ1RSTCks IHN0YXR1cyk7Cj4gKwo+ICsJaWYgKChzdGF0dXMgJiBHU19CT09UUk9NX01BU0spID09IEdTX0JP T1RST01fUlNBX0ZBSUxFRCkgewo+ICsJCURSTV9FUlJPUigiJXMgZmlybXdhcmUgc2lnbmF0dXJl IHZlcmlmaWNhdGlvbiBmYWlsZWRcbiIsCj4gKwkJCWd1Y19mdy0+dWNfbmFtZSk7Cj4gKwkJcmV0 ID0gLUVOT0VYRUM7Cj4gKwl9Cj4gKwo+ICsJRFJNX0RFQlVHX0RSSVZFUigicmV0dXJuaW5nICVk XG4iLCByZXQpOwo+ICsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gKy8qCj4gKyAqIExvYWQg dGhlIEd1QyBmaXJtd2FyZSBibG9iIGludG8gdGhlIE1pbnV0ZUlBLgo+ICsgKi8KPiArc3RhdGlj IGludCBndWNfdWNvZGVfeGZlcihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCj4g K3sKPiArCXN0cnVjdCBpbnRlbF91Y19mdyAqZ3VjX2Z3ID0gJmRldl9wcml2LT5ndWMuZ3VjX2Z3 Owo+ICsJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGRldl9wcml2LT5kZXY7Cj4gKwlpbnQgcmV0 Owo+ICsKPiArCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihndWNfZnct PnVjX2Z3X29iaiwgZmFsc2UpOwo+ICsJaWYgKHJldCkgewo+ICsJCURSTV9ERUJVR19EUklWRVIo InNldC1kb21haW4gZmFpbGVkICVkXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4g Kwo+ICsJcmV0ID0gaTkxNV9nZW1fb2JqX2dndHRfcGluKGd1Y19mdy0+dWNfZndfb2JqLCAwLCAw KTsKPiArCWlmIChyZXQpIHsKPiArCQlEUk1fREVCVUdfRFJJVkVSKCJwaW4gZmFpbGVkICVkXG4i LCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJV0FSTl9PTighbXV0ZXhfaXNf bG9ja2VkKCZkZXYtPnN0cnVjdF9tdXRleCkpOwo+ICsJaW50ZWxfdW5jb3JlX2ZvcmNld2FrZV9n ZXQoZGV2X3ByaXYsIEZPUkNFV0FLRV9BTEwpOwo+ICsKPiArCS8qIGluaXQgV09QQ00gKi8KPiAr CUk5MTVfV1JJVEUoR1VDX1dPUENNX1NJWkUsIEdVQ19XT1BDTV9TSVpFX1ZBTFVFKTsKPiArCUk5 MTVfV1JJVEUoRE1BX0dVQ19XT1BDTV9PRkZTRVQsIEdVQ19XT1BDTV9PRkZTRVQpOwo+ICsKPiAr CS8qIEludmFsaWRhdGUgR3VDIFRMQiB0byBsZXQgR3VDIHRha2UgdGhlIGxhdGVzdCB1cGRhdGVz IHRvIEdUVC4gKi8KPiArCUk5MTVfV1JJVEUoR0VOOF9HVENSLCBHRU44X0dUQ1JfSU5WQUxJREFU RSk7Cj4gKwo+ICsJLyogU2V0IE1NSU8vV0EgZm9yIEd1QyBpbml0ICovCj4gKwlJOTE1X1dSSVRF KERSQk1JU0MxLCBET09SQkVMTF9FTkFCTEUpOwo+ICsKPiArCS8qIEVuYWJsZSBNSUEgY2FjaGlu Zy4gR3VDIGNsb2NrIGdhdGluZyBpcyBkaXNhYmxlZC4gKi8KPiArCUk5MTVfV1JJVEUoR1VDX1NI SU1fQ09OVFJPTCwgR1VDX1NISU1fQ09OVFJPTF9WQUxVRSk7Cj4gKwo+ICsJLyogV2FDNkRpc2Fs bG93QnlHZnhQYXVzZSovCj4gKwlJOTE1X1dSSVRFKEdFTjZfR0ZYUEFVU0UsIDB4MzBGRkYpOwo+ ICsKPiArCWlmIChJU19TS1lMQUtFKGRldikpCj4gKwkJSTkxNV9XUklURShHRU45X0dUX1BNX0NP TkZJRywgR0VOOF9HVF9ET09SQkVMTF9FTkFCTEUpOwo+ICsJZWxzZQo+ICsJCUk5MTVfV1JJVEUo R0VOOF9HVF9QTV9DT05GSUcsIEdFTjhfR1RfRE9PUkJFTExfRU5BQkxFKTsKPiArCj4gKwlpZiAo SVNfR0VOOShkZXYpKSB7Cj4gKwkJLyogRE9QIENsb2NrIEdhdGluZyBFbmFibGUgZm9yIEd1QyBj bG9ja3MgKi8KPiArCQlJOTE1X1dSSVRFKEdFTjdfTUlTQ0NQQ1RMLCAoR0VOOF9ET1BfQ0xPQ0tf R0FURV9HVUNfRU5BQkxFIHwKPiArCQkJCQkgICAgSTkxNV9SRUFEKEdFTjdfTUlTQ0NQQ1RMKSkp Owo+ICsKPiArCQkvKiBhbGxvd3MgZm9yIDV1cyBiZWZvcmUgR1QgY2FuIGdvIHRvIFJDNiAqLwo+ ICsJCUk5MTVfV1JJVEUoR1VDX0FSQVRfQzZESVMsIDB4MUZGKTsKPiArCX0KPiArCj4gKwlzZXRf Z3VjX2luaXRfcGFyYW1zKGRldl9wcml2KTsKPiArCj4gKwlyZXQgPSBndWNfdWNvZGVfeGZlcl9k bWEoZGV2X3ByaXYpOwo+ICsKPiArCWludGVsX3VuY29yZV9mb3JjZXdha2VfcHV0KGRldl9wcml2 LCBGT1JDRVdBS0VfQUxMKTsKPiArCj4gKwkvKgo+ICsJICogV2Uga2VlcCB0aGUgb2JqZWN0IHBh Z2VzIGZvciByZXVzZSBkdXJpbmcgcmVzdW1lLiBCdXQgd2UgY2FuIHVucGluIGl0Cj4gKwkgKiBu b3cgdGhhdCBETUEgaGFzIGNvbXBsZXRlZCwgc28gaXQgZG9lc24ndCBjb250aW51ZSB0byB0YWtl IHVwIHNwYWNlLgo+ICsJICovCj4gKwlpOTE1X2dlbV9vYmplY3RfZ2d0dF91bnBpbihndWNfZnct PnVjX2Z3X29iaik7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoKPiArICogQ2hl Y2sgdGhlIGZpcm13YXJlIHRoYXQgd2FzIGZvdW5kOyBpZiBpdCdzIHRoZSB3cm9uZyBzaXplIG9y IHRoZSB3cm9uZwo+ICsgKiB2ZXJzaW9uLCByZXR1cm4gYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiBJ ZiBpdCdzIE9LLCByZXR1cm4gYSBwb3NpdGl2ZQo+ICsgKiBzdGF0dXMgdmFsdWUuIEhlcmUgd2Ug Y2FuIGp1c3QgcmV0dXJuIElOVEVMX1VDX0ZXX0dPT0Q7IHRoZSBjb21tb24gbG9hZGVyCj4gKyAq IGNvZGUgd2lsbCB0aGVuIHNhdmUgdGhlIGRhdGEgZm9yIGxhdGVyIGluIGEgcGFnZWFibGUgKHRt cGZzLWJhY2tlZCkgR0VNCj4gKyAqIG9iamVjdC4KPiArICoKPiArICogQWx0ZXJuYXRpdmVseSAo Zm9yIGV4YW1wbGUgaWYgd2Ugd2FudGVkIG9ubHkgcGFydCBvZiB0aGUgaW1hZ2UpIHdlIGNvdWxk Cj4gKyAqIHNhdmUgdGhlIHJlcXVpcmVkIHBvcnRpb24gaGVyZSBhbmQgdGhlbiByZXR1cm4gSU5U RUxfVUNfRldfU0FWRUQgdG8gdGVsbAo+ICsgKiB0aGUgY29tbW9uIGxvYWRlciB0aGF0IHRoZSBk YXRhIGlzIGdvb2QsIGFuZCB3ZSd2ZSBhbHJlYWR5IGhhbmRsZWQgc2F2aW5nCj4gKyAqIGFueXRo aW5nIHdlIG5lZWQgbGF0ZXIuCj4gKyAqCj4gKyAqIFRoZSBHdUMgZmlybXdhcmUgaW1hZ2UgaGFz IHRoZSB2ZXJzaW9uIG51bWJlciBlbWJlZGRlZCBhdCBhIHdlbGwta25vd24KPiArICogb2Zmc2V0 IHdpdGhpbiB0aGUgZmlybXdhcmUgYmxvYjsgbm90ZSB0aGF0IG1ham9yIC8gbWlub3IgdmVyc2lv biBhcmUKPiArICogVFdPIGJ5dGVzIGVhY2ggKGkuZS4gdTE2KSwgYWx0aG91Z2ggYWxsIHBvaW50 ZXJzIGFuZCBvZmZzZXRzIGFyZSBkZWZpbmVkCj4gKyAqIGluIHRlcm1zIG9mIGJ5dGVzICh1OCku Cj4gKyAqLwo+ICtzdGF0aWMgaW50IGd1Y191Y29kZV9jaGVjayhzdHJ1Y3QgaW50ZWxfdWNfZncg Kmd1Y19mdykKPiArewo+ICsJc3RydWN0IGludGVsX2d1YyAqZ3VjID0gY29udGFpbmVyX29mKGd1 Y19mdywgc3RydWN0IGludGVsX2d1YywgZ3VjX2Z3KTsKPiArCWNvbnN0IHU4ICpjc3NfaGVhZGVy ID0gZ3VjX2Z3LT51Y19md19ibG9iLT5kYXRhICsgVU9TX0NTU19IRUFERVJfT0ZGU0VUOwo+ICsJ Y29uc3Qgc2l6ZV90IGJsb2JzaXplID0gZ3VjX2Z3LT51Y19md19ibG9iLT5zaXplOwo+ICsJY29u c3Qgc2l6ZV90IG1pbnNpemUgPSBVT1NfQ1NTX0hFQURFUl9TSVpFICsgVU9TX0NTU19TSUdOSU5H X1NJWkU7Cj4gKwljb25zdCBzaXplX3QgbWF4c2l6ZSA9IEdVQ19XT1BDTV9TSVpFX1ZBTFVFICsg VU9TX0NTU19TSUdOSU5HX1NJWkUKPiArCQkJLSAweDgwMDA7IC8qIDMyayByZXNlcnZlZCAoOEsg c3RhY2sgKyAyNGsgY29udGV4dCkgKi8KPiArCj4gKwlEUk1fREVCVUdfRFJJVkVSKCJmaXJtd2Fy ZSBmaWxlIHNpemUgJXp1IChtaW5pbXVtICV6dSwgbWF4aW11bSAlenUpXG4iLAo+ICsJCWJsb2Jz aXplLCBtaW5zaXplLCBtYXhzaXplKTsKPiArCj4gKwkvKiBDaGVjayB0aGUgc2l6ZSBvZiB0aGUg YmxvYiBiZWZvZSBleGFtaW5pbmcgYnVmZmVyIGNvbnRlbnRzICovCj4gKwlpZiAoYmxvYnNpemUg PCBtaW5zaXplIHx8IGJsb2JzaXplID4gbWF4c2l6ZSkKPiArCQlyZXR1cm4gLUVOT0VYRUM7Cj4g Kwo+ICsJZ3VjLT5md19tYWpvcl9mb3VuZCA9ICoodTE2ICopKGNzc19oZWFkZXIgKyBVT1NfVkVS X01BSk9SX09GRlNFVCk7Cj4gKwlndWMtPmZ3X21pbm9yX2ZvdW5kID0gKih1MTYgKikoY3NzX2hl YWRlciArIFVPU19WRVJfTUlOT1JfT0ZGU0VUKTsKPiArCj4gKwlpZiAoZ3VjLT5md19tYWpvcl9m b3VuZCAhPSBndWMtPmZ3X21ham9yX3dhbnRlZCB8fAo+ICsJICAgIGd1Yy0+ZndfbWlub3JfZm91 bmQgPCBndWMtPmZ3X21pbm9yX3dhbnRlZCkgewo+ICsJCURSTV9FUlJPUigiR3VDIGZpcm13YXJl IHZlcnNpb24gJWQuJWQsIHJlcXVpcmVkICVkLiVkXG4iLAo+ICsJCQlndWMtPmZ3X21ham9yX2Zv dW5kLCBndWMtPmZ3X21pbm9yX2ZvdW5kLAo+ICsJCQlndWMtPmZ3X21ham9yX3dhbnRlZCwgZ3Vj LT5md19taW5vcl93YW50ZWQpOwo+ICsJCXJldHVybiAtRU5PRVhFQzsKPiArCX0KPiArCj4gKwlE Uk1fREVCVUdfRFJJVkVSKCJmaXJtd2FyZSB2ZXJzaW9uICVkLiVkIE9LIChtaW5pbXVtICVkLiVk KVxuIiwKPiArCQkJZ3VjLT5md19tYWpvcl9mb3VuZCwgZ3VjLT5md19taW5vcl9mb3VuZCwKPiAr CQkJZ3VjLT5md19tYWpvcl93YW50ZWQsIGd1Yy0+ZndfbWlub3Jfd2FudGVkKTsKPiArCj4gKwly ZXR1cm4gSU5URUxfVUNfRldfR09PRDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGludGVsX2d1Y191 Y29kZV9pbml0KCkgLSBpbml0aWF0ZSBhIGZpcm13YXJlIGxvYWRpbmcgcmVxdWVzdAo+ICsgKgo+ ICsgKiBDYWxsZWQgZWFybHkgZHVyaW5nIGRyaXZlciBsb2FkLCBiZWZvcmUgR0VNIGlzIGluaXRp YWxpc2VkLgo+ICsgKiBEcml2ZXIgaXMgc2luZ2xlIHRocmVhZGVkLCBzbyBubyBtdXRleCBpcyBy ZXF1aXJlZC4KPiArICoKPiArICogVGhpcyBqdXN0IHNldHMgcGFyYW1ldGVycyBmb3IgdXNlIHdo ZW4gaW50ZWxfZ3VjX3Vjb2RlX2xvYWQoKQo+ICsgKiBpcyBjYWxsZWQgbGF0ZXIsIGFmdGVyIEdF TSBpbml0aWFsaXNhdGlvbiBpcyBjb21wbGV0ZS4KPiArICovCj4gK3ZvaWQgaW50ZWxfZ3VjX3Vj b2RlX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKPiArCXN0cnVjdCBpbnRlbF9n dWMgKmd1YyA9ICZkZXZfcHJpdi0+Z3VjOwo+ICsJc3RydWN0IGludGVsX3VjX2Z3ICpndWNfZncg PSAmZ3VjLT5ndWNfZnc7Cj4gKwljb25zdCBjaGFyICpwYXRoOwo+ICsKPiArCWlmICghSEFTX0dV Q19TQ0hFRChkZXYpKQo+ICsJCWk5MTUuZW5hYmxlX2d1Y19zdWJtaXNzaW9uID0gZmFsc2U7Cj4g Kwo+ICsJaWYgKCFIQVNfR1VDX1VDT0RFKGRldikpIHsKPiArCQlwYXRoID0gTlVMTDsKPiArCX0g ZWxzZSBpZiAoSVNfU0tZTEFLRShkZXYpKSB7Cj4gKwkJcGF0aCA9IEk5MTVfU0tMX0dVQ19VQ09E RTsKPiArCQlndWMtPmZ3X21ham9yX3dhbnRlZCA9IDM7Cj4gKwkJZ3VjLT5md19taW5vcl93YW50 ZWQgPSAwOwo+ICsJfSBlbHNlIHsKPiArCQlpOTE1LmVuYWJsZV9ndWNfc3VibWlzc2lvbiA9IGZh bHNlOwo+ICsJCXBhdGggPSAiIjsJLyogdW5rbm93biBkZXZpY2UgKi8KPiArCX0KPiArCj4gKwlp bnRlbF91Y19md19pbml0KGRldiwgZ3VjX2Z3LCAiR3VDIiwgcGF0aCk7Cj4gK30KPiArCj4gKy8q Kgo+ICsgKiBpbnRlbF9ndWNfdWNvZGVfbG9hZCgpIC0gbG9hZCBHdUMgdUNvZGUgaW50byB0aGUg ZGV2aWNlCj4gKyAqCj4gKyAqIENhbGxlZCBmcm9tIGdlbV9pbml0X2h3KCkgZHVyaW5nIGRyaXZl ciBsb2FkaW5nIGFuZCBhbHNvIGFmdGVyIGEgR1BVIHJlc2V0Lgo+ICsgKgo+ICsgKiBDYWxscyB0 aGUgY29tbW9uIGxvYWRlciB0byBnZXQgdGhlIGZpcm13YXJlIHJlZ2lzdGVyZWQgZWFybGllci4g T24gdGhlIGZpcnN0Cj4gKyAqIGNhbGwsIHRoaXMgd2lsbCBhY3R1YWxseSBmZXRjaCBpdCBmcm9t IHRoZSBmaWxlc3lzdGVtOyB0aGVyZWFmdGVyLCB3ZSB3aWxsCj4gKyAqIGFscmVhZHkgZWl0aGVy IGhhdmUgdGhlIGJsb2IgaW4gYSBHRU0gb2JqZWN0LCBvciBoYXZlIGRldGVybWluZWQgdGhhdCBu bwo+ICsgKiB2YWxpZCBmaXJtd2FyZSBpbWFnZSBjb3VsZCBiZSBmb3VuZCkuCj4gKyAqCj4gKyAq IElmIHdlIGhhdmUgYSBnb29kIGZpcm13YXJlIGltYWdlLCB0cmFuc2ZlciBpdCB0byB0aGUgaC93 Lgo+ICsgKi8KPiAraW50IGludGVsX2d1Y191Y29kZV9sb2FkKHN0cnVjdCBkcm1fZGV2aWNlICpk ZXYpCj4gK3sKPiArCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2 X3ByaXZhdGU7Cj4gKwlzdHJ1Y3QgaW50ZWxfdWNfZncgKmd1Y19mdyA9ICZkZXZfcHJpdi0+Z3Vj Lmd1Y19mdzsKPiArCWludCBlcnI7Cj4gKwo+ICsJRFJNX0RFQlVHX0RSSVZFUigiJXMgZncgc3Rh dHVzOiBmZXRjaCAlcywgbG9hZCAlc1xuIiwKPiArCQlndWNfZnctPnVjX25hbWUsCj4gKwkJaW50 ZWxfdWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3LT51Y19md19mZXRjaF9zdGF0dXMpLAo+ICsJCWlu dGVsX3VjX2Z3X3N0YXR1c19yZXByKGd1Y19mdy0+dWNfZndfbG9hZF9zdGF0dXMpKTsKPiArCj4g KwlpZiAoZ3VjX2Z3LT51Y19md19mZXRjaF9zdGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfTk9O RSkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlpZiAoZ3VjX2Z3LT51Y19md19mZXRjaF9zdGF0dXMg PT0gSU5URUxfVUNfRklSTVdBUkVfU1VDQ0VTUyAmJgo+ICsJICAgIGd1Y19mdy0+dWNfZndfbG9h ZF9zdGF0dXMgPT0gSU5URUxfVUNfRklSTVdBUkVfRkFJTCkKPiArCQlyZXR1cm4gLUVOT0VYRUM7 Cj4gKwo+ICsJZ3VjX2Z3LT51Y19md19sb2FkX3N0YXR1cyA9IElOVEVMX1VDX0ZJUk1XQVJFX1BF TkRJTkc7Cj4gKwllcnIgPSBpbnRlbF91Y19md19mZXRjaChndWNfZncsIGd1Y191Y29kZV9jaGVj ayk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZmFpbDsKPiArCj4gKwllcnIgPSBndWNfdWNvZGVf eGZlcihkZXZfcHJpdik7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZmFpbDsKPiArCj4gKwlndWNf ZnctPnVjX2Z3X2xvYWRfc3RhdHVzID0gSU5URUxfVUNfRklSTVdBUkVfU1VDQ0VTUzsKPiArCj4g KwlEUk1fREVCVUdfRFJJVkVSKCIlcyBmdyBzdGF0dXM6IGZldGNoICVzLCBsb2FkICVzXG4iLAo+ ICsJCWd1Y19mdy0+dWNfbmFtZSwKPiArCQlpbnRlbF91Y19md19zdGF0dXNfcmVwcihndWNfZnct PnVjX2Z3X2ZldGNoX3N0YXR1cyksCj4gKwkJaW50ZWxfdWNfZndfc3RhdHVzX3JlcHIoZ3VjX2Z3 LT51Y19md19sb2FkX3N0YXR1cykpOwo+ICsKPiArCXJldHVybiAwOwo+ICsKPiArZmFpbDoKPiAr CWlmIChndWNfZnctPnVjX2Z3X2xvYWRfc3RhdHVzID09IElOVEVMX1VDX0ZJUk1XQVJFX1BFTkRJ TkcpCj4gKwkJZ3VjX2Z3LT51Y19md19sb2FkX3N0YXR1cyA9IElOVEVMX1VDX0ZJUk1XQVJFX0ZB SUw7Cj4gKwo+ICsJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBHdUMsIGVycm9yICVk XG4iLCBlcnIpOwo+ICsKPiArCXJldHVybiBlcnI7Cj4gK30KPiArCj4gKy8qKgo+ICsgKiBpbnRl bF9ndWNfdWNvZGVfZmluaSgpIC0gY2xlYW4gdXAgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMKPiAr ICovCj4gK3ZvaWQgaW50ZWxfZ3VjX3Vjb2RlX2Zpbmkoc3RydWN0IGRybV9kZXZpY2UgKmRldikK PiArewo+ICsJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJp dmF0ZTsKPiArCXN0cnVjdCBpbnRlbF91Y19mdyAqZ3VjX2Z3ID0gJmRldl9wcml2LT5ndWMuZ3Vj X2Z3Owo+ICsKPiArCWludGVsX3VjX2Z3X2ZpbmkoZ3VjX2Z3KTsKPiArfQo+IC0tIAo+IDEuOS4x Cj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiBJ bnRlbC1nZnggbWFpbGluZyBsaXN0Cj4gSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwo+ IGh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK Ci0tIApEYW5pZWwgVmV0dGVyClNvZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpo dHRwOi8vYmxvZy5mZndsbC5jaApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lu dGVsLWdmeAo=