From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oleksandr Andrushchenko Subject: Re: [PATCH 6/8] xen/gntdev: Implement dma-buf export functionality Date: Thu, 31 May 2018 08:55:27 +0300 Message-ID: <072fb651-52db-05bd-d110-ada904bcac3d@gmail.com> References: <20180525153331.31188-1-andr2000@gmail.com> <20180525153331.31188-7-andr2000@gmail.com> <20180530231006.GA2929@downor-Z87X-UD5H> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from mail-lf0-x241.google.com (mail-lf0-x241.google.com [IPv6:2a00:1450:4010:c07::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 5FD306E179 for ; Thu, 31 May 2018 05:55:31 +0000 (UTC) Received: by mail-lf0-x241.google.com with SMTP id 36-v6so5937210lfr.11 for ; Wed, 30 May 2018 22:55:31 -0700 (PDT) In-Reply-To: <20180530231006.GA2929@downor-Z87X-UD5H> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Dongwon Kim Cc: jgross@suse.com, konrad.wilk@oracle.com, Oleksandr Andrushchenko , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, daniel.vetter@intel.com, xen-devel@lists.xenproject.org, boris.ostrovsky@oracle.com, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gMDUvMzEvMjAxOCAwMjoxMCBBTSwgRG9uZ3dvbiBLaW0gd3JvdGU6Cj4gT24gRnJpLCBNYXkg MjUsIDIwMTggYXQgMDY6MzM6MjlQTSArMDMwMCwgT2xla3NhbmRyIEFuZHJ1c2hjaGVua28gd3Jv dGU6Cj4+IEZyb206IE9sZWtzYW5kciBBbmRydXNoY2hlbmtvIDxvbGVrc2FuZHJfYW5kcnVzaGNo ZW5rb0BlcGFtLmNvbT4KPj4KPj4gMS4gQ3JlYXRlIGEgZG1hLWJ1ZiBmcm9tIGdyYW50IHJlZmVy ZW5jZXMgcHJvdmlkZWQgYnkgdGhlIGZvcmVpZ24KPj4gICAgIGRvbWFpbi4gQnkgZGVmYXVsdCBk bWEtYnVmIGlzIGJhY2tlZCBieSBzeXN0ZW0gbWVtb3J5IHBhZ2VzLCBidXQKPj4gICAgIGJ5IHBy b3ZpZGluZyBHTlRERVZfRE1BX0ZMQUdfWFhYIGZsYWdzIGl0IGNhbiBhbHNvIGJlIGNyZWF0ZWQK Pj4gICAgIGFzIGEgRE1BIHdyaXRlLWNvbWJpbmUvY29oZXJlbnQgYnVmZmVyLCBlLmcuIGFsbG9j YXRlZCB3aXRoCj4+ICAgICBjb3JyZXNwb25kaW5nIGRtYV9hbGxvY194eHggQVBJLgo+PiAgICAg RXhwb3J0IHRoZSByZXN1bHRpbmcgYnVmZmVyIGFzIGEgbmV3IGRtYS1idWYuCj4+Cj4+IDIuIElt cGxlbWVudCB3YWl0aW5nIGZvciB0aGUgZG1hLWJ1ZiB0byBiZSByZWxlYXNlZDogYmxvY2sgdW50 aWwgdGhlCj4+ICAgICBkbWEtYnVmIHdpdGggdGhlIGZpbGUgZGVzY3JpcHRvciBwcm92aWRlZCBp cyByZWxlYXNlZC4KPj4gICAgIElmIHdpdGhpbiB0aGUgdGltZS1vdXQgcHJvdmlkZWQgdGhlIGJ1 ZmZlciBpcyBub3QgcmVsZWFzZWQgdGhlbgo+PiAgICAgLUVUSU1FRE9VVCBlcnJvciBpcyByZXR1 cm5lZC4gSWYgdGhlIGJ1ZmZlciB3aXRoIHRoZSBmaWxlIGRlc2NyaXB0b3IKPj4gICAgIGRvZXMg bm90IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGJlZW4gcmVsZWFzZWQsIHRoZW4gLUVOT0VOVCBpcyBy ZXR1cm5lZC4KPj4gICAgIEZvciB2YWxpZCBmaWxlIGRlc2NyaXB0b3JzIHRoaXMgbXVzdCBub3Qg YmUgdHJlYXRlZCBhcyBlcnJvci4KPj4KPj4gU2lnbmVkLW9mZi1ieTogT2xla3NhbmRyIEFuZHJ1 c2hjaGVua28gPG9sZWtzYW5kcl9hbmRydXNoY2hlbmtvQGVwYW0uY29tPgo+PiAtLS0KPj4gICBk cml2ZXJzL3hlbi9nbnRkZXYuYyB8IDQ3OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKystCj4+ICAgMSBmaWxlIGNoYW5nZWQsIDQ3NiBpbnNlcnRpb25zKCspLCAyIGRl bGV0aW9ucygtKQo+Pgo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZ250ZGV2LmMgYi9kcml2 ZXJzL3hlbi9nbnRkZXYuYwo+PiBpbmRleCA5ZTQ1MDYyMmFmMWEuLjUyYWJjNmNkNTg0NiAxMDA2 NDQKPj4gLS0tIGEvZHJpdmVycy94ZW4vZ250ZGV2LmMKPj4gKysrIGIvZHJpdmVycy94ZW4vZ250 ZGV2LmMKPj4gQEAgLTQsNiArNCw4IEBACj4+ICAgICogRGV2aWNlIGZvciBhY2Nlc3NpbmcgKGlu IHVzZXItc3BhY2UpIHBhZ2VzIHRoYXQgaGF2ZSBiZWVuIGdyYW50ZWQgYnkgb3RoZXIKPj4gICAg KiBkb21haW5zLgo+PiAgICAqCj4+ICsgKiBETUEgYnVmZmVyIGltcGxlbWVudGF0aW9uIGlzIGJh c2VkIG9uIGRyaXZlcnMvZ3B1L2RybS9kcm1fcHJpbWUuYy4KPj4gKyAqCj4+ICAgICogQ29weXJp Z2h0IChjKSAyMDA2LTIwMDcsIEQgRyBNdXJyYXkuCj4+ICAgICogICAgICAgICAgIChjKSAyMDA5 IEdlcmQgSG9mZm1hbm4gPGtyYXhlbEByZWRoYXQuY29tPgo+PiAgICAqICAgICAgICAgICAoYykg MjAxOCBPbGVrc2FuZHIgQW5kcnVzaGNoZW5rbywgRVBBTSBTeXN0ZW1zIEluYy4KPj4gQEAgLTQx LDYgKzQzLDkgQEAKPj4gICAjaWZkZWYgQ09ORklHX1hFTl9HUkFOVF9ETUFfQUxMT0MKPj4gICAj aW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+Cj4+ICAgI2VuZGlmCj4+ICsjaWZkZWYgQ09ORklH X1hFTl9HTlRERVZfRE1BQlVGCj4+ICsjaW5jbHVkZSA8bGludXgvZG1hLWJ1Zi5oPgo+PiArI2Vu ZGlmCj4+ICAgCj4+ICAgI2luY2x1ZGUgPHhlbi94ZW4uaD4KPj4gICAjaW5jbHVkZSA8eGVuL2dy YW50X3RhYmxlLmg+Cj4+IEBAIC04MSw2ICs4NiwxNyBAQCBzdHJ1Y3QgZ250ZGV2X3ByaXYgewo+ PiAgIAkvKiBEZXZpY2UgZm9yIHdoaWNoIERNQSBtZW1vcnkgaXMgYWxsb2NhdGVkLiAqLwo+PiAg IAlzdHJ1Y3QgZGV2aWNlICpkbWFfZGV2Owo+PiAgICNlbmRpZgo+PiArCj4+ICsjaWZkZWYgQ09O RklHX1hFTl9HTlRERVZfRE1BQlVGCj4+ICsJLyogUHJpdmF0ZSBkYXRhIG9mIHRoZSBoeXBlciBE TUEgYnVmZmVycy4gKi8KPj4gKwo+PiArCS8qIExpc3Qgb2YgZXhwb3J0ZWQgRE1BIGJ1ZmZlcnMu ICovCj4+ICsJc3RydWN0IGxpc3RfaGVhZCBkbWFidWZfZXhwX2xpc3Q7Cj4+ICsJLyogTGlzdCBv ZiB3YWl0IG9iamVjdHMuICovCj4+ICsJc3RydWN0IGxpc3RfaGVhZCBkbWFidWZfZXhwX3dhaXRf bGlzdDsKPj4gKwkvKiBUaGlzIGlzIHRoZSBsb2NrIHdoaWNoIHByb3RlY3RzIGRtYV9idWZfeHh4 IGxpc3RzLiAqLwo+PiArCXN0cnVjdCBtdXRleCBkbWFidWZfbG9jazsKPj4gKyNlbmRpZgo+PiAg IH07Cj4+ICAgCj4+ICAgc3RydWN0IHVubWFwX25vdGlmeSB7Cj4+IEBAIC0xMjUsMTIgKzE0MSwz OCBAQCBzdHJ1Y3QgZ3JhbnRfbWFwIHsKPj4gICAKPj4gICAjaWZkZWYgQ09ORklHX1hFTl9HTlRE RVZfRE1BQlVGCj4+ICAgc3RydWN0IHhlbl9kbWFidWYgewo+PiArCXN0cnVjdCBnbnRkZXZfcHJp diAqcHJpdjsKPj4gKwlzdHJ1Y3QgZG1hX2J1ZiAqZG1hYnVmOwo+PiArCXN0cnVjdCBsaXN0X2hl YWQgbmV4dDsKPj4gKwlpbnQgZmQ7Cj4+ICsKPj4gICAJdW5pb24gewo+PiArCQlzdHJ1Y3Qgewo+ PiArCQkJLyogRXhwb3J0ZWQgYnVmZmVycyBhcmUgcmVmZXJlbmNlIGNvdW50ZWQuICovCj4+ICsJ CQlzdHJ1Y3Qga3JlZiByZWZjb3VudDsKPj4gKwkJCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKPj4g KwkJfSBleHA7Cj4+ICAgCQlzdHJ1Y3Qgewo+PiAgIAkJCS8qIEdyYW50ZWQgcmVmZXJlbmNlcyBv ZiB0aGUgaW1wb3J0ZWQgYnVmZmVyLiAqLwo+PiAgIAkJCWdyYW50X3JlZl90ICpyZWZzOwo+PiAg IAkJfSBpbXA7Cj4+ICAgCX0gdTsKPj4gKwo+PiArCS8qIE51bWJlciBvZiBwYWdlcyB0aGlzIGJ1 ZmZlciBoYXMuICovCj4+ICsJaW50IG5yX3BhZ2VzOwo+PiArCS8qIFBhZ2VzIG9mIHRoaXMgYnVm ZmVyLiAqLwo+PiArCXN0cnVjdCBwYWdlICoqcGFnZXM7Cj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3Qg eGVuX2RtYWJ1Zl93YWl0X29iaiB7Cj4+ICsJc3RydWN0IGxpc3RfaGVhZCBuZXh0Owo+PiArCXN0 cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmOwo+PiArCXN0cnVjdCBjb21wbGV0aW9uIGNvbXBs ZXRpb247Cj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgeGVuX2RtYWJ1Zl9hdHRhY2htZW50IHsKPj4g KwlzdHJ1Y3Qgc2dfdGFibGUgKnNndDsKPj4gKwllbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXI7 Cj4+ICAgfTsKPj4gICAjZW5kaWYKPj4gICAKPj4gQEAgLTMyMCw2ICszNjIsMTYgQEAgc3RhdGlj IHZvaWQgZ250ZGV2X3B1dF9tYXAoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBzdHJ1Y3QgZ3Jh bnRfbWFwICptYXApCj4+ICAgCWdudGRldl9mcmVlX21hcChtYXApOwo+PiAgIH0KPj4gICAKPj4g KyNpZmRlZiBDT05GSUdfWEVOX0dOVERFVl9ETUFCVUYKPj4gK3N0YXRpYyB2b2lkIGdudGRldl9y ZW1vdmVfbWFwKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwgc3RydWN0IGdyYW50X21hcCAqbWFw KQo+PiArewo+PiArCW11dGV4X2xvY2soJnByaXYtPmxvY2spOwo+PiArCWxpc3RfZGVsKCZtYXAt Pm5leHQpOwo+PiArCWdudGRldl9wdXRfbWFwKE5VTEwgLyogYWxyZWFkeSByZW1vdmVkICovLCBt YXApOwo+PiArCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7Cj4+ICt9Cj4+ICsjZW5kaWYKPj4g Kwo+PiAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLSAqLwo+PiAgIAo+PiAgIHN0YXRpYyBpbnQgZmluZF9ncmFudF9w dGVzKHB0ZV90ICpwdGUsIHBndGFibGVfdCB0b2tlbiwKPj4gQEAgLTYyOCw2ICs2ODAsMTIgQEAg c3RhdGljIGludCBnbnRkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAq ZmxpcCkKPj4gICAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPmZyZWVhYmxlX21hcHMpOwo+PiAgIAlt dXRleF9pbml0KCZwcml2LT5sb2NrKTsKPj4gICAKPj4gKyNpZmRlZiBDT05GSUdfWEVOX0dOVERF Vl9ETUFCVUYKPj4gKwltdXRleF9pbml0KCZwcml2LT5kbWFidWZfbG9jayk7Cj4+ICsJSU5JVF9M SVNUX0hFQUQoJnByaXYtPmRtYWJ1Zl9leHBfbGlzdCk7Cj4+ICsJSU5JVF9MSVNUX0hFQUQoJnBy aXYtPmRtYWJ1Zl9leHBfd2FpdF9saXN0KTsKPj4gKyNlbmRpZgo+PiArCj4+ICAgCWlmICh1c2Vf cHRlbW9kKSB7Cj4+ICAgCQlwcml2LT5tbSA9IGdldF90YXNrX21tKGN1cnJlbnQpOwo+PiAgIAkJ aWYgKCFwcml2LT5tbSkgewo+PiBAQCAtMTA1MywxNyArMTExMSw0MzMgQEAgc3RhdGljIGxvbmcg Z250ZGV2X2lvY3RsX2dyYW50X2NvcHkoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCB2b2lkIF9f dXNlciAqdSkKPj4gICAvKiBETUEgYnVmZmVyIGV4cG9ydCBzdXBwb3J0LiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KPj4gICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KPj4gICAK Pj4gKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLSAqLwo+PiArLyogSW1wbGVtZW50YXRpb24gb2Ygd2FpdCBmb3IgZXhw b3J0ZWQgRE1BIGJ1ZmZlciB0byBiZSByZWxlYXNlZC4gICAgICovCj4+ICsvKiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g Ki8KPj4gKwo+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9yZWxlYXNlKHN0cnVjdCBrcmVmICpr cmVmKTsKPj4gKwo+PiArc3RhdGljIHN0cnVjdCB4ZW5fZG1hYnVmX3dhaXRfb2JqICoKPj4gK2Rt YWJ1Zl9leHBfd2FpdF9vYmpfbmV3KHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwKPj4gKwkJCXN0 cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmKQo+PiArewo+PiArCXN0cnVjdCB4ZW5fZG1hYnVm X3dhaXRfb2JqICpvYmo7Cj4+ICsKPj4gKwlvYmogPSBremFsbG9jKHNpemVvZigqb2JqKSwgR0ZQ X0tFUk5FTCk7Cj4+ICsJaWYgKCFvYmopCj4+ICsJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwo+ PiArCj4+ICsJaW5pdF9jb21wbGV0aW9uKCZvYmotPmNvbXBsZXRpb24pOwo+PiArCW9iai0+eGVu X2RtYWJ1ZiA9IHhlbl9kbWFidWY7Cj4+ICsKPj4gKwltdXRleF9sb2NrKCZwcml2LT5kbWFidWZf bG9jayk7Cj4+ICsJbGlzdF9hZGQoJm9iai0+bmV4dCwgJnByaXYtPmRtYWJ1Zl9leHBfd2FpdF9s aXN0KTsKPj4gKwkvKiBQdXQgb3VyIHJlZmVyZW5jZSBhbmQgd2FpdCBmb3IgeGVuX2RtYWJ1Zidz IHJlbGVhc2UgdG8gZmlyZS4gKi8KPj4gKwlrcmVmX3B1dCgmeGVuX2RtYWJ1Zi0+dS5leHAucmVm Y291bnQsIGRtYWJ1Zl9leHBfcmVsZWFzZSk7Cj4+ICsJbXV0ZXhfdW5sb2NrKCZwcml2LT5kbWFi dWZfbG9jayk7Cj4+ICsJcmV0dXJuIG9iajsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZG1h YnVmX2V4cF93YWl0X29ial9mcmVlKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwKPj4gKwkJCQkg ICAgIHN0cnVjdCB4ZW5fZG1hYnVmX3dhaXRfb2JqICpvYmopCj4+ICt7Cj4+ICsJc3RydWN0IHhl bl9kbWFidWZfd2FpdF9vYmogKmN1cl9vYmosICpxOwo+PiArCj4+ICsJbXV0ZXhfbG9jaygmcHJp di0+ZG1hYnVmX2xvY2spOwo+PiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjdXJfb2JqLCBx LCAmcHJpdi0+ZG1hYnVmX2V4cF93YWl0X2xpc3QsIG5leHQpCj4+ICsJCWlmIChjdXJfb2JqID09 IG9iaikgewo+PiArCQkJbGlzdF9kZWwoJm9iai0+bmV4dCk7Cj4+ICsJCQlrZnJlZShvYmopOwo+ PiArCQkJYnJlYWs7Cj4+ICsJCX0KPj4gKwltdXRleF91bmxvY2soJnByaXYtPmRtYWJ1Zl9sb2Nr KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBkbWFidWZfZXhwX3dhaXRfb2JqX3dhaXQoc3Ry dWN0IHhlbl9kbWFidWZfd2FpdF9vYmogKm9iaiwKPj4gKwkJCQkgICAgdTMyIHdhaXRfdG9fbXMp Cj4+ICt7Cj4+ICsJaWYgKHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmb2JqLT5jb21wbGV0 aW9uLAo+PiArCQkJbXNlY3NfdG9famlmZmllcyh3YWl0X3RvX21zKSkgPD0gMCkKPj4gKwkJcmV0 dXJuIC1FVElNRURPVVQ7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGlj IHZvaWQgZG1hYnVmX2V4cF93YWl0X29ial9zaWduYWwoc3RydWN0IGdudGRldl9wcml2ICpwcml2 LAo+PiArCQkJCSAgICAgICBzdHJ1Y3QgeGVuX2RtYWJ1ZiAqeGVuX2RtYWJ1ZikKPj4gK3sKPj4g KwlzdHJ1Y3QgeGVuX2RtYWJ1Zl93YWl0X29iaiAqb2JqLCAqcTsKPj4gKwo+PiArCWxpc3RfZm9y X2VhY2hfZW50cnlfc2FmZShvYmosIHEsICZwcml2LT5kbWFidWZfZXhwX3dhaXRfbGlzdCwgbmV4 dCkKPj4gKwkJaWYgKG9iai0+eGVuX2RtYWJ1ZiA9PSB4ZW5fZG1hYnVmKSB7Cj4+ICsJCQlwcl9k ZWJ1ZygiRm91bmQgeGVuX2RtYWJ1ZiBpbiB0aGUgd2FpdCBsaXN0LCB3YWtlXG4iKTsKPj4gKwkJ CWNvbXBsZXRlX2FsbCgmb2JqLT5jb21wbGV0aW9uKTsKPj4gKwkJfQo+PiArfQo+PiArCj4+ICtz dGF0aWMgc3RydWN0IHhlbl9kbWFidWYgKgo+PiArZG1hYnVmX2V4cF93YWl0X29ial9nZXRfYnlf ZmQoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBpbnQgZmQpCj4+ICt7Cj4+ICsJc3RydWN0IHhl bl9kbWFidWYgKnEsICp4ZW5fZG1hYnVmLCAqcmV0ID0gRVJSX1BUUigtRU5PRU5UKTsKPj4gKwo+ PiArCW11dGV4X2xvY2soJnByaXYtPmRtYWJ1Zl9sb2NrKTsKPj4gKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUoeGVuX2RtYWJ1ZiwgcSwgJnByaXYtPmRtYWJ1Zl9leHBfbGlzdCwgbmV4dCkKPj4g KwkJaWYgKHhlbl9kbWFidWYtPmZkID09IGZkKSB7Cj4+ICsJCQlwcl9kZWJ1ZygiRm91bmQgeGVu X2RtYWJ1ZiBpbiB0aGUgd2FpdCBsaXN0XG4iKTsKPj4gKwkJCWtyZWZfZ2V0KCZ4ZW5fZG1hYnVm LT51LmV4cC5yZWZjb3VudCk7Cj4+ICsJCQlyZXQgPSB4ZW5fZG1hYnVmOwo+PiArCQkJYnJlYWs7 Cj4+ICsJCX0KPj4gKwltdXRleF91bmxvY2soJnByaXYtPmRtYWJ1Zl9sb2NrKTsKPj4gKwlyZXR1 cm4gcmV0Owo+PiArfQo+PiArCj4+ICAgc3RhdGljIGludCBkbWFidWZfZXhwX3dhaXRfcmVsZWFz ZWQoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBpbnQgZmQsCj4+ICAgCQkJCSAgICBpbnQgd2Fp dF90b19tcykKPj4gICB7Cj4+IC0JcmV0dXJuIC1FVElNRURPVVQ7Cj4+ICsJc3RydWN0IHhlbl9k bWFidWYgKnhlbl9kbWFidWY7Cj4+ICsJc3RydWN0IHhlbl9kbWFidWZfd2FpdF9vYmogKm9iajsK Pj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJcHJfZGVidWcoIldpbGwgd2FpdCBmb3IgZG1hLWJ1ZiB3 aXRoIGZkICVkXG4iLCBmZCk7Cj4+ICsJLyoKPj4gKwkgKiBUcnkgdG8gZmluZCB0aGUgRE1BIGJ1 ZmZlcjogaWYgbm90IGZvdW5kIG1lYW5zIHRoYXQKPj4gKwkgKiBlaXRoZXIgdGhlIGJ1ZmZlciBo YXMgYWxyZWFkeSBiZWVuIHJlbGVhc2VkIG9yIGZpbGUgZGVzY3JpcHRvcgo+PiArCSAqIHByb3Zp ZGVkIGlzIHdyb25nLgo+PiArCSAqLwo+PiArCXhlbl9kbWFidWYgPSBkbWFidWZfZXhwX3dhaXRf b2JqX2dldF9ieV9mZChwcml2LCBmZCk7Cj4+ICsJaWYgKElTX0VSUih4ZW5fZG1hYnVmKSkKPj4g KwkJcmV0dXJuIFBUUl9FUlIoeGVuX2RtYWJ1Zik7Cj4+ICsKPj4gKwkvKgo+PiArCSAqIHhlbl9k bWFidWYgc3RpbGwgZXhpc3RzIGFuZCBpcyByZWZlcmVuY2UgY291bnQgbG9ja2VkIGJ5IHVzIG5v dywKPj4gKwkgKiBzbyBwcmVwYXJlIHRvIHdhaXQ6IGFsbG9jYXRlIHdhaXQgb2JqZWN0IGFuZCBh ZGQgaXQgdG8gdGhlIHdhaXQgbGlzdCwKPj4gKwkgKiBzbyB3ZSBjYW4gZmluZCBpdCBvbiByZWxl YXNlLgo+PiArCSAqLwo+PiArCW9iaiA9IGRtYWJ1Zl9leHBfd2FpdF9vYmpfbmV3KHByaXYsIHhl bl9kbWFidWYpOwo+PiArCWlmIChJU19FUlIob2JqKSkgewo+PiArCQlwcl9lcnIoIkZhaWxlZCB0 byBzZXR1cCB3YWl0IG9iamVjdCwgcmV0ICVsZFxuIiwgUFRSX0VSUihvYmopKTsKPj4gKwkJcmV0 dXJuIFBUUl9FUlIob2JqKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXQgPSBkbWFidWZfZXhwX3dhaXRf b2JqX3dhaXQob2JqLCB3YWl0X3RvX21zKTsKPj4gKwlkbWFidWZfZXhwX3dhaXRfb2JqX2ZyZWUo cHJpdiwgb2JqKTsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICsvKiAtLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0g Ki8KPj4gKy8qIERNQSBidWZmZXIgZXhwb3J0IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAqLwo+PiArLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCj4+ICsKPj4gK3N0YXRp YyBzdHJ1Y3Qgc2dfdGFibGUgKgo+PiArZG1hYnVmX3BhZ2VzX3RvX3NndChzdHJ1Y3QgcGFnZSAq KnBhZ2VzLCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMpCj4+ICt7Cj4+ICsJc3RydWN0IHNnX3RhYmxl ICpzZ3Q7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCXNndCA9IGttYWxsb2Moc2l6ZW9mKCpzZ3Qp LCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIXNndCkgewo+PiArCQlyZXQgPSAtRU5PTUVNOwo+PiAr CQlnb3RvIG91dDsKPj4gKwl9Cj4+ICsKPj4gKwlyZXQgPSBzZ19hbGxvY190YWJsZV9mcm9tX3Bh Z2VzKHNndCwgcGFnZXMsIG5yX3BhZ2VzLCAwLAo+PiArCQkJCQlucl9wYWdlcyA8PCBQQUdFX1NI SUZULAo+PiArCQkJCQlHRlBfS0VSTkVMKTsKPj4gKwlpZiAocmV0KQo+PiArCQlnb3RvIG91dDsK Pj4gKwo+PiArCXJldHVybiBzZ3Q7Cj4+ICsKPj4gK291dDoKPj4gKwlrZnJlZShzZ3QpOwo+PiAr CXJldHVybiBFUlJfUFRSKHJldCk7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgZG1hYnVmX2V4 cF9vcHNfYXR0YWNoKHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAo+PiArCQkJCSBzdHJ1Y3QgZGV2 aWNlICp0YXJnZXRfZGV2LAo+PiArCQkJCSBzdHJ1Y3QgZG1hX2J1Zl9hdHRhY2htZW50ICphdHRh Y2gpCj4+ICt7Cj4+ICsJc3RydWN0IHhlbl9kbWFidWZfYXR0YWNobWVudCAqeGVuX2RtYWJ1Zl9h dHRhY2g7Cj4+ICsKPj4gKwl4ZW5fZG1hYnVmX2F0dGFjaCA9IGt6YWxsb2Moc2l6ZW9mKCp4ZW5f ZG1hYnVmX2F0dGFjaCksIEdGUF9LRVJORUwpOwo+PiArCWlmICgheGVuX2RtYWJ1Zl9hdHRhY2gp Cj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJeGVuX2RtYWJ1Zl9hdHRhY2gtPmRpciA9 IERNQV9OT05FOwo+PiArCWF0dGFjaC0+cHJpdiA9IHhlbl9kbWFidWZfYXR0YWNoOwo+PiArCS8q IE1pZ2h0IG5lZWQgdG8gcGluIHRoZSBwYWdlcyBvZiB0aGUgYnVmZmVyIG5vdy4gKi8KPj4gKwly ZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9vcHNfZGV0YWNo KHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAo+PiArCQkJCSAgc3RydWN0IGRtYV9idWZfYXR0YWNo bWVudCAqYXR0YWNoKQo+PiArewo+PiArCXN0cnVjdCB4ZW5fZG1hYnVmX2F0dGFjaG1lbnQgKnhl bl9kbWFidWZfYXR0YWNoID0gYXR0YWNoLT5wcml2Owo+PiArCj4+ICsJaWYgKHhlbl9kbWFidWZf YXR0YWNoKSB7Cj4+ICsJCXN0cnVjdCBzZ190YWJsZSAqc2d0ID0geGVuX2RtYWJ1Zl9hdHRhY2gt PnNndDsKPj4gKwo+PiArCQlpZiAoc2d0KSB7Cj4+ICsJCQlpZiAoeGVuX2RtYWJ1Zl9hdHRhY2gt PmRpciAhPSBETUFfTk9ORSkKPj4gKwkJCQlkbWFfdW5tYXBfc2dfYXR0cnMoYXR0YWNoLT5kZXYs IHNndC0+c2dsLAo+PiArCQkJCQkJICAgc2d0LT5uZW50cywKPj4gKwkJCQkJCSAgIHhlbl9kbWFi dWZfYXR0YWNoLT5kaXIsCj4+ICsJCQkJCQkgICBETUFfQVRUUl9TS0lQX0NQVV9TWU5DKTsKPj4g KwkJCXNnX2ZyZWVfdGFibGUoc2d0KTsKPj4gKwkJfQo+PiArCj4+ICsJCWtmcmVlKHNndCk7Cj4+ ICsJCWtmcmVlKHhlbl9kbWFidWZfYXR0YWNoKTsKPj4gKwkJYXR0YWNoLT5wcml2ID0gTlVMTDsK Pj4gKwl9Cj4+ICsJLyogTWlnaHQgbmVlZCB0byB1bnBpbiB0aGUgcGFnZXMgb2YgdGhlIGJ1ZmZl ciBub3cuICovCj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1Y3Qgc2dfdGFibGUgKgo+PiArZG1h YnVmX2V4cF9vcHNfbWFwX2RtYV9idWYoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNo LAo+PiArCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyKQo+PiArewo+PiArCXN0cnVj dCB4ZW5fZG1hYnVmX2F0dGFjaG1lbnQgKnhlbl9kbWFidWZfYXR0YWNoID0gYXR0YWNoLT5wcml2 Owo+PiArCXN0cnVjdCB4ZW5fZG1hYnVmICp4ZW5fZG1hYnVmID0gYXR0YWNoLT5kbWFidWYtPnBy aXY7Cj4+ICsJc3RydWN0IHNnX3RhYmxlICpzZ3Q7Cj4+ICsKPj4gKwlwcl9kZWJ1ZygiTWFwcGlu ZyAlZCBwYWdlcyBmb3IgZGV2ICVwXG4iLCB4ZW5fZG1hYnVmLT5ucl9wYWdlcywKPj4gKwkJIGF0 dGFjaC0+ZGV2KTsKPj4gKwo+PiArCWlmIChXQVJOX09OKGRpciA9PSBETUFfTk9ORSB8fCAheGVu X2RtYWJ1Zl9hdHRhY2gpKQo+PiArCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKPj4gKwo+PiAr CS8qIFJldHVybiB0aGUgY2FjaGVkIG1hcHBpbmcgd2hlbiBwb3NzaWJsZS4gKi8KPj4gKwlpZiAo eGVuX2RtYWJ1Zl9hdHRhY2gtPmRpciA9PSBkaXIpCj4+ICsJCXJldHVybiB4ZW5fZG1hYnVmX2F0 dGFjaC0+c2d0Owo+IG1heSBuZWVkIHRvIGNoZWNrIHhlbl9kbWFidWZfYXR0YWNoLT5zZ3QgPT0g TlVMTCAoaS5lLiBmaXJzdCB0aW1lIG1hcHBpbmcpPwo+IEFsc28sIEkgYW0gbm90IHN1cmUgaWYg dGhpcyBtZWNoYW5pc20gb2YgcmV1c2luZyBwcmV2aW91c2x5IGdlbmVyYXRlZCBzZ3QKPiBmb3Ig b3RoZXIgbWFwcGluZ3MgaXMgdW5pdmVyc2FsbHkgb2sgZm9yIGFueSB1c2UtY2FzZXMuLi4gSSBk b24ndCBrbm93IGlmCj4gaXQgaXMgYWNjZXB0YWJsZSBhcyBwZXIgdGhlIHNwZWNpZmljYXRpb24u CldlbGwsIEkgd2FzIG5vdCBzdXJlIGFib3V0IHRoaXMgcGllY2Ugb2YgY29kZSBhcyB3ZWxsLApz byBJJ2xsIHByb2JhYmx5IGFsbG9jYXRlIGEgbmV3IHNndCBlYWNoIHRpbWUgYW5kIGRvIG5vdCBy ZXVzZSBpdAphcyBub3cKPj4gKwo+PiArCS8qCj4+ICsJICogVHdvIG1hcHBpbmdzIHdpdGggZGlm ZmVyZW50IGRpcmVjdGlvbnMgZm9yIHRoZSBzYW1lIGF0dGFjaG1lbnQgYXJlCj4+ICsJICogbm90 IGFsbG93ZWQuCj4+ICsJICovCj4+ICsJaWYgKFdBUk5fT04oeGVuX2RtYWJ1Zl9hdHRhY2gtPmRp ciAhPSBETUFfTk9ORSkpCj4+ICsJCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Cj4+ICsKPj4gKwlz Z3QgPSBkbWFidWZfcGFnZXNfdG9fc2d0KHhlbl9kbWFidWYtPnBhZ2VzLCB4ZW5fZG1hYnVmLT5u cl9wYWdlcyk7Cj4+ICsJaWYgKCFJU19FUlIoc2d0KSkgewo+PiArCQlpZiAoIWRtYV9tYXBfc2df YXR0cnMoYXR0YWNoLT5kZXYsIHNndC0+c2dsLCBzZ3QtPm5lbnRzLCBkaXIsCj4+ICsJCQkJICAg ICAgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQykpIHsKPj4gKwkJCXNnX2ZyZWVfdGFibGUoc2d0KTsK Pj4gKwkJCWtmcmVlKHNndCk7Cj4+ICsJCQlzZ3QgPSBFUlJfUFRSKC1FTk9NRU0pOwo+PiArCQl9 IGVsc2Ugewo+PiArCQkJeGVuX2RtYWJ1Zl9hdHRhY2gtPnNndCA9IHNndDsKPj4gKwkJCXhlbl9k bWFidWZfYXR0YWNoLT5kaXIgPSBkaXI7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsJaWYgKElTX0VSUihz Z3QpKQo+PiArCQlwcl9lcnIoIkZhaWxlZCB0byBtYXAgc2cgdGFibGUgZm9yIGRldiAlcFxuIiwg YXR0YWNoLT5kZXYpOwo+PiArCXJldHVybiBzZ3Q7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IGRtYWJ1Zl9leHBfb3BzX3VubWFwX2RtYV9idWYoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAq YXR0YWNoLAo+PiArCQkJCQkgc3RydWN0IHNnX3RhYmxlICpzZ3QsCj4+ICsJCQkJCSBlbnVtIGRt YV9kYXRhX2RpcmVjdGlvbiBkaXIpCj4+ICt7Cj4+ICsJLyogTm90IGltcGxlbWVudGVkLiBUaGUg dW5tYXAgaXMgZG9uZSBhdCBkbWFidWZfZXhwX29wc19kZXRhY2goKS4gKi8KPiBOb3Qgc3VyZSBp ZiBpdCdzIG9rIHRvIGRvIG5vdGhpbmcgaGVyZSBiZWNhdXNlIHRoZSBzcGVjIHNheXMgdGhpcyBm dW5jdGlvbiBpcwo+IG1hbmRhdG9yeSBhbmQgaXQgc2hvdWxkIHVubWFwIGFuZCAicmVsZWFzZSIg JnNnX3RhYmxlIGFzc29jaWF0ZWQgd2l0aCBpdC4KPgo+IAkvKioKPiAJICogQHVubWFwX2RtYV9i dWY6Cj4gCSAqCj4gCSAqIFRoaXMgaXMgY2FsbGVkIGJ5IGRtYV9idWZfdW5tYXBfYXR0YWNobWVu dCgpIGFuZCBzaG91bGQgdW5tYXAgYW5kCj4gCSAqIHJlbGVhc2UgdGhlICZzZ190YWJsZSBhbGxv Y2F0ZWQgaW4gQG1hcF9kbWFfYnVmLCBhbmQgaXQgaXMgbWFuZGF0b3J5Lgo+IAkgKiBJdCBzaG91 bGQgYWxzbyB1bnBpbiB0aGUgYmFja2luZyBzdG9yYWdlIGlmIHRoaXMgaXMgdGhlIGxhc3QgbWFw cGluZwo+IAkgKiBvZiB0aGUgRE1BIGJ1ZmZlciwgaXQgdGhlIGV4cG9ydGVyIHN1cHBvcnRzIGJh Y2tpbmcgc3RvcmFnZQo+IAkgKiBtaWdyYXRpb24uCj4gCSAqLwpZZXMsIGFzIEkgc2F5IGF0IHRo ZSB0b3Agb2YgdGhlIGZpbGUgZG1hLWJ1ZiBoYW5kbGluZyBpcyBEUk0gUFJJTUUKYmFzZWQsIHNv IEkgaGF2ZSB0aGUgd29ya2Zsb3cganVzdCBsaWtlIGluIHRoZXJlLgpEbyB5b3UgdGhpbmsgd2Ug aGF2ZSB0byBiZSBtb3JlIHN0cmljdCBhbmQgcmV3b3JrIHRoaXM/CgpEYW5pZWwsIHdoYXQgZG8g eW91IHRoaW5rPwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBkbWFidWZfZXhwX3JlbGVhc2Uo c3RydWN0IGtyZWYgKmtyZWYpCj4+ICt7Cj4+ICsJc3RydWN0IHhlbl9kbWFidWYgKnhlbl9kbWFi dWYgPQo+PiArCQljb250YWluZXJfb2Yoa3JlZiwgc3RydWN0IHhlbl9kbWFidWYsIHUuZXhwLnJl ZmNvdW50KTsKPj4gKwo+PiArCWRtYWJ1Zl9leHBfd2FpdF9vYmpfc2lnbmFsKHhlbl9kbWFidWYt PnByaXYsIHhlbl9kbWFidWYpOwo+PiArCWxpc3RfZGVsKCZ4ZW5fZG1hYnVmLT5uZXh0KTsKPj4g KwlrZnJlZSh4ZW5fZG1hYnVmKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4 cF9vcHNfcmVsZWFzZShzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZikKPj4gK3sKPj4gKwlzdHJ1Y3Qg eGVuX2RtYWJ1ZiAqeGVuX2RtYWJ1ZiA9IGRtYV9idWYtPnByaXY7Cj4+ICsJc3RydWN0IGdudGRl dl9wcml2ICpwcml2ID0geGVuX2RtYWJ1Zi0+cHJpdjsKPj4gKwo+PiArCWdudGRldl9yZW1vdmVf bWFwKHByaXYsIHhlbl9kbWFidWYtPnUuZXhwLm1hcCk7Cj4+ICsJbXV0ZXhfbG9jaygmcHJpdi0+ ZG1hYnVmX2xvY2spOwo+PiArCWtyZWZfcHV0KCZ4ZW5fZG1hYnVmLT51LmV4cC5yZWZjb3VudCwg ZG1hYnVmX2V4cF9yZWxlYXNlKTsKPj4gKwltdXRleF91bmxvY2soJnByaXYtPmRtYWJ1Zl9sb2Nr KTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgKmRtYWJ1Zl9leHBfb3BzX2ttYXBfYXRvbWlj KHN0cnVjdCBkbWFfYnVmICpkbWFfYnVmLAo+PiArCQkJCQl1bnNpZ25lZCBsb25nIHBhZ2VfbnVt KQo+PiArewo+PiArCS8qIE5vdCBpbXBsZW1lbnRlZC4gKi8KPj4gKwlyZXR1cm4gTlVMTDsKPj4g K30KPj4gKwo+PiArc3RhdGljIHZvaWQgZG1hYnVmX2V4cF9vcHNfa3VubWFwX2F0b21pYyhzdHJ1 Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKPj4gKwkJCQkJIHVuc2lnbmVkIGxvbmcgcGFnZV9udW0sIHZv aWQgKmFkZHIpCj4+ICt7Cj4+ICsJLyogTm90IGltcGxlbWVudGVkLiAqLwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgdm9pZCAqZG1hYnVmX2V4cF9vcHNfa21hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1 ZiwKPj4gKwkJCQkgdW5zaWduZWQgbG9uZyBwYWdlX251bSkKPj4gK3sKPj4gKwkvKiBOb3QgaW1w bGVtZW50ZWQuICovCj4+ICsJcmV0dXJuIE5VTEw7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lk IGRtYWJ1Zl9leHBfb3BzX2t1bm1hcChzdHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZiwKPj4gKwkJCQkg IHVuc2lnbmVkIGxvbmcgcGFnZV9udW0sIHZvaWQgKmFkZHIpCj4+ICt7Cj4+ICsJLyogTm90IGlt cGxlbWVudGVkLiAqLwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGRtYWJ1Zl9leHBfb3BzX21t YXAoc3RydWN0IGRtYV9idWYgKmRtYV9idWYsCj4+ICsJCQkgICAgICAgc3RydWN0IHZtX2FyZWFf c3RydWN0ICp2bWEpCj4+ICt7Cj4+ICsJLyogTm90IGltcGxlbWVudGVkLiAqLwo+PiArCXJldHVy biAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRtYV9idWZfb3BzIGRtYWJ1 Zl9leHBfb3BzID0gIHsKPj4gKwkuYXR0YWNoID0gZG1hYnVmX2V4cF9vcHNfYXR0YWNoLAo+PiAr CS5kZXRhY2ggPSBkbWFidWZfZXhwX29wc19kZXRhY2gsCj4+ICsJLm1hcF9kbWFfYnVmID0gZG1h YnVmX2V4cF9vcHNfbWFwX2RtYV9idWYsCj4+ICsJLnVubWFwX2RtYV9idWYgPSBkbWFidWZfZXhw X29wc191bm1hcF9kbWFfYnVmLAo+PiArCS5yZWxlYXNlID0gZG1hYnVmX2V4cF9vcHNfcmVsZWFz ZSwKPj4gKwkubWFwID0gZG1hYnVmX2V4cF9vcHNfa21hcCwKPj4gKwkubWFwX2F0b21pYyA9IGRt YWJ1Zl9leHBfb3BzX2ttYXBfYXRvbWljLAo+PiArCS51bm1hcCA9IGRtYWJ1Zl9leHBfb3BzX2t1 bm1hcCwKPj4gKwkudW5tYXBfYXRvbWljID0gZG1hYnVmX2V4cF9vcHNfa3VubWFwX2F0b21pYywK Pj4gKwkubW1hcCA9IGRtYWJ1Zl9leHBfb3BzX21tYXAsCj4+ICt9Owo+PiArCj4+ICtzdGF0aWMg aW50IGRtYWJ1Zl9leHBvcnQoc3RydWN0IGdudGRldl9wcml2ICpwcml2LCBzdHJ1Y3QgZ3JhbnRf bWFwICptYXAsCj4+ICsJCQkgaW50ICpmZCkKPj4gK3sKPj4gKwlERUZJTkVfRE1BX0JVRl9FWFBP UlRfSU5GTyhleHBfaW5mbyk7Cj4+ICsJc3RydWN0IHhlbl9kbWFidWYgKnhlbl9kbWFidWY7Cj4+ ICsJaW50IHJldCA9IDA7Cj4+ICsKPj4gKwl4ZW5fZG1hYnVmID0ga3phbGxvYyhzaXplb2YoKnhl bl9kbWFidWYpLCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIXhlbl9kbWFidWYpCj4+ICsJCXJldHVy biAtRU5PTUVNOwo+PiArCj4+ICsJa3JlZl9pbml0KCZ4ZW5fZG1hYnVmLT51LmV4cC5yZWZjb3Vu dCk7Cj4+ICsKPj4gKwl4ZW5fZG1hYnVmLT5wcml2ID0gcHJpdjsKPj4gKwl4ZW5fZG1hYnVmLT5u cl9wYWdlcyA9IG1hcC0+Y291bnQ7Cj4+ICsJeGVuX2RtYWJ1Zi0+cGFnZXMgPSBtYXAtPnBhZ2Vz Owo+PiArCXhlbl9kbWFidWYtPnUuZXhwLm1hcCA9IG1hcDsKPj4gKwo+PiArCWV4cF9pbmZvLmV4 cF9uYW1lID0gS0JVSUxEX01PRE5BTUU7Cj4+ICsJaWYgKG1hcC0+ZG1hX2Rldi0+ZHJpdmVyICYm IG1hcC0+ZG1hX2Rldi0+ZHJpdmVyLT5vd25lcikKPj4gKwkJZXhwX2luZm8ub3duZXIgPSBtYXAt PmRtYV9kZXYtPmRyaXZlci0+b3duZXI7Cj4+ICsJZWxzZQo+PiArCQlleHBfaW5mby5vd25lciA9 IFRISVNfTU9EVUxFOwo+PiArCWV4cF9pbmZvLm9wcyA9ICZkbWFidWZfZXhwX29wczsKPj4gKwll eHBfaW5mby5zaXplID0gbWFwLT5jb3VudCA8PCBQQUdFX1NISUZUOwo+PiArCWV4cF9pbmZvLmZs YWdzID0gT19SRFdSOwo+PiArCWV4cF9pbmZvLnByaXYgPSB4ZW5fZG1hYnVmOwo+PiArCj4+ICsJ eGVuX2RtYWJ1Zi0+ZG1hYnVmID0gZG1hX2J1Zl9leHBvcnQoJmV4cF9pbmZvKTsKPj4gKwlpZiAo SVNfRVJSKHhlbl9kbWFidWYtPmRtYWJ1ZikpIHsKPj4gKwkJcmV0ID0gUFRSX0VSUih4ZW5fZG1h YnVmLT5kbWFidWYpOwo+PiArCQl4ZW5fZG1hYnVmLT5kbWFidWYgPSBOVUxMOwo+PiArCQlnb3Rv IGZhaWw7Cj4+ICsJfQo+PiArCj4+ICsJcmV0ID0gZG1hX2J1Zl9mZCh4ZW5fZG1hYnVmLT5kbWFi dWYsIE9fQ0xPRVhFQyk7Cj4+ICsJaWYgKHJldCA8IDApCj4+ICsJCWdvdG8gZmFpbDsKPj4gKwo+ PiArCXhlbl9kbWFidWYtPmZkID0gcmV0Owo+PiArCSpmZCA9IHJldDsKPj4gKwo+PiArCXByX2Rl YnVnKCJFeHBvcnRpbmcgRE1BIGJ1ZmZlciB3aXRoIGZkICVkXG4iLCByZXQpOwo+PiArCj4+ICsJ bXV0ZXhfbG9jaygmcHJpdi0+ZG1hYnVmX2xvY2spOwo+PiArCWxpc3RfYWRkKCZ4ZW5fZG1hYnVm LT5uZXh0LCAmcHJpdi0+ZG1hYnVmX2V4cF9saXN0KTsKPj4gKwltdXRleF91bmxvY2soJnByaXYt PmRtYWJ1Zl9sb2NrKTsKPj4gKwlyZXR1cm4gMDsKPj4gKwo+PiArZmFpbDoKPj4gKwlpZiAoeGVu X2RtYWJ1Zi0+ZG1hYnVmKQo+PiArCQlkbWFfYnVmX3B1dCh4ZW5fZG1hYnVmLT5kbWFidWYpOwo+ PiArCWtmcmVlKHhlbl9kbWFidWYpOwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0 YXRpYyBzdHJ1Y3QgZ3JhbnRfbWFwICoKPj4gK2RtYWJ1Zl9leHBfYWxsb2NfYmFja2luZ19zdG9y YWdlKHN0cnVjdCBnbnRkZXZfcHJpdiAqcHJpdiwgaW50IGRtYWJ1Zl9mbGFncywKPj4gKwkJCQkg aW50IGNvdW50KQo+PiArewo+PiArCXN0cnVjdCBncmFudF9tYXAgKm1hcDsKPj4gKwo+PiArCWlm ICh1bmxpa2VseShjb3VudCA8PSAwKSkKPj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4+ ICsKPj4gKwlpZiAoKGRtYWJ1Zl9mbGFncyAmIEdOVERFVl9ETUFfRkxBR19XQykgJiYKPj4gKwkg ICAgKGRtYWJ1Zl9mbGFncyAmIEdOVERFVl9ETUFfRkxBR19DT0hFUkVOVCkpIHsKPj4gKwkJcHJf ZXJyKCJXcm9uZyBkbWEtYnVmIGZsYWdzOiBlaXRoZXIgV0Mgb3IgY29oZXJlbnQsIG5vdCBib3Ro XG4iKTsKPj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7Cj4+ICsJfQo+PiArCj4+ICsJbWFw ID0gZ250ZGV2X2FsbG9jX21hcChwcml2LCBjb3VudCwgZG1hYnVmX2ZsYWdzKTsKPj4gKwlpZiAo IW1hcCkKPj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4+ICsKPj4gKwlpZiAodW5saWtl bHkoYXRvbWljX2FkZF9yZXR1cm4oY291bnQsICZwYWdlc19tYXBwZWQpID4gbGltaXQpKSB7Cj4+ ICsJCXByX2VycigiY2FuJ3QgbWFwOiBvdmVyIGxpbWl0XG4iKTsKPj4gKwkJZ250ZGV2X3B1dF9t YXAoTlVMTCwgbWFwKTsKPj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cj4+ICsJfQo+PiAr CXJldHVybiBtYXA7Cj4+ICAgfQo+IFdoZW4gYW5kIGhvdyB3b3VsZCB0aGlzIGFsbG9jYXRpb24g YmUgZnJlZWQ/IEkgZG9uJ3Qgc2VlIGFueSBpb2N0bCBmb3IgZnJlZWluZyB1cAo+IHNoYXJlZCBw YWdlcy4Kb24geGVuX2RtYWJ1Zi5yZWxlYXNlIGNhbGxiYWNrIHdoaWNoIGlzIHJlZmNvdW50ZWQK Pj4gICAKPj4gICBzdGF0aWMgaW50IGRtYWJ1Zl9leHBfZnJvbV9yZWZzKHN0cnVjdCBnbnRkZXZf cHJpdiAqcHJpdiwgaW50IGZsYWdzLAo+PiAgIAkJCQlpbnQgY291bnQsIHUzMiBkb21pZCwgdTMy ICpyZWZzLCB1MzIgKmZkKQo+PiAgIHsKPj4gKwlzdHJ1Y3QgZ3JhbnRfbWFwICptYXA7Cj4+ICsJ aW50IGksIHJldDsKPj4gKwo+PiAgIAkqZmQgPSAtMTsKPj4gLQlyZXR1cm4gLUVJTlZBTDsKPj4g Kwo+PiArCWlmICh1c2VfcHRlbW9kKSB7Cj4+ICsJCXByX2VycigiQ2Fubm90IHByb3ZpZGUgZG1h LWJ1ZjogdXNlX3B0ZW1vZGUgJWRcbiIsCj4+ICsJCSAgICAgICB1c2VfcHRlbW9kKTsKPj4gKwkJ cmV0dXJuIC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJbWFwID0gZG1hYnVmX2V4cF9hbGxvY19i YWNraW5nX3N0b3JhZ2UocHJpdiwgZmxhZ3MsIGNvdW50KTsKPj4gKwlpZiAoSVNfRVJSKG1hcCkp Cj4+ICsJCXJldHVybiBQVFJfRVJSKG1hcCk7Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgY291 bnQ7IGkrKykgewo+PiArCQltYXAtPmdyYW50c1tpXS5kb21pZCA9IGRvbWlkOwo+PiArCQltYXAt PmdyYW50c1tpXS5yZWYgPSByZWZzW2ldOwo+PiArCX0KPj4gKwo+PiArCW11dGV4X2xvY2soJnBy aXYtPmxvY2spOwo+PiArCWdudGRldl9hZGRfbWFwKHByaXYsIG1hcCk7Cj4+ICsJbXV0ZXhfdW5s b2NrKCZwcml2LT5sb2NrKTsKPj4gKwo+PiArCW1hcC0+ZmxhZ3MgfD0gR05UTUFQX2hvc3RfbWFw Owo+PiArI2lmIGRlZmluZWQoQ09ORklHX1g4NikKPj4gKwltYXAtPmZsYWdzIHw9IEdOVE1BUF9k ZXZpY2VfbWFwOwo+PiArI2VuZGlmCj4+ICsKPj4gKwlyZXQgPSBtYXBfZ3JhbnRfcGFnZXMobWFw KTsKPj4gKwlpZiAocmV0IDwgMCkKPj4gKwkJZ290byBvdXQ7Cj4+ICsKPj4gKwlyZXQgPSBkbWFi dWZfZXhwb3J0KHByaXYsIG1hcCwgZmQpOwo+PiArCWlmIChyZXQgPCAwKQo+PiArCQlnb3RvIG91 dDsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArCj4+ICtvdXQ6Cj4+ICsJZ250ZGV2X3JlbW92ZV9t YXAocHJpdiwgbWFwKTsKPj4gKwlyZXR1cm4gcmV0Owo+PiAgIH0KPj4gICAKPj4gICAvKiAtLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0gKi8KPj4gLS0gCj4+IDIuMTcuMAo+PgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vZHJpLWRldmVsCg==