From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by gabe.freedesktop.org (Postfix) with ESMTPS id 46CE189E2A for ; Mon, 30 Dec 2019 14:18:24 +0000 (UTC) References: <20191230090734.23996-1-stanislav.lisovskiy@intel.com> From: =?UTF-8?Q?Juha-Pekka_Heikkil=c3=a4?= Message-ID: <0f969ad3-a563-d52c-ccd0-e9f52c49ece1@intel.com> Date: Mon, 30 Dec 2019 16:18:21 +0200 MIME-Version: 1.0 In-Reply-To: <20191230090734.23996-1-stanislav.lisovskiy@intel.com> Content-Language: en-US Subject: Re: [igt-dev] [PATCH i-g-t v5] tools: Add an intel_dbuf_map tool List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: igt-dev-bounces@lists.freedesktop.org Sender: "igt-dev" To: Stanislav Lisovskiy , igt-dev@lists.freedesktop.org Cc: martin.peres@intel.com List-ID: anVzdCBzb21lIHNtYWxsIGNvbW1lbnRzIGJlbG93IG9uIHRoZSBjb2RlLiBJJ2xsIG5lZWQgdG8g cnVuIHRoZSB0b29sIApzb21ld2hlcmUgdG8gZ2l2ZSBtb3JlIG1lYW5pbmdmdWwgY29tbWVudHMu CgovSnVoYS1QZWtrYQoKT24gMzAuMTIuMjAxOSAxMS4wNywgU3RhbmlzbGF2IExpc292c2tpeSB3 cm90ZToKPiBBcyBpbiBtb2Rlcm4gcGxhdGZvcm1zIG1vcmUgRGlzcGxheSBidWZmZXIKPiBzbGlj ZXMvcGlwZXMgYXJlIGNvbWluZywgd2hpY2ggaGF2ZSBkaWZmZXJlbnQKPiBwaXBlIGFmZmluaXRp ZXMgYW5kIG90aGVyIGNvbnN0cmFpbnRzLCBzbyBCU3BlYwo+IGNvbnRhaW5zIHRoZWlyIGNvbm5l Y3Rpb24gaW4gZm9ybSBvZiBhIEdyYXBoLgo+IAo+IFNvIHdlIGNhbiBnZW5lcmF0ZSBvcHRpbWFs IERCdWYgYXNzaWdubWVudCwKPiBmcm9tIHRoZSBncmFwaCB3aGljaCB3ZSBoYXZlIGluIEJTcGVj LCB0byBhdm9pZAo+IG1hbnVhbCBjYWxjdWxhdGlvbnMgcHJvbmUgdG8gaHVtYW4gZXJyb3IgYW5k Cj4gY29weS1wYXN0aW5nLiBUaGUgZ2VuZXJhdGVkIHRhYmxlIGlzIGluIEMgZm9ybQo+IGFuZCBj YW4gYmUgdXNlZCBpbiBpOTE1IGRyaXZlciByaWdodGF3YXkgYW5kIGFsc28KPiBmb3IgdmVyaWZp Y2F0aW9uLgo+IAo+IHYyOiBSZW1vdmVkIHVudXNlZCBpLCBqLCBtYWRlIHNvbWUgZnVuY3Rpb25z IHN0YXRpYywKPiAgICAgIHRvIG1ha2UgQ0kgY2hlY2tlcnMgYSBiaXQgaGFwcGllci4gQWxzbyBo YWQgdG8KPiAgICAgIGNoYW5nZSBJR1RfTElTVCB0byBJR1RfTElTVF9IRUFEIGFuZCBvdGhlciBz dHVmZiwKPiAgICAgIGFzIGZ1bmN0aW9ucyBzZWVtIHRvIGJlIHJlbmFtZWQgaW4gbGF0ZXN0IG1h c3Rlci4KPiAKPiB2MzogQWRkZWQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAiLS1ncmFwaCIgYW5k Cj4gICAgICAic2xpY2VzX3Blcl9waXBlIiB3aGljaCBhbGxvdyB0byBkZWZpbmUgYW5kCj4gICAg ICBnZXQgREJ1ZiBhc3NpZ25tZW50IGZyb20gZ3JhcGggd2l0aG91dCByZWNvbXBpbGluZwo+ICAg ICAgdGhlIHRvb2wsIGJ1dCByaWdodCBhd2F5Lgo+ICAgICAgRXhhbXBsZSB1c2FnZToKPiAgICAg IGludGVsX2RidWZfbWFwIC0tZ3JhcGggUElQRV9BLURCVUZfUzEtREJVRl9TMi1QSVBFX0ItUElQ RV9DIC0tc2xpY2VzX3Blcl9waXBlIDIKPiAKPiAgICAgIEdlbmVyYXRlcyBvdXRwdXQ6Cj4gICAg ICBHcmFwaDoKPiAgICAgIFR5cGUgUElQRSBpZCAwCj4gICAgICAgICAgKDEpLT4KPiAgICAgICAg ICAgICAgIFR5cGUgREJVRl9TTElDRSBpZCAwCj4gICAgICAgICAgICAgICAgICAoMSktPgo+ICAg ICAgICAgICAgICAgICAgICAgIFR5cGUgREJVRl9TTElDRSBpZCAxCj4gICAgICAgICAgICAgICAg ICAgICAgICAgICgxKS0+Cj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIFBJUEUg aWQgMQo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxKS0+Cj4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgUElQRSBpZCAyCj4gICAgICBDb21iaW5h dGlvbiB3aXRoIGxlYXN0IHdlaWdodCAzKHRvdGFsIGNvbWJpbmF0aW9ucyAxKToKPiAgICAgIHsg QklUKFBJUEVfQSksIHsgREJVRl9TMV9CSVQgfCBEQlVGX1MyX0JJVCwgMCwgMCwgMCB9IH0sCj4g ICAgICBDb21iaW5hdGlvbiB3aXRoIGxlYXN0IHdlaWdodCAzKHRvdGFsIGNvbWJpbmF0aW9ucyAx KToKPiAgICAgIHsgQklUKFBJUEVfQiksIHsgMCwgREJVRl9TMl9CSVQgfCBEQlVGX1MxX0JJVCwg MCwgMCB9IH0sCj4gICAgICBDb21iaW5hdGlvbiB3aXRoIGxlYXN0IHdlaWdodCAyKHRvdGFsIGNv bWJpbmF0aW9ucyAyKToKPiAgICAgIHsgQklUKFBJUEVfQSkgfCBCSVQoUElQRV9CKSwgeyBEQlVG X1MxX0JJVCwgREJVRl9TMl9CSVQsIDAsIDAgfSB9LAo+ICAgICAgQ29tYmluYXRpb24gd2l0aCBs ZWFzdCB3ZWlnaHQgNSh0b3RhbCBjb21iaW5hdGlvbnMgMSk6Cj4gICAgICB7IEJJVChQSVBFX0Mp LCB7IDAsIDAsIERCVUZfUzJfQklUIHwgREJVRl9TMV9CSVQsIDAgfSB9LAo+ICAgICAgQ29tYmlu YXRpb24gd2l0aCBsZWFzdCB3ZWlnaHQgMyh0b3RhbCBjb21iaW5hdGlvbnMgMik6Cj4gICAgICB7 IEJJVChQSVBFX0EpIHwgQklUKFBJUEVfQyksIHsgREJVRl9TMV9CSVQsIDAsIERCVUZfUzJfQklU LCAwIH0gfSwKPiAgICAgIENvbWJpbmF0aW9uIHdpdGggbGVhc3Qgd2VpZ2h0IDQodG90YWwgY29t YmluYXRpb25zIDIpOgo+ICAgICAgeyBCSVQoUElQRV9CKSB8IEJJVChQSVBFX0MpLCB7IDAsIERC VUZfUzJfQklULCBEQlVGX1MxX0JJVCwgMCB9IH0sCj4gICAgICBDb21iaW5hdGlvbiB3aXRoIGxl YXN0IHdlaWdodCA0KHRvdGFsIGNvbWJpbmF0aW9ucyA2KToKPiAgICAgIHsgQklUKFBJUEVfQSkg fCBCSVQoUElQRV9CKSB8IEJJVChQSVBFX0MpLCB7IERCVUZfUzFfQklULCBEQlVGX1MyX0JJVCwg REJVRl9TMl9CSVQsIDAgfSB9LAo+IAo+IHY0OiAtIE1pbm9yIHJlZmFjdG9yaW5nLCBzaW1wbGlm aWVkIGFsZ29yaXRobSwgcmVtb3ZlZCByZWR1bmRhbnQgbGlzdAo+ICAgICAgICB1c2FnZQo+ICAg ICAgLSBGaXhlZCB0aXRsZQo+ICAgICAgLSBBZGRlZCBkZWJ1ZyBvcHRpb24KPiAgICAgIC0gUmVt b3ZlZCB1bm5lZWRlZCBBUlJBWV9TSVpFIGRlZmluaXRpb24sIHdoaWNoIGFscmVhZHkgZXhpc3Rz Cj4gICAgICAgIChKdWhhLVBla2thIEhlaWtraWzDpCkKPiAKPiB2NTogLSBTd2l0Y2hlZCB0byBu YW1lZCBwaXBlIGFycmF5IGluaXRpYWxpemF0aW9uLCB0byBtYXRjaCBjdXJyZW50Cj4gICAgICAg IGtlcm5lbCBjb2RlLgo+ICAgICAgLSBNaW5vciBjb2RlIHJlZmFjdG9yaW5nLgo+IAo+IFNpZ25l ZC1vZmYtYnk6IFN0YW5pc2xhdiBMaXNvdnNraXkgPHN0YW5pc2xhdi5saXNvdnNraXlAaW50ZWwu Y29tPgo+IENjOiBWaWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29t Pgo+IC0tLQo+ICAgdG9vbHMvaW50ZWxfZGJ1Zl9tYXAuYyB8IDg4NCArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAgdG9vbHMvbWVzb24uYnVpbGQgICAgICB8ICAg MSArCj4gICAyIGZpbGVzIGNoYW5nZWQsIDg4NSBpbnNlcnRpb25zKCspCj4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgdG9vbHMvaW50ZWxfZGJ1Zl9tYXAuYwo+IAo+IGRpZmYgLS1naXQgYS90b29scy9p bnRlbF9kYnVmX21hcC5jIGIvdG9vbHMvaW50ZWxfZGJ1Zl9tYXAuYwo+IG5ldyBmaWxlIG1vZGUg MTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAuLmFjNDJmNjA4Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBi L3Rvb2xzL2ludGVsX2RidWZfbWFwLmMKPiBAQCAtMCwwICsxLDg4NCBAQAo+ICsvKgo+ICsgKiBD b3B5cmlnaHQgwqkgMjAxOSBJbnRlbCBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiBQZXJtaXNzaW9u IGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5p bmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRh dGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2Fy ZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCj4gKyAq IHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmli dXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJl LCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKPiArICogU29mdHdhcmUgaXMgZnVy bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKPiAr ICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1 ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCj4gKyAqIFNv ZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lU SE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgo+ICsgKiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBI T0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCj4gKyAqIExJ QUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJX SVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKPiArICogREVBTElOR1MgSU4gVEhFIFNPRlRX QVJFLgo+ICsgKgo+ICsgKiBBdXRob3JzOgo+ICsgKiAgICBTdGFuaXNsYXYgTGlzb3Zza2l5IDxz dGFuaXNsYXYubGlzb3Zza2l5QGludGVsLmNvbT4KPiArICoKPiArICovCj4gKwo+ICsjaW5jbHVk ZSA8c3RkbGliLmg+Cj4gKyNpbmNsdWRlICJpZ3QuaCIKPiArCj4gK2VudW0gTm9kZVR5cGUgewo+ ICsJREJVRl9TTElDRSwKPiArCVBJUEUKPiArfTsKPiArCj4gK2NvbnN0IGNoYXIgKm5vZGVfdHlw ZV90b19zdHJbXSA9IHsgIkRCVUZfU0xJQ0UiLCAiUElQRSIgfTsKPiArCj4gKyNkZWZpbmUgTUFY X0NPTk5FQ1RJT05TIDEwCj4gKyNkZWZpbmUgTUFYX05PREVTIDEwCj4gKyNkZWZpbmUgTUFYX0VE R0VTIChNQVhfTk9ERVMgKiAyKQo+ICsKPiArc3RydWN0IEdyYXBoRWRnZTsKPiArCj4gKy8qCj4g KyAqIEdyYXBoIG5vZGUsIHdoaWNoIGNhbiBiZSBEQnVmIG9yIFBpcGUKPiArICovCj4gK3N0cnVj dCBHcmFwaE5vZGUgewo+ICsJaW50IGlkOwo+ICsJZW51bSBOb2RlVHlwZSB0eXBlOwo+ICsJdW5z aWduZWQgaW50IHVzZV9jb3VudDsKPiArCWludCB2aXNpdGVkOwo+ICsJc3RydWN0IEdyYXBoRWRn ZSAqY29ubmVjdGlvbnNbTUFYX0NPTk5FQ1RJT05TXTsKPiArCWludCBudW1fY29ubmVjdGlvbnM7 Cj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IEdyYXBoTm9kZSAqYWxsX25vZGVzW01BWF9OT0RF U107Cj4gK3N0YXRpYyBzdHJ1Y3QgR3JhcGhFZGdlICphbGxfZWRnZXNbTUFYX0VER0VTXTsKPiAr c3RhdGljIGludCBudW1fbm9kZXM7Cj4gK3N0YXRpYyBpbnQgbnVtX2VkZ2VzOwo+ICsKPiArLyoK PiArICogR3JhcGggZWRnZSwgd2hpY2ggY29ubmVjdHMgR3JhcGggbm9kZXMKPiArICogYW5kIGhh cyBhIHdlaWdodCBwcm9wZXJ0eS4KPiArICovCj4gK3N0cnVjdCBHcmFwaEVkZ2Ugewo+ICsJdW5z aWduZWQgaW50IHdlaWdodDsKPiArCXN0cnVjdCBHcmFwaE5vZGUgKm5vZGU7Cj4gK307CgpJZiB5 b3UgbW92ZSBHcmFwaEVkZ2Ugc3RydWN0dXJlIGJpdCB1cHdhcmQgeW91IGNhbiB0YWtlIG91dCBm b3J3YXJkIApkZWNsYXJhdGlvbiBmb3IgdGhpcyBzdHJ1Y3R1cmUgYWJvdmUgR3JhcGhOb2RlLgoK PiArCj4gK3N0YXRpYyBzdHJ1Y3QgR3JhcGhOb2RlICpjcmVhdGVfZ3JhcGhfbm9kZShlbnVtIE5v ZGVUeXBlIHR5cGUsIGludCBpZCkKPiArewo+ICsJc3RydWN0IEdyYXBoTm9kZSAqbm9kZSA9IDA7 Cj4gKwo+ICsJaWYgKG51bV9ub2RlcyA+PSBNQVhfTk9ERVMpIHsKPiArCQlpZ3RfaW5mbygiVG9v IG11Y2ggbm9kZXMgJWQiLCBudW1fbm9kZXMpOwo+ICsJCXJldHVybiBOVUxMOwo+ICsJfQo+ICsK PiArCW5vZGUgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBHcmFwaE5vZGUpKTsKPiArCW5vZGUtPnR5 cGUgPSB0eXBlOwo+ICsJbm9kZS0+aWQgPSBpZDsKPiArCW5vZGUtPnVzZV9jb3VudCA9IDA7Cj4g Kwlub2RlLT52aXNpdGVkID0gMDsKPiArCW1lbXNldChub2RlLT5jb25uZWN0aW9ucywgMCwKPiAr CQkJTUFYX0NPTk5FQ1RJT05TICogc2l6ZW9mKHN0cnVjdCBHcmFwaEVkZ2UgKikpOwoKWW91IGNv dWxkIGFsbG9jYXRlIHdpdGggY2FsbG9jIGluc3RlYWQgb2YgbWFsbG9jICsgbWVtc2V0ICsgemVy b2luZyAKaW5kaXZpZHVhbCBtZW1iZXJzLgoKPiArCW5vZGUtPm51bV9jb25uZWN0aW9ucyA9IDA7 Cj4gKwo+ICsJYWxsX25vZGVzW251bV9ub2Rlc10gPSBub2RlOwo+ICsJbnVtX25vZGVzKys7Cj4g Kwo+ICsJcmV0dXJuIG5vZGU7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgR3JhcGhFZGdlICpj cmVhdGVfZ3JhcGhfZWRnZShpbnQgd2VpZ2h0LCBzdHJ1Y3QgR3JhcGhOb2RlICpub2RlKQo+ICt7 Cj4gKwlzdHJ1Y3QgR3JhcGhFZGdlICplZGdlID0gMDsKPiArCj4gKwlpZiAobnVtX2VkZ2VzID49 IE1BWF9FREdFUykgewo+ICsJCWlndF9pbmZvKCJUb28gbXVjaCBlZGdlcyAlZCIsIG51bV9lZGdl cyk7Cj4gKwkJcmV0dXJuIE5VTEw7Cj4gKwl9Cj4gKwo+ICsJZWRnZSA9IG1hbGxvYyhzaXplb2Yo c3RydWN0IEdyYXBoRWRnZSkpOwo+ICsKPiArCWVkZ2UtPm5vZGUgPSBub2RlOwo+ICsJZWRnZS0+ d2VpZ2h0ID0gd2VpZ2h0Owo+ICsKPiArCWFsbF9lZGdlc1tudW1fZWRnZXNdID0gZWRnZTsKPiAr CW51bV9lZGdlcysrOwo+ICsKPiArCXJldHVybiBlZGdlOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCBjb25uZWN0X25vZGVzKHN0cnVjdCBHcmFwaE5vZGUgKm5vZGUxLCBzdHJ1Y3QgR3JhcGhOb2Rl ICpub2RlMiwgaW50IHdlaWdodCkKPiArewo+ICsJc3RydWN0IEdyYXBoRWRnZSAqZWRnZTE7Cj4g KwlzdHJ1Y3QgR3JhcGhFZGdlICplZGdlMjsKPiArCj4gKwlpZiAobm9kZTEtPm51bV9jb25uZWN0 aW9ucyA+PSBNQVhfQ09OTkVDVElPTlMpIHsKPiArCQlpZ3RfaW5mbygiTm9kZSAlZCBoYXMgdG9v IG11Y2ggY29ubmVjdGlvbnNcbiIsIG5vZGUxLT5pZCk7Cj4gKwkJcmV0dXJuOwo+ICsJfQo+ICsK PiArCWlmIChub2RlMi0+bnVtX2Nvbm5lY3Rpb25zID49IE1BWF9DT05ORUNUSU9OUykgewo+ICsJ CWlndF9pbmZvKCJOb2RlICVkIGhhcyB0b28gbXVjaCBjb25uZWN0aW9uc1xuIiwgbm9kZTItPmlk KTsKPiArCQlyZXR1cm47Cj4gKwl9Cj4gKwo+ICsJZWRnZTEgPSBjcmVhdGVfZ3JhcGhfZWRnZSh3 ZWlnaHQsIG5vZGUxKTsKPiArCWVkZ2UyID0gY3JlYXRlX2dyYXBoX2VkZ2Uod2VpZ2h0LCBub2Rl Mik7Cj4gKwo+ICsJbm9kZTEtPmNvbm5lY3Rpb25zW25vZGUxLT5udW1fY29ubmVjdGlvbnNdID0g ZWRnZTI7Cj4gKwlub2RlMS0+bnVtX2Nvbm5lY3Rpb25zKys7Cj4gKwlub2RlMi0+Y29ubmVjdGlv bnNbbm9kZTItPm51bV9jb25uZWN0aW9uc10gPSBlZGdlMTsKPiArCW5vZGUyLT5udW1fY29ubmVj dGlvbnMrKzsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgcmVzZXRfbm9kZShzdHJ1Y3QgR3JhcGhO b2RlICpub2RlKQo+ICt7Cj4gKwlub2RlLT51c2VfY291bnQgPSAwOwo+ICsJbm9kZS0+dmlzaXRl ZCA9IDA7Cj4gKwltZW1zZXQobm9kZS0+Y29ubmVjdGlvbnMsIDAsCj4gKwkJTUFYX0NPTk5FQ1RJ T05TICogc2l6ZW9mKHN0cnVjdCBHcmFwaEVkZ2UgKikpOwo+ICsJbm9kZS0+bnVtX2Nvbm5lY3Rp b25zID0gMDsKPiArfQo+ICsKPiArc3RhdGljIHZvaWQgZGVzdHJveV9ub2RlKHN0cnVjdCBHcmFw aE5vZGUgKm5vZGUpCj4gK3sKPiArCWZyZWUobm9kZSk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk IGRlc3Ryb3lfZWRnZShzdHJ1Y3QgR3JhcGhFZGdlICplZGdlKQo+ICt7Cj4gKwlmcmVlKGVkZ2Up Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBkZXN0cm95X2FsbF9lZGdlcyh2b2lkKQo+ICt7Cj4g KwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VkZ2VzOyBpKyspIHsKPiArCQlk ZXN0cm95X2VkZ2UoYWxsX2VkZ2VzW2ldKTsKPiArCX0KPiArCW51bV9lZGdlcyA9IDA7Cj4gK30K PiArCj4gK3N0YXRpYyB2b2lkIGRlc3Ryb3lfYWxsX25vZGVzKHZvaWQpCj4gK3sKPiArCWludCBp Owo+ICsKPiArCWZvciAoaSA9IDA7IGkgPCBudW1fbm9kZXM7IGkrKykgewo+ICsJCWRlc3Ryb3lf bm9kZShhbGxfbm9kZXNbaV0pOwo+ICsJfQo+ICsJbnVtX25vZGVzID0gMDsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgcmVzZXRfYWxsX25vZGVzKHZvaWQpCj4gK3sKPiArCWludCBpOwo+ICsKPiAr CWRlc3Ryb3lfYWxsX2VkZ2VzKCk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IG51bV9ub2Rlczsg aSsrKSB7Cj4gKwkJcmVzZXRfbm9kZShhbGxfbm9kZXNbaV0pOwo+ICsJfQo+ICt9Cj4gKwo+ICsv Kgo+ICsgKiBUcmF2ZXJzZSBhbmQgdHJ5IHRvIHByaW50IGdyYXBoIGluIGEKPiArICogc29tZXdo YXQgZ3JhcGhpY2FsIGZvcm0uCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCB0cmF2ZXJzZV9ncmFwaChz dHJ1Y3QgR3JhcGhOb2RlICpzdGFydF9ub2RlLAo+ICsJCQkgICBpbnQgZGVwdGgpCj4gK3sKPiAr CWludCBpLCBzcGFjZTsKPiArCj4gKwlpZiAoIWRlcHRoKQo+ICsJCWlndF9pbmZvKCJHcmFwaDog XG4iKTsKPiArCj4gKwlmb3IgKHNwYWNlID0gMDsgc3BhY2UgPCBkZXB0aCAqIDQ7IHNwYWNlKysp Cj4gKwkJaWd0X2luZm8oIiAiKTsKPiArCj4gKwlzdGFydF9ub2RlLT52aXNpdGVkKys7Cj4gKwlp Z3RfaW5mbygiVHlwZSAlcyBpZCAlZFxuIiwgbm9kZV90eXBlX3RvX3N0cltzdGFydF9ub2RlLT50 eXBlXSwKPiArCQkgc3RhcnRfbm9kZS0+aWQpOwo+ICsJZm9yIChpID0gMDsgaSA8IHN0YXJ0X25v ZGUtPm51bV9jb25uZWN0aW9uczsgaSsrKSB7Cj4gKwkJaWYgKCFzdGFydF9ub2RlLT5jb25uZWN0 aW9uc1tpXS0+bm9kZS0+dmlzaXRlZCkgewo+ICsJCQlmb3IgKHNwYWNlID0gMDsgc3BhY2UgPCAo ZGVwdGggKyAxKSAqIDQ7IHNwYWNlKyspCj4gKwkJCQlpZ3RfaW5mbygiICIpOwo+ICsJCQlpZ3Rf aW5mbygiKCVkKS0+IFxuIiwgc3RhcnRfbm9kZS0+Y29ubmVjdGlvbnNbaV0tPndlaWdodCk7Cj4g KwkJCXRyYXZlcnNlX2dyYXBoKHN0YXJ0X25vZGUtPmNvbm5lY3Rpb25zW2ldLT5ub2RlLCBkZXB0 aCsyKTsKPiArCQkJc3RhcnRfbm9kZS0+Y29ubmVjdGlvbnNbaV0tPm5vZGUtPnZpc2l0ZWQtLTsK PiArCQl9Cj4gKwl9Cj4gK30KPiArCj4gK2Jvb2wgZGVidWcgPSBmYWxzZTsKPiArCj4gK3N0YXRp YyB2b2lkIHByaW50X25vZGVfZGVidWcoc3RydWN0IEdyYXBoTm9kZSAqbm9kZSkKPiArewo+ICsJ aWd0X2luZm8oIiVzIG5vZGUgJWQgdmlzaXRlZCAlZCB1c2UgY291bnQgJWRcbiIsCj4gKwkJIG5v ZGVfdHlwZV90b19zdHJbbm9kZS0+dHlwZV0sIG5vZGUtPmlkLAo+ICsJCSBub2RlLT52aXNpdGVk LAo+ICsJCSBub2RlLT51c2VfY291bnQpOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBUaGlzIGZ1bmN0 aW9uIHJlY3Vyc2l2ZWx5IHNlYXJjaGVzIGZvciBhIGZyZWUgREJ1ZiBzbGljZQo+ICsgKiBmb3Ig Y29ycmVzcG9uZGVudCBwaXBlLCBiYXNlZCBvbiBkaWZmZXJlbnQgY29uc3RyYWludHMsIGxpa2UK PiArICogd2VpZ2h0LCB1c2FnZSBjb3VudC4gVGhpcyBhbGdvcml0aG0gaXMgImdyZWVkeSIgd2hp Y2ggbWVhbnMKPiArICogdGhhdCBpdCBhY2NvdW50cyBmb3IgbG9jYWwgb3B0aW11bSBvbmx5LCB3 aGljaCBtZWFucyB0aGF0Cj4gKyAqIHRvdGFsIGNvbXBhcmlzb24gaGFzIHRvIGJlIGRvbmUgaW4g dGhlIGVuZC4KPiArICogSW4gZ3JhcGggdGhlb3J5IHRoaXMgaXMgY2FsbGVkIGJyZWFkdGgtZmly c3Qgc2VhcmNoLgo+ICsgKiBBcyB0aGlzIGFsZ29yaXRobSB0cmllcyB0byB1dGlsaXplIG5lYXJl c3QgbmVpZ2hib3VycyBmaXJzdAo+ICsgKiBpdCBhbGxvd3MgdG8gc2tpcCBtYW55IHVucmVxdWly ZWQgcGF0aCBjYWxjdWxhdGlvbnMgd2hpY2gKPiArICogd291bGQgYmUgbmVlZGVkIGlmIHdlIHJl YWxseSB3b3VsZCBidWlsZCBhIG1hdHJpeCBsaWtlOgo+ICsgKiAgIFBpcGUgLSBEQlVGCj4gKyAq ICAgICAgICAgMCAgICAxCj4gKyAqICAgMCAgICAgMSAgICAyCj4gKyAqCj4gKyAqICAgMSAgICAg MiAgICAxCj4gKyAqIFRoZW4gd2Ugd291bGQgaGF2ZSB0byBnbyB0aG91cmdoIGFsbCBOIERidWYg KiBOIFBpcGVzICogTiBQaXBlcyEKPiArICogdG8gY2hlY2sgYWxsIHBvc3NpYmxlIHBpcGUgYWNj b21vZGF0aW9ucy4KPiArICogRm9yIGFib3ZlIG1hdHJpeCB0aGUgYWxnb3JpdGhtIHdvdWxkIGlt bWVkaWF0ZWx5IHJldHVybiBzbGljZSAwCj4gKyAqIGZvciBwaXBlIDAgYW5kIHNsaWNlIDEgZm9y IHBpcGUgMSBhcyBuZWFyZXN0IG5laWdoYm91cnMsIHNraXBwaW5nCj4gKyAqIHVubmVjY2Vzc2Fy eSBwYXRocyBmb3IgcGlwZTAgLSBzbGljZTEsIHBpcGUxIC0gc2xpY2UwLgo+ICsgKiBBbnl3YXkg Zm9yIG1vcmUgY29tcGxleCBjYXNlcywgbGlrZToKPiArICogIFBpcGUgLSBEQlVGCj4gKyAqICAg ICAgICAgMCAgICAxCj4gKyAqICAgMCAgICAgMSAgICAxCj4gKyAqCj4gKyAqICAgMSAgICAgMiAg ICAxCj4gKyAqIGNoZWNraW5nIGZvciBhbGwgcG9zc2libGUgYWNjb21vZGF0aW9ucyBpcyBzdGls bCBuZWVkZWQuIEhvd2V2ZXIKPiArICogbmVhcmVzdCAiZ3JlZWR5IiBhcHByb2FjaCBmaXJzdCBz dGlsbCBhbGxvd3MgdG8gZmlsdGVyIG91dCBzb21lIG9mCj4gKyAqIHRoZSByZWR1bmRhbnQgY29t YmluYXRpb25zLCB3aGljaCB3b3VsZCBiZSBzZWVuIGlmIGZ1bGwgbWF0cml4IGlzIGJ1aWx0Lgo+ ICsgKiBJbnN0ZWFkIHdlIHNhdmUgdGltZSBieSBqdXN0IGNob29zaW5nIHRoZSBuZWFyZXN0IG9u ZXMgZmlyc3Qgd2hpY2gKPiArICogYXJlIGV4cGVjdGVkIHRvIGhhdmUgbG93ZXIgY29zdChncmVl ZHkgYXBwcm9hY2gpLCBob3dldmVyIHRoZW4KPiArICogd2Ugd2lsbCBzdGlsbCBjaGVjayBhbGwg cG9zc2libGUgYWNjb21vZGF0aW9ucyBhcyB3ZSB3b3VsZCBkbyB3aXRoCj4gKyAqIGZ1bGwgbWF0 cml4IGFwcHJvYWNoLgo+ICsgKi8KPiArc3RhdGljIHN0cnVjdCBHcmFwaE5vZGUgKmZpbmRfc2xp Y2VfZm9yX3BpcGUoc3RydWN0IEdyYXBoTm9kZSAqc3RhcnRfbm9kZSwKPiArCQkJCQkgICAgIGlu dCBhY2Nfd2VpZ2h0LCBpbnQgbWF4X3VzZV9jb3VudCwKPiArCQkJCQkgICAgIHVuc2lnbmVkIGlu dCAqdG90YWxfd2VpZ2h0LAo+ICsJCQkJCSAgICAgaW50IGRlcHRoLAo+ICsJCQkJCSAgICAgaW50 ICpza2lwKQo+ICt7Cj4gKwlpbnQgaTsKPiArCXN0cnVjdCBHcmFwaE5vZGUgKm5vZGUgPSBOVUxM Owo+ICsKPiArCWlmIChkZWJ1Zykgewo+ICsJCWlndF9pbmZvKCJFbnRlcmluZyBub2RlKHJlc3Vy c2lvbiBkZXB0aCAlZCBza2lwcyAlZCk6IFxuIiwKPiArCQkJIGRlcHRoLCAqc2tpcCk7Cj4gKwkJ cHJpbnRfbm9kZV9kZWJ1ZyhzdGFydF9ub2RlKTsKPiArCQlpZ3RfaW5mbygiQWNjdW11bGF0ZWQg d2VpZ2h0ICVkIG1heCB1c2UgY291bnQgJWRcbiIsCj4gKwkJCSBhY2Nfd2VpZ2h0LCBtYXhfdXNl X2NvdW50KTsKPiArCX0KPiArCj4gKwlzdGFydF9ub2RlLT52aXNpdGVkKys7Cj4gKwo+ICsJLyoK PiArCSAqIEl0ZXJhdGUgdGhyb3VnaCBuZWlnaGJvdXJpbmcgc2xpY2VzKGdyYXBoIGJyZWFkdGgt Zmlyc3Qgc2VhcmNoKSwKPiArCSAqIGNoZWNraW5nIGlmIGl0J3MgdXNlIGNvdW50IGFsbG93cyB1 c2FnZSBhbmQgc2tpcCBpZiBuZWVkZWQsCj4gKwkgKiBza2lwcyBhcmUgbmVlZGVkIHdoZW4gd2Ug dXNlIG11bHRpcGxlIHNsaWNlcyBmb3IKPiArCSAqIHNhbWUgcGlwZSB0byBwcmV2ZW50IGFsZ29y aXRobSBmcm9tIHJldHVybmluZyB0aGUKPiArCSAqIHNhbWUgREJ1Zi4KPiArCSAqLwo+ICsJZm9y IChpID0gMDsgaSA8IHN0YXJ0X25vZGUtPm51bV9jb25uZWN0aW9uczsgaSsrKSB7Cj4gKwkJc3Ry dWN0IEdyYXBoRWRnZSAqY3VyX2VkZ2UgPSBzdGFydF9ub2RlLT5jb25uZWN0aW9uc1tpXTsKPiAr Cj4gKwkJaWYgKGRlYnVnKSB7Cj4gKwkJCWlndF9pbmZvKCIgICAgTmVpZ2hib3VyIG5vZGU6ICIp Owo+ICsJCQlwcmludF9ub2RlX2RlYnVnKGN1cl9lZGdlLT5ub2RlKTsKPiArCQl9Cj4gKwo+ICsJ CWlmIChjdXJfZWRnZS0+bm9kZS0+dHlwZSAhPSBEQlVGX1NMSUNFKQo+ICsJCQljb250aW51ZTsK PiArCj4gKwkJaWYgKGN1cl9lZGdlLT5ub2RlLT51c2VfY291bnQgPCBtYXhfdXNlX2NvdW50KSB7 Cj4gKwkJCWlmICghKCpza2lwKSkgewo+ICsJCQkJY3VyX2VkZ2UtPm5vZGUtPnVzZV9jb3VudCsr Owo+ICsJCQkJKnRvdGFsX3dlaWdodCA9IGFjY193ZWlnaHQgKyBjdXJfZWRnZS0+d2VpZ2h0Owo+ ICsJCQkJbm9kZSA9IGN1cl9lZGdlLT5ub2RlOwo+ICsJCQkJZ290byBvdXQ7Cj4gKwkJCX0KPiAr CQl9Cj4gKwo+ICsJCWlmICgqc2tpcCkKPiArCQkJKCpza2lwKS0tOwo+ICsJfQo+ICsKPiArCS8q Cj4gKwkgKiBJZiBjb3VsZG4ndCBmaW5kIHN1aXRhYmxlIERCdWYgbm9kZSBmcm9tIG91cgo+ICsJ ICogbmVpZ2hib3VycywgaGF2ZSB0byBjb250aW51ZSBmdXJ0aGVyLCBjaGVja2luZwo+ICsJICog dmlzaXRlZCBmbGFnLCB0byBwcmV2ZW50IGxvb3BzLgo+ICsJICovCj4gKwlmb3IgKGkgPSAwOyBp IDwgc3RhcnRfbm9kZS0+bnVtX2Nvbm5lY3Rpb25zOyBpKyspIHsKPiArCQlzdHJ1Y3QgR3JhcGhF ZGdlICpjdXJfZWRnZSA9IHN0YXJ0X25vZGUtPmNvbm5lY3Rpb25zW2ldOwo+ICsKPiArCQlpZiAo Y3VyX2VkZ2UtPm5vZGUtPnZpc2l0ZWQpCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlub2RlID0g ZmluZF9zbGljZV9mb3JfcGlwZShjdXJfZWRnZS0+bm9kZSwKPiArCQkJCQkgICBhY2Nfd2VpZ2h0 ICsgY3VyX2VkZ2UtPndlaWdodCwKPiArCQkJCQkgICBtYXhfdXNlX2NvdW50LCB0b3RhbF93ZWln aHQsCj4gKwkJCQkJICAgZGVwdGggKyAxLCBza2lwKTsKPiArCQljdXJfZWRnZS0+bm9kZS0+dmlz aXRlZC0tOwo+ICsJCWlmIChub2RlKQo+ICsJCQlnb3RvIG91dDsKPiArCX0KPiArCj4gK291dDoK PiArCWlmIChkZWJ1ZykKPiArCQlpZ3RfaW5mbygiTGVhdmluZyBub2RlICVkXG4iLCBzdGFydF9u b2RlLT5pZCk7Cj4gKwo+ICsJLyogSWYgd2UgYXJlIGF0IHJlY3Vyc2lvbiBkZXB0aCAwIC0gcmVs ZWFzZSB0aGUgcm9vdCBub2RlICovCj4gKwlpZiAoZGVwdGggPT0gMCkKPiArCQlzdGFydF9ub2Rl LT52aXNpdGVkID0gMDsKPiArCj4gKwlyZXR1cm4gbm9kZTsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBod2VpZ2h0MzIoaW50IG1hc2spCj4gK3sKPiArCWludCBpOwo+ICsJaW50IGNvdW50ID0gMDsK PiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKPiArCQlpZiAoKDE8PGkpICYgbWFzaykK PiArCQkJY291bnQgKz0gMTsKPiArCXJldHVybiBjb3VudDsKPiArfQo+ICsKPiArI2RlZmluZSBJ OTE1X01BWF9QSVBFUyA0Cj4gKyNkZWZpbmUgSTkxNV9NQVhfU0xJQ0VTX1BFUl9QSVBFIDQKPiAr I2RlZmluZSBJOTE1X01BWF9TTElDRVMgKEk5MTVfTUFYX1BJUEVTICogSTkxNV9NQVhfU0xJQ0VT X1BFUl9QSVBFKQo+ICsKPiArY29uc3QgY2hhciAqcGlwZV9uYW1lc1tdID0geyAiUElQRV9BIiwg IlBJUEVfQiIsICJQSVBFX0MiLCAiUElQRV9EIiB9Owo+ICtjb25zdCBjaGFyICpzbGljZV9uYW1l c1tdID0geyAiREJVRl9TMSIsICJEQlVGX1MyIiwgIkRCVUZfUzMiLCAiREJVRl9TNCIgfTsKPiAr Cj4gK3N0YXRpYyBpbnQgZmFjdG9yaWFsKGludCBuKQo+ICt7Cj4gKwlpZiAobiA8PSAxKQo+ICsJ CXJldHVybiAxOwo+ICsJcmV0dXJuIG4gKiBmYWN0b3JpYWwobiAtIDEpOwo+ICt9Cj4gKwo+ICtz dGF0aWMgdm9pZCBkb19zd2FwKHN0cnVjdCBHcmFwaE5vZGUgKipwaXBlX25vZGVzLCBpbnQgbSwg aW50IG4pCj4gK3sKPiArCXN0cnVjdCBHcmFwaE5vZGUgKm5vZGUxID0gcGlwZV9ub2Rlc1ttXTsK PiArCXN0cnVjdCBHcmFwaE5vZGUgKm5vZGUyID0gcGlwZV9ub2Rlc1tuXTsKPiArCXVuc2lnbmVk IGxvbmcgbm9kZV92YWwxID0gKHVuc2lnbmVkIGxvbmcpIG5vZGUxOwo+ICsJdW5zaWduZWQgbG9u ZyBub2RlX3ZhbDIgPSAodW5zaWduZWQgbG9uZykgbm9kZTI7Cj4gKwo+ICsJbm9kZV92YWwxIF49 IG5vZGVfdmFsMjsKPiArCW5vZGVfdmFsMiBePSBub2RlX3ZhbDE7Cj4gKwlub2RlX3ZhbDEgXj0g bm9kZV92YWwyOwo+ICsKPiArCW5vZGUxID0gKHN0cnVjdCBHcmFwaE5vZGUgKilub2RlX3ZhbDE7 Cj4gKwlub2RlMiA9IChzdHJ1Y3QgR3JhcGhOb2RlICopbm9kZV92YWwyOwo+ICt9Cj4gKwo+ICtz dHJ1Y3QgUGlwZU5vZGVzQ29tYmluYXRpb24gewo+ICsJdW5zaWduZWQgaW50IHRvdGFsX3dlaWdo dDsKPiArCXN0cnVjdCBHcmFwaE5vZGUgKnBpcGVfbm9kZXNbSTkxNV9NQVhfUElQRVNdOwo+ICsJ c3RydWN0IEdyYXBoTm9kZSAqc2xpY2VzW0k5MTVfTUFYX1NMSUNFU107Cj4gK307Cj4gKwo+ICtz dHJ1Y3QgSXRlcmF0ZUNvbnRleHQgewo+ICsJc3RydWN0IFBpcGVOb2Rlc0NvbWJpbmF0aW9uIG1p bl9jb21iOwo+ICsJaW50IG1heF91c2VfY291bnQ7Cj4gKwlpbnQgbnVtX3BpcGVzOwo+ICsJaW50 IG51bV9zbGljZXM7Cj4gKwlpbnQgc2xpY2VzX3Blcl9waXBlOwo+ICsJaW50IG1heF9jb21iaW5h dGlvbnM7Cj4gK307Cj4gKwo+ICtzdHJ1Y3QgUGlwZURCdWYgewo+ICsJc3RydWN0IEdyYXBoTm9k ZSAqcGlwZTsKPiArCXN0cnVjdCBHcmFwaE5vZGUgKmRidWZbSTkxNV9NQVhfU0xJQ0VTX1BFUl9Q SVBFXTsKPiArfTsKPiArCj4gK3N0YXRpYyB2b2lkIHByaW50X3BpcGVfbm9kZXMoc3RydWN0IEdy YXBoTm9kZSAqKnBpcGVfbm9kZXMpCj4gK3sKPiArCWludCBpOwo+ICsJZm9yIChpID0gMDsgaSA8 IEk5MTVfTUFYX1BJUEVTOyBpKyspIHsKPiArCQlpZiAoIXBpcGVfbm9kZXNbaV0pCj4gKwkJCWln dF9pbmZvKCIobnVsbCkiKTsKPiArCQllbHNlCj4gKwkJCWlndF9pbmZvKCIlZCIsIHBpcGVfbm9k ZXNbaV0tPmlkKTsKPiArCQlpZiAoIGkgPCAoSTkxNV9NQVhfUElQRVMgLSAxKSkKPiArCQkJaWd0 X2luZm8oIiAsIik7Cj4gKwl9Cj4gKwlpZ3RfaW5mbygiXG4iKTsKPiArfQo+ICsKPiArCj4gK3N0 YXRpYyB2b2lkIGNvbXBhcmVfd2VpZ2h0KHN0cnVjdCBJdGVyYXRlQ29udGV4dCAqY3R4LAo+ICsJ CQkgICBzdHJ1Y3QgUGlwZU5vZGVzQ29tYmluYXRpb24gKmNvbWIpCj4gK3sKPiArCXVuc2lnbmVk IGludCB3ZWlnaHQ7Cj4gKwlpbnQgaiA9IDA7Cj4gKwlpbnQgcGlwZSA9IDA7Cj4gKwlpbnQgc2tp cCA9IDA7Cj4gKwlpbnQgc2xpY2VfbnVtID0gMDsKPiArCj4gKwljb21iLT50b3RhbF93ZWlnaHQg PSAwOwo+ICsKPiArCWlmIChkZWJ1Zykgewo+ICsJCWlndF9pbmZvKCJDb21iaW5hdGlvbjogIik7 Cj4gKwkJcHJpbnRfcGlwZV9ub2Rlcyhjb21iLT5waXBlX25vZGVzKTsKPiArCX0KPiArCj4gKwkv Kgo+ICsJICogR2V0IGEgZnJlZSBEQnVmIHNsaWNlIGZvciBlYWNoIHBpcGUsIHRoZW4KPiArCSAq IGNhbGN1bGF0ZSB0b3RhbCB3ZWlnaHQsIHdoaWNoIHdpbGwgYmUKPiArCSAqIHRoZW4gY29tcGFy ZWQgdG8gbWluaW1hbCB3ZWlnaHQgdG8gZmluZAo+ICsJICogY29tYmluYXRpb24gd2l0aCB0b3Rh bCBtaW5pbWFsIHdlaWdodC4KPiArCSAqLwo+ICsJd2hpbGUgKHBpcGUgPCBJOTE1X01BWF9QSVBF Uykgewo+ICsJCWlmIChjb21iLT5waXBlX25vZGVzW3BpcGVdKSB7Cj4gKwkJCXNsaWNlX251bSA9 IDA7Cj4gKwkJCXNraXAgPSAwOwo+ICsJCQl3aGlsZSAoc2xpY2VfbnVtIDwgY3R4LT5zbGljZXNf cGVyX3BpcGUpIHsKPiArCQkJCXNraXAgPSBzbGljZV9udW07Cj4gKwkJCQljb21iLT5zbGljZXNb al0gPQo+ICsJCQkJICAgIGZpbmRfc2xpY2VfZm9yX3BpcGUoY29tYi0+cGlwZV9ub2Rlc1twaXBl XSwKPiArCQkJCQkJMCwgY3R4LT5tYXhfdXNlX2NvdW50LAo+ICsJCQkJCQkmd2VpZ2h0LCAwLCAm c2tpcCk7Cj4gKwkJCQlpZiAoIWNvbWItPnNsaWNlc1tqXSkKPiArCQkJCQlicmVhazsKPiArCQkJ CXNsaWNlX251bSsrOwo+ICsJCQkJaisrOwo+ICsJCQkJY29tYi0+dG90YWxfd2VpZ2h0ICs9IHdl aWdodDsKPiArCQkJfQo+ICsJCX0gZWxzZSB7Cj4gKwkJCWogKz0gY3R4LT5zbGljZXNfcGVyX3Bp cGU7Cj4gKwkJfQo+ICsJCXBpcGUrKzsKPiArCX0KPiArCj4gKwlpZiAoZGVidWcpCj4gKwkJaWd0 X2luZm8oIlRvdGFsIHdlaWdodCAlZFxuIiwgY29tYi0+dG90YWxfd2VpZ2h0KTsKPiArCj4gKwlm b3IgKGogPSAwOyBqIDwgSTkxNV9NQVhfU0xJQ0VTOyBqKyspIHsKPiArCQlpZiAoY29tYi0+c2xp Y2VzW2pdKQo+ICsJCQljb21iLT5zbGljZXNbal0tPnVzZV9jb3VudCA9IDA7Cj4gKwl9Cj4gKwo+ ICsJaWYgKGN0eC0+bWluX2NvbWIudG90YWxfd2VpZ2h0ID4gY29tYi0+dG90YWxfd2VpZ2h0KSB7 Cj4gKwkJbWVtY3B5KCZjdHgtPm1pbl9jb21iLCBjb21iLAo+ICsJCSAgICAgICBzaXplb2Yoc3Ry dWN0IFBpcGVOb2Rlc0NvbWJpbmF0aW9uKSk7Cj4gKwl9Cj4gK30KPiArCj4gKy8qCj4gKyAqIEdl bmVyYXRlIGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgZm9yIGVsZW1lbnRzIGluCj4gKyAqIHBp cGUgYXJyYXkodG90YWwgaXMgY2FsY3VsYXRlZCBhcyBuISkuCj4gKyAqLwo+ICtzdGF0aWMgdm9p ZCBpdGVyYXRlX2FsbF9jb21iaW5hdGlvbnMoc3RydWN0IEl0ZXJhdGVDb250ZXh0ICpjdHgsCj4g KwkJCQkgICAgIHN0cnVjdCBHcmFwaE5vZGUgKipwaXBlX25vZGVzLAo+ICsJCQkJICAgICBpbnQg c3RhcnQsIGludCBzdGVwLAo+ICsJCQkJICAgICB2b2lkICgqZnVuYykoc3RydWN0IEl0ZXJhdGVD b250ZXh0ICpjdHgsCj4gKwkJCQkgICAgIHN0cnVjdCBQaXBlTm9kZXNDb21iaW5hdGlvbiAqY29t YikpCj4gK3sKPiArCWludCBpLCBqOwo+ICsJc3RydWN0IEdyYXBoTm9kZSAqbm9kZXNbSTkxNV9N QVhfUElQRVNdOwo+ICsJc3RydWN0IFBpcGVOb2Rlc0NvbWJpbmF0aW9uIGNvbWI7Cj4gKwo+ICsJ bWVtY3B5KGNvbWIucGlwZV9ub2RlcywgcGlwZV9ub2RlcywKPiArCSAgICAgICBJOTE1X01BWF9Q SVBFUyAqIHNpemVvZihzdHJ1Y3QgR3JhcGhOb2RlICopKTsKPiArCW1lbXNldChjb21iLnNsaWNl cywgMCwKPiArCSAgICAgICBJOTE1X01BWF9TTElDRVMgKiBzaXplb2Yoc3RydWN0IEdyYXBoTm9k ZSAqKSk7Cj4gKwo+ICsJaWYgKGZ1bmMpCj4gKwkJKCpmdW5jKShjdHgsICZjb21iKTsKPiArCj4g KwlpZiAoKHN0ZXAgPT0gMCkgfHwgKGN0eC0+bnVtX3BpcGVzID09IDEpKQo+ICsJCXJldHVybjsK PiArCj4gKwlmb3IgKGogPSBzdGVwOyBqID4gMDsgai0tKSB7Cj4gKwkJZm9yIChpID0gc3RhcnQ7 IGkgPCBJOTE1X01BWF9QSVBFUyAtIGo7IGkrKykgewo+ICsJCQlpZiAoIXBpcGVfbm9kZXNbaV0g fHwgIXBpcGVfbm9kZXNbaSArIGpdKQo+ICsJCQkJY29udGludWU7Cj4gKwkJCW1lbWNweShub2Rl cywgcGlwZV9ub2RlcywKPiArCQkJICAgICAgIEk5MTVfTUFYX1BJUEVTICogc2l6ZW9mKHN0cnVj dCBHcmFwaE5vZGUgKikpOwo+ICsJCQlkb19zd2FwKG5vZGVzLCBpLCBpICsgaik7Cj4gKwkJCWl0 ZXJhdGVfYWxsX2NvbWJpbmF0aW9ucyhjdHgsIG5vZGVzLCBpICsgMSwKPiArCQkJCQkJIHN0ZXAg LSAxLCBmdW5jKTsKPiArCQl9Cj4gKwl9Cj4gK30KPiArCj4gKy8qCj4gKyAqIFRoaXMgZnVuY3Rp b24gY2FsY3VsYXRlcyBhbmQgcHJpbnRzIG9wdGltYWwKPiArICogd2VpZ2h0LWJhc2VkIERCdWYg YXNzaWdubWVudCBmb3IgYWN0aXZlIHBpcGVzLgo+ICsgKi8KPiArc3RhdGljIGludAo+ICtwcmlu dF9kYnVmX21hc2tfZm9yX3BpcGVzKGludCBhY3RpdmVfcGlwZXMsCj4gKwkJCSAgc3RydWN0IEdy YXBoTm9kZSAqKnBpcGVfbm9kZXMsCj4gKwkJCSAgaW50IG51bV9zbGljZXMpCj4gK3sKPiArCWlu dCBpOwo+ICsJaW50IG51bV9waXBlcyA9IGh3ZWlnaHQzMihhY3RpdmVfcGlwZXMpLCBwaXBlc19j b3VudDsKPiArCWludCBtYXhfdXNlX2NvdW50ID0gbnVtX3NsaWNlcyA8IG51bV9waXBlcyA/IDIg OiAxOwo+ICsJaW50IHBpcGUgPSAwOwo+ICsJaW50IHNsaWNlc19wZXJfcGlwZSA9IG1heChudW1f c2xpY2VzIC8gbnVtX3BpcGVzLCAxKTsKPiArCXN0cnVjdCBJdGVyYXRlQ29udGV4dCBjdHg7Cj4g KwlzdHJ1Y3QgUGlwZURCdWYgcGlwZV9kYnVmW0k5MTVfTUFYX1BJUEVTXTsKPiArCj4gKwltZW1j cHkoY3R4Lm1pbl9jb21iLnBpcGVfbm9kZXMsIHBpcGVfbm9kZXMsCj4gKwkgICAgICAgc2l6ZW9m KHN0cnVjdCBHcmFwaE5vZGUgKikgKiBJOTE1X01BWF9QSVBFUyk7Cj4gKwltZW1zZXQoY3R4Lm1p bl9jb21iLnNsaWNlcywgMCwKPiArCSAgICAgICBJOTE1X01BWF9TTElDRVMgKiBzaXplb2Yoc3Ry dWN0IEdyYXBoTm9kZSAqKSk7Cj4gKwljdHgubWluX2NvbWIudG90YWxfd2VpZ2h0ID0gfjA7Cj4g KwljdHgubWF4X3VzZV9jb3VudCA9IG1heF91c2VfY291bnQ7Cj4gKwljdHgubnVtX3BpcGVzID0g bnVtX3BpcGVzOwo+ICsJY3R4Lm51bV9zbGljZXMgPSBudW1fc2xpY2VzOwo+ICsJY3R4LnNsaWNl c19wZXJfcGlwZSA9IHNsaWNlc19wZXJfcGlwZTsKPiArCWN0eC5tYXhfY29tYmluYXRpb25zID0g ZmFjdG9yaWFsKG51bV9waXBlcyk7Cj4gKwo+ICsJaXRlcmF0ZV9hbGxfY29tYmluYXRpb25zKCZj dHgsIHBpcGVfbm9kZXMsCj4gKwkJCQkgMCwgSTkxNV9NQVhfUElQRVMgLSAxLCBjb21wYXJlX3dl aWdodCk7Cj4gKwo+ICsJaWYgKGRlYnVnKQo+ICsJCWlndF9pbmZvKCJDb21iaW5hdGlvbiB3aXRo IGxlYXN0IHdlaWdodCAlZCh0b3RhbCBjb21iaW5hdGlvbnMgJWQpOlxuIiwKPiArCQkgICAgICAg ICBjdHgubWluX2NvbWIudG90YWxfd2VpZ2h0LCBjdHgubWF4X2NvbWJpbmF0aW9ucyk7Cj4gKwo+ ICsJbWVtc2V0KHBpcGVfZGJ1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBQaXBlREJ1ZikgKiBJOTE1X01B WF9QSVBFUyk7Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEk5MTVfTUFYX1BJUEVTOyBpKyspIHsK PiArCQlpZiAoY3R4Lm1pbl9jb21iLnBpcGVfbm9kZXNbaV0pIHsKPiArCQkJaW50IHBpcGVfaW5k ZXggPSBjdHgubWluX2NvbWIucGlwZV9ub2Rlc1tpXS0+aWQ7Cj4gKwo+ICsJCQlwaXBlX2RidWZb cGlwZV9pbmRleF0ucGlwZSA9IGN0eC5taW5fY29tYi5waXBlX25vZGVzW2ldOwo+ICsJCQltZW1j cHkoJnBpcGVfZGJ1ZltwaXBlX2luZGV4XS5kYnVmLAo+ICsJCQkgICAgICAgJmN0eC5taW5fY29t Yi5zbGljZXNbaSAqIHNsaWNlc19wZXJfcGlwZV0sCj4gKwkJCSAgICAgICBzaXplb2Yoc3RydWN0 IEdyYXBoTm9kZSAqKSAqIHNsaWNlc19wZXJfcGlwZSk7Cj4gKwkJfQo+ICsJfQo+ICsKPiArCWln dF9pbmZvKCJcdFx0e1xuIik7Cj4gKwlwaXBlID0gMDsKPiArCWlndF9pbmZvKCJcdFx0XHRcdC5h Y3RpdmVfcGlwZXMgPSAiKTsKPiArCWZvciAoaSA9IDA7IGkgPCBJOTE1X01BWF9QSVBFUzsgaSsr KSB7Cj4gKwkJaWYgKHBpcGVfZGJ1ZltpXS5waXBlKSB7Cj4gKwkJCWlndF9pbmZvKCJCSVQoJXMp IiwgcGlwZV9uYW1lc1twaXBlX2RidWZbaV0ucGlwZS0+aWRdKTsKPiArCQkJaWYgKHBpcGUgPCAo bnVtX3BpcGVzIC0gMSkpCj4gKwkJCQlpZ3RfaW5mbygiIHwgIik7Cj4gKwkJCXBpcGUrKzsKPiAr CQl9Cj4gKwl9Cj4gKwlpZ3RfaW5mbygiLFxuXHRcdFx0XHR7XG4iKTsKPiArCW51bV9waXBlcyA9 IDA7Cj4gKwlmb3IgKHBpcGUgPSAwOyBwaXBlIDwgSTkxNV9NQVhfUElQRVM7IHBpcGUrKykKPiAr CQlpZiAocGlwZV9kYnVmW3BpcGVdLnBpcGUpCj4gKwkJCW51bV9waXBlcysrOwo+ICsKPiArCXBp cGVzX2NvdW50ID0gMDsKPiArCWZvciAocGlwZSA9IDA7IHBpcGUgPCBJOTE1X01BWF9QSVBFUzsg cGlwZSsrKSB7Cj4gKwkJaWYgKHBpcGVfZGJ1ZltwaXBlXS5waXBlKSB7Cj4gKwkJCWlndF9pbmZv KCJcdFx0XHRcdFx0XHRbJXNdID0gIiwgcGlwZV9uYW1lc1twaXBlX2RidWZbcGlwZV0ucGlwZS0+ aWRdKTsKPiArCQkJZm9yIChpID0gMDsgaSA8IHNsaWNlc19wZXJfcGlwZTsgaSsrKSB7Cj4gKwkJ CQlpbnQgc2xpY2VfaW5kZXhfY29udmVydGVkOwo+ICsJCQkJc3RydWN0IEdyYXBoTm9kZSAqbmV4 dF9zbGljZSA9Cj4gKwkJCQkJCXBpcGVfZGJ1ZltwaXBlXS5kYnVmW2krMV07Cj4gKwkJCQlib29s IG5vdF9sYXN0ID0gaSA8IChzbGljZXNfcGVyX3BpcGUgLSAxKTsKPiArCj4gKwkJCQlpZiAoIXBp cGVfZGJ1ZltwaXBlXS5kYnVmW2ldKQo+ICsJCQkJCWJyZWFrOwo+ICsKPiArCQkJCXNsaWNlX2lu ZGV4X2NvbnZlcnRlZCA9Cj4gKwkJCQkJcGlwZV9kYnVmW3BpcGVdLmRidWZbaV0tPmlkOwo+ICsK PiArCQkJCWlmIChub3RfbGFzdCAmJiBuZXh0X3NsaWNlKSB7Cj4gKwkJCQkJaWd0X2luZm8oIkJJ VChEQlVGX1MlZCkgfCAiLAo+ICsJCQkJCQkgc2xpY2VfaW5kZXhfY29udmVydGVkICsgMSk7Cj4g KwkJCQl9IGVsc2Ugewo+ICsJCQkJCWlndF9pbmZvKCJCSVQoREJVRl9TJWQpIiwKPiArCQkJCQkJ IHNsaWNlX2luZGV4X2NvbnZlcnRlZCArIDEpOwo+ICsJCQkJfQo+ICsJCQkJcGlwZXNfY291bnQr KzsKPiArCQkJfQo+ICsJCQlpZiAocGlwZXNfY291bnQgPCBudW1fcGlwZXMpIHsKPiArCQkJCQlp Z3RfaW5mbygiLFxuIik7Cj4gKwkJCX0KPiArCQkJZWxzZQo+ICsJCQkJYnJlYWs7Cj4gKwkJfQo+ ICsJfQo+ICsJaWd0X2luZm8oIlxuXHRcdFx0XHR9XG5cdFx0fSxcbiIpOwo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCBwcmludF90YWJsZShzdHJ1Y3QgR3JhcGhOb2Rl ICoqcGlwZXMsIGludCBudW1fcGlwZXMsCj4gKwkJCXN0cnVjdCBHcmFwaE5vZGUgKipzbGljZXMs IGludCBudW1fc2xpY2VzLAo+ICsJCQlpbnQgc2xpY2VzX3Blcl9waXBlKQo+ICt7Cj4gKwl1bnNp Z25lZCBpbnQgaSwgajsKPiArCWludCBudW1fY29tYmluYXRpb25zID0gMSA8PCBudW1fcGlwZXM7 Cj4gKwo+ICsJaWYgKG51bV9waXBlcyA+IEk5MTVfTUFYX1BJUEVTKSB7Cj4gKwkJaWd0X2luZm8o IlRvbyBtYW55IHBpcGVzICVkXG4iLCBudW1fcGlwZXMpOwo+ICsJCXJldHVybjsKPiArCX0KPiAr Cj4gKwlpZiAobnVtX3NsaWNlcyA+IEk5MTVfTUFYX1NMSUNFUykgewo+ICsJCWlndF9pbmZvKCJU b28gbWFueSBzbGljZXMgJWRcbiIsIG51bV9zbGljZXMpOwo+ICsJCXJldHVybjsKPiArCX0KPiAr Cj4gKwlpZ3RfaW5mbygiLyogQXV0b2dlbmVyYXRlZCB3aXRoIGlndC90b29scy9pbnRlbF9kYnVm X21hcCB0b29sOiAqL1xuIik7Cj4gKwlpZ3RfaW5mbygie1xuIik7Cj4gKwlmb3IgKGkgPSAxOyBp IDwgbnVtX2NvbWJpbmF0aW9uczsgaSsrKSB7Cj4gKwkJc3RydWN0IEdyYXBoTm9kZSAqdG1wW0k5 MTVfTUFYX1BJUEVTXTsKPiArCj4gKwkJbWVtY3B5KHRtcCwgcGlwZXMsIEk5MTVfTUFYX1BJUEVT ICogc2l6ZW9mKHN0cnVjdCBHcmFwaE5vZGUgKikpOwo+ICsKPiArCQlmb3IgKGogPSAwOyBqIDwg STkxNV9NQVhfU0xJQ0VTOyBqKyspIHsKPiArCQkJaWYgKHNsaWNlc1tqXSkKPiArCQkJCXNsaWNl c1tqXS0+dXNlX2NvdW50ID0gMDsKPiArCQl9Cj4gKwo+ICsJCWZvciAoaiA9IDA7IGogPCBJOTE1 X01BWF9QSVBFUzsgaisrKSB7Cj4gKwkJCWlmICghKGkgJiAoMSA8PCBqKSkpIHsKPiArCQkJCXRt cFtqXSA9IDA7Cj4gKwkJCX0KPiArCQl9Cj4gKwo+ICsJCWlmIChwcmludF9kYnVmX21hc2tfZm9y X3BpcGVzKGksIHRtcCwgbnVtX3NsaWNlcykpCj4gKwkJCWJyZWFrOwo+ICsJfQo+ICsJaWd0X2lu Zm8oIn07XG4iKTsKPiArfQo+ICsKPiArZW51bSBvcHQgewo+ICsJT1BUX1VOS05PV04gPSAnPycs Cj4gKwlPUFRfRU5EID0gLTEsCj4gKwlPUFRfR0VOLAo+ICsJT1BUX1VTQUdFLAo+ICsJT1BUX0dS QVBILAo+ICsJT1BUX0RFQlVHLAo+ICsJT1BUX1NMSUNFU19QRVJfUElQRQo+ICt9Owo+ICsKPiAr c3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqdG9vbG5hbWUpCj4gK3sKPiArCWZwcmludGYo c3RkZXJyLCAidXNhZ2U6ICVzIiwgdG9vbG5hbWUpOwo+ICsJZnByaW50ZihzdGRlcnIsICIgWy0t Z2VuPTxHRU4+XSIKPiArCQkJIiBbLS1zbGljZXNfcGVyX3BpcGU9PG51bWJlcj5dIgo+ICsJCQki IFstLWdyYXBoPVwiUElQRV9BLURCVUZfUzEtUElQRV9CLS4uLlwiXSIKPiArCQkJIiBbLS1kZWJ1 Z10iCj4gKwkJCSIgWy0taGVscF1cbiIpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHBpcGVfc3Ry X3RvX251bShjb25zdCBjaGFyICpzdHIpCj4gK3sKPiArCWludCBpOwo+ICsKPiArCWZvciAoaSA9 IDA7IGkgPCBBUlJBWV9TSVpFKHBpcGVfbmFtZXMpOyBpKyspIHsKPiArCQlpZiAoIXN0cmNtcChz dHIsIHBpcGVfbmFtZXNbaV0pKSB7Cj4gKwkJCXJldHVybiBpOwo+ICsJCX0KPiArCX0KPiArCXJl dHVybiAtMTsKPiArfQo+ICsKPiArc3RhdGljIGludCBkYnVmX3N0cl90b19udW0oY29uc3QgY2hh ciAqc3RyKQo+ICt7Cj4gKwlpbnQgaTsKPiArCj4gKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShzbGljZV9uYW1lcyk7IGkrKykgewo+ICsJCWlmICghc3RyY21wKHN0ciwgc2xpY2VfbmFtZXNb aV0pKSB7Cj4gKwkJCXJldHVybiBpOwo+ICsJCX0KPiArCX0KPiArCXJldHVybiAtMTsKPiArfQo+ ICsKPiArI2RlZmluZSBNQVhfR1JBUEhfU1RSIDgwCj4gKwo+ICtzdGF0aWMgdm9pZCBwYXJzZV9n cmFwaF9zdHIoY2hhciAqZ3JhcGhfc3RyLCBzdHJ1Y3QgR3JhcGhOb2RlICoqcGlwZXMsCj4gKwkJ CSAgICBzdHJ1Y3QgR3JhcGhOb2RlICoqc2xpY2VzLCBpbnQgKm51bV9zbGljZXMsCj4gKwkJCSAg ICBpbnQgKm51bV9waXBlcykKPiArewo+ICsJY2hhciogdG9rZW4gPSBzdHJ0b2soZ3JhcGhfc3Ry LCAiLSIpOwo+ICsJc3RydWN0IEdyYXBoTm9kZSAqY3VyX25vZGUgPSBOVUxMLCAqbGFzdF9ub2Rl ID0gTlVMTDsKPiArCWludCBuX3BpcGVzID0gMCwgbl9zbGljZXMgPSAwOwo+ICsKPiArCXdoaWxl ICh0b2tlbiAhPSBOVUxMKSB7Cj4gKwkJaW50IGluZGV4Owo+ICsKPiArCQlpbmRleCA9IHBpcGVf c3RyX3RvX251bSh0b2tlbik7Cj4gKwo+ICsJCWxhc3Rfbm9kZSA9IGN1cl9ub2RlOwo+ICsJCWlm IChpbmRleCA+PSAwKSB7Cj4gKwkJCWN1cl9ub2RlID0gcGlwZXNbaW5kZXhdOwo+ICsJCQluX3Bp cGVzKys7Cj4gKwkJfSBlbHNlIHsKPiArCQkJaW5kZXggPSBkYnVmX3N0cl90b19udW0odG9rZW4p Owo+ICsJCQlpZiAoaW5kZXggPj0gMCkgewo+ICsJCQkJY3VyX25vZGUgPSBzbGljZXNbaW5kZXhd Owo+ICsJCQkJbl9zbGljZXMrKzsKPiArCQkJfQo+ICsJCX0KPiArCQlpZiAobGFzdF9ub2RlICYm IGN1cl9ub2RlKQo+ICsJCQljb25uZWN0X25vZGVzKGxhc3Rfbm9kZSwgY3VyX25vZGUsIDEpOwo+ ICsKPiArCQl0b2tlbiA9IHN0cnRvayhOVUxMLCAiLSIpOwo+ICsJfQo+ICsJKm51bV9zbGljZXMg PSBuX3NsaWNlczsKPiArCSpudW1fcGlwZXMgPSBuX3BpcGVzOwo+ICt9Cj4gKwo+ICtpbnQgbWFp bihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCj4gK3sKPiArCXN0cnVjdCBHcmFwaE5vZGUgKnBpcGVz W0k5MTVfTUFYX1BJUEVTXTsKPiArCXN0cnVjdCBHcmFwaE5vZGUgKnNsaWNlc1tJOTE1X01BWF9T TElDRVNdOwo+ICsJc3RydWN0IEdyYXBoTm9kZSAqcGlwZUEsICpwaXBlQiwgKnBpcGVDLCAqcGlw ZUQ7Cj4gKwlzdHJ1Y3QgR3JhcGhOb2RlICpzbGljZTEsICpzbGljZTIsICpzbGljZTMsICpzbGlj ZTQ7Cj4gKwlpbnQgZ2VuID0gMTIsIGluZGV4Owo+ICsJZW51bSBvcHQgb3B0Owo+ICsJY2hhciAq ZW5kcDsKPiArCWNoYXIgZ3JhcGhfc3RyW01BWF9HUkFQSF9TVFJdOwo+ICsJaW50IHNsaWNlc19w ZXJfcGlwZSA9IEk5MTVfTUFYX1NMSUNFU19QRVJfUElQRTsKPiArCWNvbnN0IGNoYXIgKnRvb2xu YW1lID0gYXJndlswXTsKPiArCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKPiAr CQl7ICJnZW4iLAkJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsCU9QVF9HRU4gfSwKPiArCQl7ICJn cmFwaCIsCQlyZXF1aXJlZF9hcmd1bWVudCwJTlVMTCwJT1BUX0dSQVBIIH0sCj4gKwkJeyAic2xp Y2VzX3Blcl9waXBlIiwJcmVxdWlyZWRfYXJndW1lbnQsCU5VTEwsCU9QVF9TTElDRVNfUEVSX1BJ UEUgfSwKPiArCQl7ICJoZWxwIiwJCW5vX2FyZ3VtZW50LAkJTlVMTCwJT1BUX1VTQUdFIH0sCj4g KwkJeyAiZGVidWciLAkJbm9fYXJndW1lbnQsCQlOVUxMLAlPUFRfREVCVUcgfSwKPiArCQl7IDAg fQo+ICsJfTsKPiArCj4gKwludW1fZWRnZXMgPSAwOwo+ICsJbnVtX25vZGVzID0gMDsKPiArCj4g Kwlmb3IgKG9wdCA9IDA7IG9wdCAhPSBPUFRfRU5EOyApIHsKPiArCQlvcHQgPSBnZXRvcHRfbG9u ZyhhcmdjLCBhcmd2LCAiIiwgb3B0aW9ucywgJmluZGV4KTsKPiArCj4gKwkJc3dpdGNoIChvcHQp IHsKPiArCQljYXNlIE9QVF9HRU46Cj4gKwkJCWdlbiA9IHN0cnRvdWwob3B0YXJnLCAmZW5kcCwg MCk7Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgT1BUX1NMSUNFU19QRVJfUElQRToKPiArCQkJc2xp Y2VzX3Blcl9waXBlID0gbWluKHN0cnRvdWwob3B0YXJnLCAmZW5kcCwgMCksCj4gKwkJCQkJICAg ICAgSTkxNV9NQVhfU0xJQ0VTX1BFUl9QSVBFKTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBPUFRf REVCVUc6Cj4gKwkJCWRlYnVnID0gdHJ1ZTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSBPUFRfR1JB UEg6Cj4gKwkJCXN0cm5jcHkoZ3JhcGhfc3RyLCBvcHRhcmcsIE1BWF9HUkFQSF9TVFIpOwo+ICsJ CQlncmFwaF9zdHJbTUFYX0dSQVBIX1NUUiAtIDFdID0gMDsKPiArCQkJZ2VuID0gMDsKPiArCQlj YXNlIE9QVF9FTkQ6Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgT1BUX1VTQUdFOiAvKiBmYWxsLXRo cm91Z2ggKi8KPiArCQljYXNlIE9QVF9VTktOT1dOOgo+ICsJCQl1c2FnZSh0b29sbmFtZSk7Cj4g KwkJCXJldHVybiBFWElUX0ZBSUxVUkU7Cj4gKwkJfQo+ICsJfQo+ICsJcGlwZUEgPSBjcmVhdGVf Z3JhcGhfbm9kZShQSVBFLCAwKTsKPiArCXBpcGVCID0gY3JlYXRlX2dyYXBoX25vZGUoUElQRSwg MSk7Cj4gKwlwaXBlQyA9IGNyZWF0ZV9ncmFwaF9ub2RlKFBJUEUsIDIpOwo+ICsJcGlwZUQgPSBj cmVhdGVfZ3JhcGhfbm9kZShQSVBFLCAzKTsKPiArCXNsaWNlMSA9IGNyZWF0ZV9ncmFwaF9ub2Rl KERCVUZfU0xJQ0UsIDApOwo+ICsJc2xpY2UyID0gY3JlYXRlX2dyYXBoX25vZGUoREJVRl9TTElD RSwgMSk7Cj4gKwlzbGljZTMgPSBjcmVhdGVfZ3JhcGhfbm9kZShEQlVGX1NMSUNFLCAyKTsKPiAr CXNsaWNlNCA9IGNyZWF0ZV9ncmFwaF9ub2RlKERCVUZfU0xJQ0UsIDMpOwo+ICsKPiArCW1lbXNl dChwaXBlcywgMCwgSTkxNV9NQVhfUElQRVMgKiBzaXplb2Yoc3RydWN0IEdyYXBoTm9kZSAqKSk7 Cj4gKwltZW1zZXQoc2xpY2VzLCAwLCBJOTE1X01BWF9TTElDRVMgKiBzaXplb2Yoc3RydWN0IEdy YXBoTm9kZSAqKSk7Cj4gKwo+ICsJaWYgKCFnZW4pIHsKPiArCQlpbnQgbnVtX3NsaWNlcyA9IDAs IG51bV9waXBlcyA9IDA7Cj4gKwkJLyoKPiArCQkgKiBQcmVwYXJlIHRvIGdlbmVyYXRlIGFzc2ln bm1lbnRzIGZvciBJQ0wsIHdoaWNoCj4gKwkJICogaGFzIDMgcGlwZXMgYW5kIDIgREJ1ZiBzbGlj ZXMuCj4gKwkJICovCgpjdXQnbidwYXN0ZSBjb21tZW50IGFib3ZlPyA6KQoKPiArCQlzbGljZXNb MF0gPSBzbGljZTE7Cj4gKwkJc2xpY2VzWzFdID0gc2xpY2UyOwo+ICsJCXNsaWNlc1syXSA9IHNs aWNlMzsKPiArCQlzbGljZXNbM10gPSBzbGljZTQ7Cj4gKwkJcGlwZXNbMF0gPSBwaXBlQTsKPiAr CQlwaXBlc1sxXSA9IHBpcGVCOwo+ICsJCXBpcGVzWzJdID0gcGlwZUM7Cj4gKwkJcGlwZXNbM10g PSBwaXBlRDsKPiArCj4gKwkJcGFyc2VfZ3JhcGhfc3RyKGdyYXBoX3N0ciwgcGlwZXMsIHNsaWNl cywgJm51bV9zbGljZXMsCj4gKwkJCQkmbnVtX3BpcGVzKTsKPiArCj4gKwkJdHJhdmVyc2VfZ3Jh cGgocGlwZXNbMF0sIDApOwo+ICsKPiArCQlwcmludF90YWJsZShwaXBlcywgbnVtX3BpcGVzLCBz bGljZXMsIG51bV9zbGljZXMsIHNsaWNlc19wZXJfcGlwZSk7Cj4gKwo+ICsJfSBlbHNlIGlmIChn ZW4gPT0gMTEpIHsKPiArCj4gKwkJLyoKPiArCQkgKiBQcmVwYXJlIHRvIGdlbmVyYXRlIGFzc2ln bm1lbnRzIGZvciBJQ0wsIHdoaWNoCj4gKwkJICogaGFzIDMgcGlwZXMgYW5kIDIgREJ1ZiBzbGlj ZXMuCj4gKwkJICovCj4gKwkJc2xpY2VzWzBdID0gc2xpY2UxOwo+ICsJCXNsaWNlc1sxXSA9IHNs aWNlMjsKPiArCQlwaXBlc1swXSA9IHBpcGVBOwo+ICsJCXBpcGVzWzFdID0gcGlwZUI7Cj4gKwkJ cGlwZXNbMl0gPSBwaXBlQzsKPiArCj4gKwkJLyoKPiArCQkgKiBCU3BlYyAxMjcxNi4gR2VuZXJh dGUgREJ1ZiBTbGljZXMgdGFibGUgZm9yIElDTCwKPiArCQkgKiBHcmFwaChlYWNoIGVkZ2UgYXNz dW1lZCB0byBoYXZlIHdlaWdodCAxKToKPiArCQkgKiBQaXBlQSAtIERCVUZfUzEgLSBQaXBlQiAt IFBpcGVDIC0gREJVRl9TMgo+ICsJCSAqLwo+ICsJCWNvbm5lY3Rfbm9kZXMocGlwZUEsIHNsaWNl MSwgMSk7Cj4gKwkJY29ubmVjdF9ub2RlcyhzbGljZTEsIHBpcGVCLCAxKTsKPiArCQljb25uZWN0 X25vZGVzKHBpcGVCLCBwaXBlQywgMSk7Cj4gKwkJY29ubmVjdF9ub2RlcyhwaXBlQywgc2xpY2Uy LCAxKTsKPiArCj4gKwkJdHJhdmVyc2VfZ3JhcGgocGlwZUEsIDApOwo+ICsKPiArCQlwcmludF90 YWJsZShwaXBlcywgMywgc2xpY2VzLCAyLCAyKTsKPiArCj4gKwl9IGVsc2UgaWYgKGdlbiA9PSAx Mikgewo+ICsKPiArCQkvKgo+ICsJCSAqIFByZXBhcmUgdG8gZ2VuZXJhdGUgYXNzaWdubWVudHMg Zm9yIFRHTCwgd2hpY2gKPiArCQkgKiBoYXMgNCBwaXBlcyBhbmQgMiBEQnVmIHNsaWNlcy4KPiAr CQkgKi8KPiArCQlzbGljZXNbMF0gPSBzbGljZTE7Cj4gKwkJc2xpY2VzWzFdID0gc2xpY2UyOwo+ ICsJCXBpcGVzWzBdID0gcGlwZUE7Cj4gKwkJcGlwZXNbMV0gPSBwaXBlQjsKPiArCQlwaXBlc1sy XSA9IHBpcGVDOwo+ICsJCXBpcGVzWzNdID0gcGlwZUQ7Cj4gKwo+ICsJCS8qCj4gKwkJICogQlNw ZWMgNDkyNTUuIEdlbmVyYXRlIERCdWYgU2xpY2VzIHRhYmxlIGZvciBUR0wuCj4gKwkJICogR3Jh cGgoZWFjaCBlZGdlIGFzc3VtZWQgdG8gaGF2ZSB3ZWlnaHQgMSk6Cj4gKwkJICogUGlwZUQgLSBE QlVGX1MyIC0gUGlwZUMgLSBQaXBlQSAtIERCVUZfUzEgLSBQaXBlQgo+ICsJCSAqLwo+ICsJCWNv bm5lY3Rfbm9kZXMocGlwZUQsIHNsaWNlMiwgMSk7Cj4gKwkJY29ubmVjdF9ub2RlcyhzbGljZTIs IHBpcGVDLCAxKTsKPiArCQljb25uZWN0X25vZGVzKHBpcGVDLCBwaXBlQSwgMSk7Cj4gKwkJY29u bmVjdF9ub2RlcyhwaXBlQSwgc2xpY2UxLCAxKTsKPiArCQljb25uZWN0X25vZGVzKHNsaWNlMSwg cGlwZUIsIDEpOwo+ICsKPiArCQl0cmF2ZXJzZV9ncmFwaChwaXBlQSwgMCk7Cj4gKwo+ICsJCXBy aW50X3RhYmxlKHBpcGVzLCA0LCBzbGljZXMsIDIsIDIpOwo+ICsJfQoKV2hhdCBhYm91dCBpZiBn ZW4gPT0gMTM/IE1heWJlIGFkZCBzb21lIGZvcm0gb2YgY29tbWVudCBpZiBub25lIG9mIHRoZSAK cGF0aHMgd2FzIGNob3Nlbi4gQ29udmVydCB0byBzd2l0Y2gge2Nhc2U6OyBkZWZhdWx0Ojt9IHdo ZXJlIGRlZmF1bHQgCndvdWxkIGxpc3Qgd2h5IG5vIHBhdGggd2FzIGNob3Nlbj8KCj4gKwo+ICsJ cmVzZXRfYWxsX25vZGVzKCk7Cj4gKwo+ICsJLyoKPiArCSAqIEZ1cnRoZXIgcGxhdGZvcm1zIGNh biBnZW5lcmF0ZSB0YWJsZSBzYW1lIHdheS4KPiArCSAqLwo+ICsKPiArCWRlc3Ryb3lfYWxsX25v ZGVzKCk7Cj4gKwo+ICsJcmV0dXJuICAwOwo+ICt9Cj4gKwo+IGRpZmYgLS1naXQgYS90b29scy9t ZXNvbi5idWlsZCBiL3Rvb2xzL21lc29uLmJ1aWxkCj4gaW5kZXggZWVjYjEyMmIuLjJiOGRmNGI0 IDEwMDY0NAo+IC0tLSBhL3Rvb2xzL21lc29uLmJ1aWxkCj4gKysrIGIvdG9vbHMvbWVzb24uYnVp bGQKPiBAQCAtMzUsNiArMzUsNyBAQCB0b29sc19wcm9ncyA9IFsKPiAgIAknaW50ZWxfd2F0ZXJt YXJrJywKPiAgIAknaW50ZWxfZ2VtX2luZm8nLAo+ICAgCSdpbnRlbF9ndnRnX3Rlc3QnLAo+ICsJ J2ludGVsX2RidWZfbWFwJywKPiAgIAknZHBjZF9yZWcnLAo+ICAgXQo+ICAgdG9vbF9kZXBzID0g aWd0X2RlcHMKPiAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkludGVsIEZpbmxhbmQgT3kKUmVnaXN0ZXJlZCBBZGRy ZXNzOiBQTCAyODEsIDAwMTgxIEhlbHNpbmtpIApCdXNpbmVzcyBJZGVudGl0eSBDb2RlOiAwMzU3 NjA2IC0gNCAKRG9taWNpbGVkIGluIEhlbHNpbmtpIAoKVGhpcyBlLW1haWwgYW5kIGFueSBhdHRh Y2htZW50cyBtYXkgY29udGFpbiBjb25maWRlbnRpYWwgbWF0ZXJpYWwgZm9yCnRoZSBzb2xlIHVz ZSBvZiB0aGUgaW50ZW5kZWQgcmVjaXBpZW50KHMpLiBBbnkgcmV2aWV3IG9yIGRpc3RyaWJ1dGlv bgpieSBvdGhlcnMgaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gSWYgeW91IGFyZSBub3QgdGhlIGlu dGVuZGVkCnJlY2lwaWVudCwgcGxlYXNlIGNvbnRhY3QgdGhlIHNlbmRlciBhbmQgZGVsZXRlIGFs bCBjb3BpZXMuCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmlndC1kZXYgbWFpbGluZyBsaXN0CmlndC1kZXZAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaWd0LWRldgo=