From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [Freedreno] [DPU PATCH 2/3] drm/msm/dp: add displayPort driver support Date: Thu, 14 Feb 2019 13:00:54 -0500 Message-ID: <20190214180054.GN114153@art_vandelay> References: <1539191759-14836-1-git-send-email-chandanu@codeaurora.org> <1539191759-14836-3-git-send-email-chandanu@codeaurora.org> <20181023162821.GE154160@art_vandelay> <03cce7603e8e65a88d08d9f3558019ac@codeaurora.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <03cce7603e8e65a88d08d9f3558019ac@codeaurora.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: chandanu@codeaurora.org Cc: freedreno@lists.freedesktop.org, linux-arm-msm@vger.kernel.org, abhinavk@codeaurora.org, seanpaul@chromium.org, dri-devel@lists.freedesktop.org, hoegsberg@google.com, Sean Paul List-Id: linux-arm-msm@vger.kernel.org T24gVGh1LCBGZWIgMTQsIDIwMTkgYXQgMDQ6Mjg6MzNBTSAtMDgwMCwgY2hhbmRhbnVAY29kZWF1 cm9yYS5vcmcgd3JvdGU6Cj4gT24gMjAxOC0xMC0yMyAwOToyOCwgU2VhbiBQYXVsIHdyb3RlOgo+ ID4gT24gV2VkLCBPY3QgMTAsIDIwMTggYXQgMTA6MTU6NThBTSAtMDcwMCwgQ2hhbmRhbiBVZGRh cmFqdSB3cm90ZToKPiA+ID4gQWRkIHRoZSBuZWVkZWQgZGlzcGxheVBvcnQgZmlsZXMgdG8gZW5h YmxlIERQIGRyaXZlcgo+ID4gPiBvbiBtc20gdGFyZ2V0Lgo+ID4gPiAKPiA+ID4gImRwX2Rpc3Bs YXkiIG1vZHVsZSBpcyB0aGUgbWFpbiBtb2R1bGUgdGhhdCBjYWxscyBpbnRvCj4gPiA+IG90aGVy IHN1Yi1tb2R1bGVzLiAiZHBfZHJtIiBmaWxlIHJlcHJlc2VudHMgdGhlIGludGVyZmFjZQo+ID4g PiBiZXR3ZWVuIERSTSBmcmFtZXdvcmsgYW5kIERQIGRyaXZlci4KPiA+ID4gCj4gPiAKPiAKPiBI ZWxsbyBTZWFuLAo+IEkgaGF2ZSByZXNwb25kZWQgdG8gYWxsIG9mIHlvdXIgY29tbWVudHMgYW5k IHF1ZXJpZXMuIEkgaGF2ZSBzcGVjaWZpZWQgdGhlCj4gY29tbWVudHMgYWRkcmVzc2VkCj4gaW4g VjIgcGF0Y2ggc2VyaWVzIGFuZCB3aGF0IEkgaGF2ZSBtaXNzZWQgdGhhdCB3aWxsIGJlIGZpeGVk IGluIFYzLgo+IAo+IAoKL3NuaXAKCj4gPiA+IAo+ID4gPiArc3RydWN0IGRzc19pb19kYXRhIHsK PiA+ID4gKwl1MzIgbGVuOwo+ID4gPiArCXZvaWQgX19pb21lbSAqYmFzZTsKPiA+ID4gK307Cj4g PiAKPiA+IGxlbiBpc24ndCB1c2VkIGFueXdoZXJlLCBzbyB0aGlzIHN0cnVjdCBjYW4gZ28gYXdh eS4gSWYgdGhlIHN0cnVjdCBnb2VzCj4gPiBhd2F5LAo+ID4geW91IGNhbiByZWFsbHkgc2ltcGxp ZnkgKG9yIGVsaW1pbmF0ZSBtc21fZHNzX2lvcmVtYXBfYnluYW1lKCkpCj4gPiAKPiAKPiBXZSB3 YW50IHRvIGtlZXAgdGhpcyBzaW5jZSB3ZSB1c2UgbGVuIGZvciBvdXIgaW50ZXJuYWwgdW5pdCBs ZXZlbCB0ZXN0aW5nCj4gYW5kIGluIHNpbXVsYXRpb24gbW9kZS4KPiAKClRoYXQncyBub3QgcmVh bGx5IGEgdmFsaWQgcmVhc29uIHRvIGtlZXAgdW51c2VkIGNvZGUgYXJvdW5kLiBXZSBjYW4ndCBy ZWFzb25hYmx5CmV4cGVjdCB1cHN0cmVhbSBkZXZlbG9wZXJzIHRvIGtub3cgd2hpY2ggc3RydWN0 cyBhbmQgdW51c2VkIGZpZWxkcyBhcmUgdXNlZCBmb3IKUXVhbGNvbW0ncyBkb3duc3RyZWFtIHRl c3RpbmcsIGFuZCBhZmFpY3QsIHRob3NlIHJlc3VsdHMgYXJlbid0IHB1Ymxpc2hlZCBzbwp0aGVy ZSdzIG5vIGJlbmVmaXQgdG8gdGhlIHVwc3RlYW0gY29tbXVuaXR5LgoKU28geW91IGNhbiBlaXRo ZXIgb3BlbnNvdXJjZSB0aGUgdW5pdCB0ZXN0cyBhbG9uZyB3aXRoIHRoZSBkcml2ZXIsIG9yIGtl ZXAgdGhlCmRvd25zdHJlYW0gY29kZSBpbiB0aGUgZG93bnN0cmVhbSBrZXJuZWwuCgovc25pcAoK PiA+ID4gKwo+ID4gPiArI2RlZmluZSBkcF9jYXRhbG9nX2dldF9wcml2KHgpIHsgXAo+ID4gCj4g PiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkcF9jYXRhbG9nX3ByaXZhdGUgKmRwX2NhdGFsb2dfZ2V0 X3ByaXYoLi4uKQo+ID4gewo+ID4gICAgICAgICAuLi4KPiA+IH0KPiA+IAo+IEZvciBpbmxpbmUs IHdlIGhhdmUgdG8gdXNlIDMgZGlmZmVyZW50IGZ1bmN0aW9ucyAob25lIGVhY2ggZm9yIGF1eCwg Y3RybCBhbmQKPiBwYW5lbCkuCj4gTG9va2luZyBhdCAidHlwZS1jaGVja2luZyIgdy5yLnQgbWFj cm8sIGNvbnRhaW5lcl9vZiB3aWxsIHRocm91Z2ggYW4gZXJyb3IKPiBpZiBpdHMgbm90IHZhbGlk IHBvaW50ZXIuCj4gUGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBzdGlsbCB3YW50IHRvIGNoYW5n ZSB0aGlzIG1hY3JvIHRvIGlubGluZSBmdW5jLgo+IAoKWWVhaCwgSSB0aGluayBpdCdzIHdvcnRo IGl0IHRvIGhhdmUgdGhlIDMuCgo+ID4gPiArCXN0cnVjdCBkcF9jYXRhbG9nICpkcF9jYXRhbG9n OyBcCj4gPiA+ICsJZHBfY2F0YWxvZyA9IGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgZHBfY2F0YWxv ZywgeCk7IFwKPiA+ID4gKwljYXRhbG9nID0gY29udGFpbmVyX29mKGRwX2NhdGFsb2csIHN0cnVj dCBkcF9jYXRhbG9nX3ByaXZhdGUsIFwKPiA+ID4gKwkJCQlkcF9jYXRhbG9nKTsgXAo+ID4gPiAr fQoKL3NuaXAKCj4gPiAKPiA+IFRoZW4gYWdhaW4sIEknbSBndWVzc2luZyBoaXR0aW5nIHRoZSBO VUxMIGNhc2UgaXMgbGlrZWx5IGltcG9zc2libGUsIHNvCj4gPiB5b3UgY2FuCj4gPiBwcm9iYWJs eSByZW1vdmUgYWxsIG9mIHRoZSBtYWNoaW5lcnkgYXJvdW5kIGNoZWNraW5nICFhdXguCj4gPiAK PiAKPiBSZW1vdmVkIG1vc3Qgb2YgdGhlIGFyZyBudWxsIGNoZWNrcyBleGNlcHQgZmV3IEFQSXMg d2hlcmUKPiB1bml0LXRlc3Rpbmcvc2ltdWxhdG9yLW1vZGUgaXMgdXNlZC4KPiAKClRoZXJlIHNo b3VsZCBvbmx5IGJlIG51bGwgY2hlY2tzIGlmIG51bGwgaXMgYSBwb3NzaWJpbGl0eS4gSWYgeW91 IGhhdmUKcGF0aGVsb2dpY2FsIHVuaXQgdGVzdHMgaW5qZWN0aW5nIGJvZ3VzIHZhbHVlcyBpbiB5 b3VyIGZ1bmN0aW9uLCB5b3Ugc2hvdWxkCnByb2JhYmx5IGp1c3QgZml4L2RlbGV0ZSB0aG9zZSB1 bml0IHRlc3RzLiBJZiB1cHN0cmVhbSBkb2Vzbid0IGhhdmUKdmlzaWJpbGl0eSBpbnRvIHlvdXIg aW50ZXJuYWwgdGVzdGluZywgd2UgY2FuJ3QgZGlzdGluZ3Vpc2ggYmV0d2Vlbgp0ZXN0LXBsZWFz aW5nIHZzIHVudXNlZCBjb2RlLgoKPiA+ID4gK3N0YXRpYyB2b2lkIGRwX2NhdGFsb2dfY3RybF9z ZW5kX3BoeV9wYXR0ZXJuKHN0cnVjdCBkcF9jYXRhbG9nX2N0cmwKPiA+ID4gKmN0cmwsCj4gPiA+ ICsJCQl1MzIgcGF0dGVybikKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19wcml2 YXRlICpjYXRhbG9nOwo+ID4gPiArCXUzMiB2YWx1ZSA9IDB4MDsKPiA+ID4gKwl2b2lkIF9faW9t ZW0gKmJhc2UgPSBOVUxMOwo+ID4gPiArCj4gPiA+ICsJaWYgKCFjdHJsKSB7Cj4gPiA+ICsJCXBy X2VycigiaW52YWxpZCBpbnB1dFxuIik7Cj4gPiA+ICsJCXJldHVybjsKPiA+ID4gKwl9Cj4gPiA+ ICsKPiA+ID4gKwlkcF9jYXRhbG9nX2dldF9wcml2KGN0cmwpOwo+ID4gPiArCj4gPiA+ICsJYmFz ZSA9IGNhdGFsb2ctPmlvLT5kcF9saW5rLmJhc2U7Cj4gPiA+ICsKPiA+ID4gKwlkcF93cml0ZShi YXNlICsgRFBfU1RBVEVfQ1RSTCwgMHgwKTsKPiA+IAo+ID4gRG8geW91IHJlYWxseSBuZWVkIHRv IGRvIHRoaXM/Cj4gPiAKPiBZZXMsIHRvIG1ha2Ugc3VyZSBubyBvdGhlciBwYXR0ZXJuIGlzIHNl dC9lbmFibGVkIGluIGhhcmR3YXJlIGJlZm9yZSBhbnkgbmV3Cj4gcGF0dGVybiBpcyBjb25maWd1 cmVkLgo+IAo+ID4gPiArCj4gPiA+ICsJc3dpdGNoIChwYXR0ZXJuKSB7Cj4gPiA+ICsJY2FzZSBE UF9URVNUX1BIWV9QQVRURVJOX0QxMF8yX05PX1NDUkFNQkxJTkc6Cj4gPiA+ICsJCWRwX3dyaXRl KGJhc2UgKyBEUF9TVEFURV9DVFJMLCAweDEpOwo+ID4gPiArCQlicmVhazsKPiA+ID4gKwljYXNl IERQX1RFU1RfUEhZX1BBVFRFUk5fU1lNQk9MX0VSUl9NRUFTVVJFTUVOVF9DTlQ6Cj4gPiA+ICsJ CXZhbHVlICY9IH4oMSA8PCAxNik7Cj4gPiA+ICsJCWRwX3dyaXRlKGJhc2UgKyBEUF9IQlIyX0NP TVBMSUFOQ0VfU0NSQU1CTEVSX1JFU0VULCB2YWx1ZSk7Cj4gPiA+ICsJCXZhbHVlIHw9IDB4RkM7 Cj4gPiA+ICsJCWRwX3dyaXRlKGJhc2UgKyBEUF9IQlIyX0NPTVBMSUFOQ0VfU0NSQU1CTEVSX1JF U0VULCB2YWx1ZSk7Cj4gPiA+ICsJCWRwX3dyaXRlKGJhc2UgKyBEUF9NQUlOTElOS19MRVZFTFMs IDB4Mik7Cj4gPiA+ICsJCWRwX3dyaXRlKGJhc2UgKyBEUF9TVEFURV9DVFJMLCAweDEwKTsKPiA+ ID4gKwkJYnJlYWs7Cj4gPiA+ICsJY2FzZSBEUF9URVNUX1BIWV9QQVRURVJOX1BSQlM3Ogo+ID4g PiArCQlkcF93cml0ZShiYXNlICsgRFBfU1RBVEVfQ1RSTCwgMHgyMCk7Cj4gPiA+ICsJCWJyZWFr Owo+ID4gPiArCWNhc2UgRFBfVEVTVF9QSFlfUEFUVEVSTl84MF9CSVRfQ1VTVE9NX1BBVFRFUk46 Cj4gPiA+ICsJCWRwX3dyaXRlKGJhc2UgKyBEUF9TVEFURV9DVFJMLCAweDQwKTsKPiA+ID4gKwkJ LyogMDAxMTExMTAwMDAwMTExMTEwMDAwMDExMTExMDAwMDAgKi8KPiA+ID4gKwkJZHBfd3JpdGUo YmFzZSArIERQX1RFU1RfODBCSVRfQ1VTVE9NX1BBVFRFUk5fUkVHMCwgMHgzRTBGODNFMCk7Cj4g PiA+ICsJCS8qIDAwMDAxMTExMTAwMDAwMTExMTEwMDAwMDExMTExMDAwICovCj4gPiA+ICsJCWRw X3dyaXRlKGJhc2UgKyBEUF9URVNUXzgwQklUX0NVU1RPTV9QQVRURVJOX1JFRzEsIDB4MEY4M0Uw RjgpOwo+ID4gPiArCQkvKiAxMTExMTAwMDAwMTExMTEwICovCj4gPiA+ICsJCWRwX3dyaXRlKGJh c2UgKyBEUF9URVNUXzgwQklUX0NVU1RPTV9QQVRURVJOX1JFRzIsIDB4MDAwMEY4M0UpOwo+ID4g PiArCQlicmVhazsKPiA+ID4gKwljYXNlIERQX1RFU1RfUEhZX1BBVFRFUk5fSEJSMl9DVFNfRVlF X1BBVFRFUk46Cj4gPiA+ICsJCXZhbHVlID0gQklUKDE2KTsKPiA+ID4gKwkJZHBfd3JpdGUoYmFz ZSArIERQX0hCUjJfQ09NUExJQU5DRV9TQ1JBTUJMRVJfUkVTRVQsIHZhbHVlKTsKPiA+ID4gKwkJ dmFsdWUgfD0gMHhGQzsKPiA+ID4gKwkJZHBfd3JpdGUoYmFzZSArIERQX0hCUjJfQ09NUExJQU5D RV9TQ1JBTUJMRVJfUkVTRVQsIHZhbHVlKTsKPiA+ID4gKwkJZHBfd3JpdGUoYmFzZSArIERQX01B SU5MSU5LX0xFVkVMUywgMHgyKTsKPiA+ID4gKwkJZHBfd3JpdGUoYmFzZSArIERQX1NUQVRFX0NU UkwsIDB4MTApOwo+ID4gCj4gPiBUaGlzIGNvZGUgaXMgdGhlIGV4YWN0IHNhbWUgYXMgdGhlIGNh c2UgZm9yCj4gPiBEUF9URVNUX1BIWV9QQVRURVJOX1NZTUJPTF9FUlJfTUVBU1VSRU1FTlRfQ05U LCBhc2lkZSBmcm9tIEJJVCgxNikgdnMKPiA+IH5CSVQoMTYpLiBDYW4geW91IHBsZWFzZSBjb21i aW5lIHRoZXNlIGNhc2VzCj4gPiBhbmQgc2hhcmUgY29kZT8KPiAKPiBXaWxsIGZpeCB0aGlzIGlu IFYzLgo+IAo+ID4gCj4gPiA+ICsJCWJyZWFrOwo+ID4gPiArCWRlZmF1bHQ6Cj4gPiA+ICsJCXBy X2RlYnVnKCJObyB2YWxpZCB0ZXN0IHBhdHRlcm4gcmVxdWVzdGVkOiAweCV4XG4iLCBwYXR0ZXJu KTsKPiA+ID4gKwkJcmV0dXJuOwo+ID4gPiArCX0KPiA+IAo+ID4gQWxsIG9mIHRoZSBEUF9TVEFU RV9DVFJMIHZhbHVlcyBzaG91bGQgYmUgI2RlZmluZWQsIGFuZCB5b3UgY2FuIG1vdmUgdGhlCj4g PiB3cml0ZQo+ID4gZG93biBoZXJlIGluc3RlYWQgb2YgZHVwbGljYXRpbmcgaXQgZXZlcnl3aGVy ZSAod2l0aAo+ID4gRFBfVEVTVF9QSFlfUEFUVEVSTl84MF9CSVRfQ1VTVE9NX1BBVFRFUk4gd3Jp dGluZyBhIDApLgo+ID4gCj4gQWxsIHRoZSBEUF9TVEFURV9DVFJMIHZhbHVlcyBhcmUgZGVmaW5l cyBpbiBWMi4KPiAKPiBJIGFtIG5vdCBjbGVhciBvbiBtb3ZpbmcgdGhlIHdyaXRlIG9wZXJhdGlv bnMgYWZ0ZXIgdGhlIHN3aXRjaCBjYXNlcy4gQ2FuCj4geW91IHBsZWFzZSBwcm92aWRlCj4gc29t ZSBtb3JlIGRldGFpbHM/CgpJIHRoaW5rIHdoYXQgSSBtZWFudCB3YXMgdGhhdCBzaW5jZSBhbGwg Y2FzZXMgZmluaXNoIHdpdGggYSB3cml0ZSB0bwpEUF9TVEFURV9DVFJMLCB5b3UgY2FuIG1vdmUg dGhhdCB3cml0ZSBvdXQgb2YgZWFjaCBjYXNlIGFuZCBwdXQgaXQgYXQgdGhlCmJvdHRvbS4gQnV0 IEkgdGhpbmsgSSBtaXNzZWQgdGhhdCBEUF9TVEFURV9DVFJMIGlzIHNldCBhdCB0aGUgYmVnaW5u aW5nIG9mCkRQX1RFU1RfUEhZX1BBVFRFUk5fODBfQklUX0NVU1RPTV9QQVRURVJOLCBzbyBJIGRv bid0IHRoaW5rIHRoYXQnbGwgd29yay4KCi9zbmlwCgo+ID4gPiArc3RydWN0IGRwX2N0cmxfcHJp dmF0ZSB7Cj4gPiA+ICsJc3RydWN0IGRwX2N0cmwgZHBfY3RybDsKPiA+ID4gKwo+ID4gPiArCXN0 cnVjdCBkZXZpY2UgKmRldjsKPiA+ID4gKwlzdHJ1Y3QgZHBfYXV4ICphdXg7Cj4gPiA+ICsJc3Ry dWN0IGRwX3BhbmVsICpwYW5lbDsKPiA+ID4gKwlzdHJ1Y3QgZHBfbGluayAqbGluazsKPiA+ID4g KwlzdHJ1Y3QgZHBfcG93ZXIgKnBvd2VyOwo+ID4gPiArCXN0cnVjdCBkcF9wYXJzZXIgKnBhcnNl cjsKPiA+ID4gKwlzdHJ1Y3QgZHBfY2F0YWxvZ19jdHJsICpjYXRhbG9nOwo+ID4gCj4gPiBPbmNl IHlvdSByZW1vdmUgc3RydWN0IGRwX2N0cmwgYW5kIGNhbGwgdGhlIGZ1bmN0aW9ucyBkaXJlY3Rs eSwgSQo+ID4gc3VzcGVjdCB5b3UKPiA+IGNhbiBnZXQgcmlkIG9mIGFsbCBvZiB0aGVzZS4KPiA+ IAo+IEV2ZW4gdGhvdWdoIHdlIGNhbGwgdGhlIGZ1bmN0aW9ucyBkaXJlY3RseSwgd2Ugc3RpbGwg bmVlZCB2YXJpYWJsZXMgcHJlc2VudAo+IGluIGVhY2ggbW9kdWxlLgo+IEZvciBleGFtcGxlLCB3 ZSBuZWVkIHRvIGFjY2VzcyBsaW5rIHBhcmFtZXRlcnMsIHBhbmVsIHBhcmFtZXRlcnMgZXRjCj4g Cj4gVW5uZWNlc3Nhcnkgc3R1ZmYgaXMgcmVtb3ZlZCBidXQgd2Ugc3RpbGwgbmVlZCBvdGhlciB2 YXJpYWJsZXMgaW4gdGhlCj4gc3RydWN0dXJlLiBBbGwgaGF2ZSBiZWVuCj4gdXBkYXRlZCBpbiBW Mi4KCk9rLCBJJ2xsIHJlLWV2YWx1YXRlIGluIHYzCgovc25pcAoKPiA+ID4gK3N0YXRpYyB2b2lk IGRwX2N0cmxfcHVzaF9pZGxlKHN0cnVjdCBkcF9jdHJsICpkcF9jdHJsKQo+ID4gPiArewo+ID4g PiArCWludCBjb25zdCBpZGxlX3BhdHRlcm5fY29tcGxldGlvbl90aW1lb3V0X21zID0gMyAqIEha IC8gMTAwOwo+ID4gCj4gPiBUaGlzIHNob3VsZCBiZSAjZGVmaW5lJ2Qgb3V0c2lkZSBvZiB0aGUg ZnVuY3Rpb25pbnN0ZWFkLiBBbHNvLCB3aHkgdGhlCj4gPiAnX21zXycKPiA+IHN1ZmZpeD8gVGhl IHVuaXRzIGFyZSBpbiBqaWZmaWVzLgo+ID4gCj4gPiBJIHRoaW5rIHNvbWV0aGluZyBsaWtlCj4g PiAKPiA+ICNkZWZpbmUgSURMRV9QQVRURVJOX0NPTVBMRVRJT05fVElNRU9VVF9KSUZGSUVTICgz MCAqIEhaIC8gMTAwMCkgLyogMzAKPiA+IG1zICovCj4gPiAKPiA+IHdvdWxkIGJlIGNsZWFyZXIu Cj4gPiAKPiBGaXhlZCBpbiBWMi4KPiAKPiA+ID4gKwlzdHJ1Y3QgZHBfY3RybF9wcml2YXRlICpj dHJsOwo+ID4gPiArCj4gPiA+ICsJaWYgKCFkcF9jdHJsKSB7Cj4gPiA+ICsJCXByX2VycigiSW52 YWxpZCBpbnB1dCBkYXRhXG4iKTsKPiA+ID4gKwkJcmV0dXJuOwo+ID4gPiArCX0KPiA+ID4gKwo+ ID4gPiArCWN0cmwgPSBjb250YWluZXJfb2YoZHBfY3RybCwgc3RydWN0IGRwX2N0cmxfcHJpdmF0 ZSwgZHBfY3RybCk7Cj4gPiA+ICsKPiA+ID4gKwlyZWluaXRfY29tcGxldGlvbigmY3RybC0+aWRs ZV9jb21wKTsKPiA+IAo+ID4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIGJ1bmNoIG9m IHBsYWNlcywgYW5kIGlkbGVfY29tcCBpcyBhbHNvCj4gPiB1c2VkIGluIGEKPiA+IGJ1bmNoIG9m IHBsYWNlcy4gQXJlIHlvdSBjZXJ0YWluIHRoaXMgaXMgdGhyZWFkLXNhZmUgaWYgeW91IGhhdmUK PiA+IGNvbmN1cnJlbnQKPiA+IGNhbGxlcnMgb3IgdXNlcnMgb2YgaWRsZV9jb21wPwo+ID4gCj4g SSBkb24ndCB0aGluayB3ZSBuZWVkIGFueSBzeW5jaHJvbml6YXRpb24gbG9naWMgZm9yIGlkbGVf Y29tcCBzaW5jZSBpdCBpcwo+IHJlaW5pdGlhbGl6ZWQgb25seQo+IHdoZW4gdGhlIGNvbXBsZXRl IGNvcmUgaXMgcmVzZXQuIE9ubHkgcGxhY2Ugd2hlcmUgaXQgaXMgbmVlZGVkIGlzIGluCj4gcHVz aF9pZGxlIHdoaWNoIGFscmVhZHkgaGFzCj4gYSBtdXRleC4KClNvIGhlcmUgYXJlIHRoZSBjYWxs c2l0ZXMgZm9yIHB1c2hfaWRsZSgpOgotIGRwX2Rpc3BsYXlfY2xlYW4tIGNhbGxlZCBvbiBleHRj b24gZXZlbnQgdGhyZWFkLCB1bmxvY2tlZAotIGRwX2Rpc3BsYXlfcHJlX2Rpc2FibGUtIGNhbGxl ZCBvbiBkcm0gdGhyZWFkLCBsb2NrZWQgd2l0aCBtb2Rlc2V0IGxvY2tzCi0gZHBfY3RybF9saW5r X21haW50ZW5hbmNlLSBjYWxsZWQgaW4gaHBkIGhhbmRsZXIsIHVubG9ja2VkCgpJdCBfc2VlbXNf IGxpa2UgdGhlcmUgY291bGQgYmUgcmFjZXMgaGVyZSwgYW5kIEkgZG9uJ3Qga25vdyB3aGljaCBt dXRleCB5b3UncmUKcmVmZXJyaW5nIHRvIGFib3ZlLiBNaW5kIHdhbGtpbmcgbWUgdGhyb3VnaCBp dCBpbiBtb3JlIGRldGFpbD8KCj4gCj4gPiA+ICsJZHBfY3RybF9zdGF0ZV9jdHJsKGN0cmwsIFNU X1BVU0hfSURMRSk7Cj4gPiA+ICsKPiA+ID4gKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGlt ZW91dCgmY3RybC0+aWRsZV9jb21wLAo+ID4gPiArCQkJaWRsZV9wYXR0ZXJuX2NvbXBsZXRpb25f dGltZW91dF9tcykpCj4gPiA+ICsJCXByX3dhcm4oIlBVU0hfSURMRSBwYXR0ZXJuIHRpbWVkb3V0 XG4iKTsKPiA+IAo+ID4gUmV0dXJuIGFuIGVycm9yPwo+ID4gCj4gSXRzIG5vdCBmYXRhbCBlcnJv ciBzaW5jZSB3ZSBhcmUgZ29pbmcgdG8gcmVzZXQgdGhlIGNvbnRyb2xsZXIgYW5kIHdlIGFyZQo+ IGdvaW5nIHRvIHJlY292ZXIgZnJvbQo+IHRoaXMgdGltZW91dC4KCkluIHRoYXQgY2FzZSwgY2Fu IHlvdSBwbGVhc2UgZG93bmdyYWRlIHRoZSBsb2cgbGV2ZWwgdG8gZGVidWcgb3IgaW5mbz8KCi9z bmlwCgo+ID4gPiArCj4gPiA+ICsJaWYgKGN0cmwtPmxpbmstPnNpbmtfcmVxdWVzdCAmIERQX1RF U1RfTElOS19QSFlfVEVTVF9QQVRURVJOKQo+ID4gCj4gPiBZb3Ugc2hvdWxkIHJlYWxseSBwcm90 ZWN0IHNpbmtfcmVxdWVzdCB3aXRoIGEgbG9jaywgaXQncyByYWN5LiBJJ20KPiA+IHRyeWluZwo+ ID4gdG8gY2F0Y2ggdGhlIHJhY2UgY29uZGl0aW9ucyB3aGlsZSBJIHJldmlldywgYnV0IEknZCB1 cmdlIHlvdSB0byBhdWRpdAo+ID4gdGhlCj4gPiBkcml2ZXIgZm9yIG90aGVyIHBsYWNlcyB0aGF0 IG5lZWQgbG9ja2luZy4KPiA+IAo+IHNpbmtfcmVxdWVzdCB3aWxsIGJlIHJ1bm5pbmcgaW4gYSBz aW5nbGUtdGhyZWFkZWQgd29yayBxdWV1ZS4KPiAoImRybV9kcF9leHRjb24iIHdvcmsgcXVldWUp Lgo+IFdlIG1pZ2h0IG5vdCBuZWVkIGxvY2tpbmcgZm9yIHNpbmtfcmVxdWVzdC4KPiAKCkl0IHNl ZW1zIGxpa2Ugc2lua19yZXF1ZXN0IGNvdWxkIGNoYW5nZSBpbiBiZXR3ZWVuIHJlYWRzIGluIGRw X2N0cmxfb24/CmRwX2N0cmxfb24gcmVhZHMgdGhlIHZhbHVlIHR3aWNlLCBhbmQgY2FsbHMgZHBf Y3RybF9zZXR1cF9tYWluX2xpbmsgd2hpY2ggYWxzbwpyZWFkcyB0aGUgdmFsdWUuCgovc25pcAoK PiA+ID4gK3N0YXRpYyB2b2lkIGRwX2N0cmxfc2V0X2Nsb2NrX3JhdGUoc3RydWN0IGRwX2N0cmxf cHJpdmF0ZSAqY3RybCwKPiA+ID4gKwkJCQkgICBjaGFyICpuYW1lLCB1MzIgcmF0ZSkKPiA+ID4g K3sKPiA+ID4gKwl1MzIgbnVtID0gY3RybC0+cGFyc2VyLT5tcFtEUF9DVFJMX1BNXS5udW1fY2xr Owo+ID4gPiArCXN0cnVjdCBkc3NfY2xrICpjZmcgPSBjdHJsLT5wYXJzZXItPm1wW0RQX0NUUkxf UE1dLmNsa19jb25maWc7Cj4gPiA+ICsKPiA+ID4gKwl3aGlsZSAobnVtICYmIHN0cmNtcChjZmct PmNsa19uYW1lLCBuYW1lKSkgewo+ID4gPiArCQludW0tLTsKPiA+ID4gKwkJY2ZnKys7Cj4gPiA+ ICsJfQo+ID4gPiArCj4gPiA+ICsJcHJfZGVidWcoInNldHRpbmcgcmF0ZT0lZCBvbiBjbGs9JXNc biIsIHJhdGUsIG5hbWUpOwo+ID4gPiArCj4gPiA+ICsJaWYgKG51bSkKPiA+ID4gKwkJY2ZnLT5y YXRlID0gcmF0ZTsKPiA+ID4gKwllbHNlCj4gPiA+ICsJCXByX2VycigiJXMgY2xvY2sgY291bGQg bm90IGJlIHNldCB3aXRoIHJhdGUgJWRcbiIsIG5hbWUsIHJhdGUpOwo+ID4gPiArfQo+ID4gCj4g PiBJbnN0ZWFkIG9mIGRvaW5nIGFsbCBvZiB0aGlzIHdvcmssIGp1c3Qgc3RvcmUgcG9pbnRlcnMg dG8gdGhlIGxpbmsgYW5kCj4gPiBwaXhlbAo+ID4gY2xvY2sgd2hlbiB5b3UgcGFyc2UgdGhlIGR0 LiBUaGF0IHdheSB5b3UgY2FuIGp1c3QgYWNjZXNzIHRoZW0gZGlyZWN0bHkKPiA+IGluCj4gPiBk cF9jdHJsX2VuYWJsZV9tYWlubGlua19jbG9ja3MuCj4gPiAKPiBUaGVzZSBhcmUgZ2VuZXJpYyBp bXBsZW1lbnRhdGlvbiBmb3IgRFBfQ09SRSBhbmQgRFBfQ1RSTCBjbG9ja3MuIFRoaXMgd2lsbAo+ IGhlbHAKPiBmb3IgYW55IGZ1dHVyZSB1cGdyYWRlcyB3aGVyZSB0aGUgb25seSBjaGFuZ2Ugd2ls bCBiZSBkb25lIGR0c2kgYW5kIG1heWJlCj4gbWlub3IKPiBjaGFuZ2VzIGluIERyaXZlciB3aGVu IHdlIGFkZC9yZW1vdmUgYW55IGNsb2Nrcy4KCkp1c3QgYWRkIG5ldyBwb2ludGVycyBhbmQgTlVM TCBjaGVja3MgaW4gdGhlIGZ1dHVyZSBpZi93aGVuIHRoaXMgaXMgbmVlZGVkLgoKL3NuaXAKCj4g PiA+ICsKPiA+ID4gKwlpZiAoY3RybC0+bGluay0+c2lua19yZXF1ZXN0ICYgRFBfVEVTVF9MSU5L X1BIWV9URVNUX1BBVFRFUk4pCj4gPiAKPiA+IFRoaXMgaXMgcmFjeSwgc2lua19yZXF1ZXN0IGNv dWxkIGNoYW5nZSBiZXR3ZWVuIHRoZSBjaGVjayBhYm92ZSBhbmQKPiA+IGhlcmUuCj4gPiAKPiBT aW5rX3JlcXVlc3QgaXMgYWNjZXNzZWQgaW4gc2luZ2xlIHRocmVhZCBjb250ZXh0Lgo+IAoKQWgs IHNvIEkgbWVudGlvbmVkIHRoYXQgaW4gdGhlIGVhcmxpZXIgcmV2aWV3LiBJIGd1ZXNzIEknbSBu b3Qgc2VlaW5nIHdoYXQKcHJldmVudHMgdGhhdCBzaW5nbGUgdGhyZWFkIGZyb20gbW9kaWZ5aW5n IHRoZSB2YWx1ZSB0d2ljZT8gVGhpcyBjb2RlIHdpbGwgYmUKcnVuIGluIGEgZGlmZmVyZW50IHRo cmVhZCwgc28gaXQgcmVhbGx5IHNlZW1zIGxpa2UgdGhlcmUgY291bGQgYmUgYSByYWNlIGhlcmUu Cgovc25pcAoKPiA+ID4gK3N0YXRpYyB2b2lkIGRwX2Rpc3BsYXlfc2VuZF9ocGRfZXZlbnQoc3Ry dWN0IG1zbV9kcCAqZHBfZGlzcGxheSkKPiA+ID4gK3sKPiA+ID4gKwlzdHJ1Y3QgZHBfZGlzcGxh eV9wcml2YXRlICpkcDsKPiA+ID4gKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOwo+ ID4gPiArCj4gPiA+ICsJaWYgKCFkcF9kaXNwbGF5KSB7Cj4gPiA+ICsJCXByX2VycigiaW52YWxp ZCBpbnB1dFxuIik7Cj4gPiA+ICsJCXJldHVybjsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlk cCA9IGNvbnRhaW5lcl9vZihkcF9kaXNwbGF5LCBzdHJ1Y3QgZHBfZGlzcGxheV9wcml2YXRlLAo+ ID4gPiBkcF9kaXNwbGF5KTsKPiA+ID4gKwlpZiAoIWRwKSB7Cj4gPiA+ICsJCXByX2VycigiaW52 YWxpZCBwYXJhbXNcbiIpOwo+ID4gPiArCQlyZXR1cm47Cj4gPiA+ICsJfQo+ID4gPiArCj4gPiA+ ICsJY29ubmVjdG9yID0gZHAtPmRwX2Rpc3BsYXkuY29ubmVjdG9yOwo+ID4gPiArCWRybV9oZWxw ZXJfaHBkX2lycV9ldmVudChjb25uZWN0b3ItPmRldik7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g K3N0YXRpYyBpbnQgZHBfZGlzcGxheV9zZW5kX2hwZF9ub3RpZmljYXRpb24oc3RydWN0Cj4gPiA+ IGRwX2Rpc3BsYXlfcHJpdmF0ZSAqZHAsCj4gPiA+ICsJCQkJCSAgICBib29sIGhwZCkKPiA+IAo+ ID4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBhIGZldyBkaWZmZXJlbnQgdGhyZWFkcyB3 aXRoIG5vIGxvY2tpbmcuIEl0Cj4gPiBzZWVtcwo+ID4gbGlrZSB0aGVyZSdzIGdvb2Qgb3Bwb3J0 dW5pdHkgZm9yIGlzX2Nvbm5lY3RlZCBhbmQgbm90aWZpY2F0aW9uX2NvbXAgdG8KPiA+IGdldCBv dXQKPiA+IG9mIHN5bmMuCj4gPiAKPiA+IEFkZGl0aW9uYWxseSwgaXNfY29ubmVjdGVkIGlzIHNl dCB0byB0cnVlIGJlZm9yZSB0aGUgZnVuY3Rpb24gcmV0dXJucwo+ID4gKGFuZAo+ID4gZW5hYmxl IGhhcyBiZWVuIGNvbXBsZXRlZCkuIFNvIGlzIHRoYXQgZ29pbmcgdG8gY2F1c2UgcHJvYmxlbXMg d2hlbiB3ZQo+ID4gY2FsbAo+ID4gZGV0ZWN0L2dldF9tb2RlcyB3aGVyZSBpc19jb25uZWN0ZWQg PT0gdHJ1ZSBhbmQgdGhlIGh3IGlzIG5vdCB1cD8KPiA+IAo+IFdpbGwgZml4IHRoaXMgaW4gVjMu Cj4gCj4gCj4gPiBQZXJoYXBzIEknbSBtaXNyZWFkaW5nIHRoaXMgZnVuY3Rpb24sIGJ1dCBpdCBz ZWVtcyBsaWtlIHRoZSBwbGFuIGlzIHRvCj4gPiBibG9jawo+ID4gdW50aWwgdXNlcnNwYWNlIGhh cyBiZWVuIG5vdGlmaWVkIGFuZCBkb2VzIGEgZnVsbCBtb2Rlc2V0IChpZTogZW5hYmxlKT8KPiA+ IElmIHRoYXQKPiA+IGlzIHRoZSBjYXNlLCB3ZSB1c3VhbGx5IGRvbid0IHdhbnQgdG8gaGF2ZSB0 aGUgaGFyZHdhcmUgbGl0IHVwIHVudGlsCj4gPiBpdCdzCj4gPiBhY3R1YWxseSBnb2luZyB0byBi ZSB1c2VkLiBJbiB0aGVzZSBjYXNlcywgd2UnbGwgd3JhcCBnZXRfbW9kZXMgaW4KPiA+IGVuYWJs ZS9kaXNhYmxlICh3aXRoIHByb3BlciBsb2NraW5nKSwgYW5kIHdhaXQgZm9yIG1vZGVzZXQgdG8g bGVhdmUgaXQKPiA+IG9uLgo+ID4gCj4gV2hlbiBIUEQgZ29lcyBoaWdoLCB3ZSBkbyBkcGNkIHJl YWRzIHRvIGdldCB0aGUgc2luayBjYXBhYmlsaXRpZXMgYW5kIHRoZW4KPiBpbmZvcm0gdGhlIGZy YW1ld29yayBzbyB0aGF0ICJlbmFibGUiCj4gZ2V0cyBjYWxsZWQgYnkgZHJtIGZyYW1ld29yay4K PiAKCkknbSBub3Qgc3VyZSBJIGZvbGxvdyB3aGF0IHlvdSdyZSBzYXlpbmcuIElzIG5vdGlmaWNh dGlvbl9jb21wIG1lYW50IHRvCnJhdGVsaW1pdC9kZWJvdW5jZSBocGQgbm90aWZpY2F0aW9ucz8g SSBkb24ndCB0aGluayBpdCdzIG5lZWRlZCwgYW5kIGlmIGl0IGlzLAppdCB3b3VsZCBiZSBpbnRl cmVzdGluZyB0byBrbm93IHdoeS4KCj4gPiA+ICt7Cj4gPiA+ICsJaWYgKChocGQgJiYgZHAtPmRw X2Rpc3BsYXkuaXNfY29ubmVjdGVkKSB8fAo+ID4gPiArCQkJKCFocGQgJiYgIWRwLT5kcF9kaXNw bGF5LmlzX2Nvbm5lY3RlZCkpIHsKPiA+ID4gKwkJcHJfaW5mbygiSFBEIGFscmVhZHkgJXNcbiIs IChocGQgPyAib24iIDogIm9mZiIpKTsKPiA+ID4gKwkJcmV0dXJuIDA7Cj4gPiA+ICsJfQo+ID4g PiArCj4gPiA+ICsJLyogcmVzZXQgdmlkZW8gcGF0dGVybiBmbGFnIG9uIGRpc2Nvbm5lY3QgKi8K PiA+ID4gKwlpZiAoIWhwZCkKPiA+ID4gKwkJZHAtPnBhbmVsLT52aWRlb190ZXN0ID0gZmFsc2U7 Cj4gPiA+ICsKPiA+ID4gKwlkcC0+ZHBfZGlzcGxheS5pc19jb25uZWN0ZWQgPSBocGQ7Cj4gPiA+ ICsJcmVpbml0X2NvbXBsZXRpb24oJmRwLT5ub3RpZmljYXRpb25fY29tcCk7Cj4gPiA+ICsJZHBf ZGlzcGxheV9zZW5kX2hwZF9ldmVudCgmZHAtPmRwX2Rpc3BsYXkpOwo+ID4gPiArCj4gPiA+ICsJ aWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmRwLT5ub3RpZmljYXRpb25fY29tcCwg SFogKiAyKSkgewo+ID4gPiArCQlwcl93YXJuKCIlcyB0aW1lb3V0XG4iLCBocGQgPyAiY29ubmVj dCIgOiAiZGlzY29ubmVjdCIpOwo+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsKPiA+ID4gKwl9Cj4g PiA+ICsKPiA+ID4gKwlyZXR1cm4gMDsKPiA+ID4gK30KCi9zbmlwCgo+ID4gPiArLyoqCj4gPiA+ ICsgKiBkcF9jb25uZWN0b3JfZ2V0X21vZGVzIC0gY2FsbGJhY2sgdG8gYWRkIGRybSBtb2RlcyB2 aWEKPiA+ID4gZHJtX21vZGVfcHJvYmVkX2FkZCgpCj4gPiA+ICsgKiBAY29ubmVjdG9yOiBQb2lu dGVyIHRvIGRybSBjb25uZWN0b3Igc3RydWN0dXJlCj4gPiA+ICsgKiBSZXR1cm5zOiBOdW1iZXIg b2YgbW9kZXMgYWRkZWQKPiA+ID4gKyAqLwo+ID4gPiArc3RhdGljIGludCBkcF9jb25uZWN0b3Jf Z2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gPiA+ICt7Cj4gPiA+ ICsJaW50IHJjID0gMDsKPiA+ID4gKwlzdHJ1Y3QgbXNtX2RwICpkcDsKPiA+ID4gKwlzdHJ1Y3Qg ZHBfZGlzcGxheV9tb2RlICpkcF9tb2RlID0gTlVMTDsKPiA+ID4gKwlzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbSwgZHJtX21vZGU7Cj4gPiA+ICsJc3RydWN0IGRwX2Nvbm5lY3RvciAqZHBfY29u bjsKPiA+ID4gKwo+ID4gPiArCWlmICghY29ubmVjdG9yKQo+ID4gPiArCQlyZXR1cm4gMDsKPiA+ ID4gKwo+ID4gPiArCWRwX2Nvbm4gPSB0b19kcF9jb25uZWN0b3IoY29ubmVjdG9yKTsKPiA+ID4g KwlkcCA9IGRwX2Nvbm4tPmRwX2Rpc3BsYXk7Cj4gPiA+ICsKPiA+ID4gKwlkcF9tb2RlID0ga3ph bGxvYyhzaXplb2YoKmRwX21vZGUpLCAgR0ZQX0tFUk5FTCk7Cj4gPiA+ICsJaWYgKCFkcF9tb2Rl KQo+ID4gPiArCQlyZXR1cm4gMDsKPiA+IAo+ID4gV2hlbiB5b3UgZ2V0IHJpZCBvZiBkcF9kaXNw bGF5X21vZGUsIHBsZWFzZSB1c2UgdGhlIHN0YWNrIGZvciB0aGUgbmV3Cj4gPiBkcm1fZGlzcGxh eV9tb2RlCj4gPiAKPiBGaXhlZCBpbiBWMi4KPiAKPiA+ID4gKwo+ID4gPiArCS8qIHBsdWdnYWJs ZSBjYXNlIGFzc3VtZXMgRURJRCBpcyByZWFkIHdoZW4gSFBEICovCj4gPiA+ICsJaWYgKGRwLT5p c19jb25uZWN0ZWQpIHsKPiA+ID4gKwkJcmMgPSBkcC0+Z2V0X21vZGVzKGRwLCBkcF9tb2RlKTsK PiA+IAo+ID4gV2h5IGlzIG9ubHkgb25lIG1vZGUgcmV0dXJuZWQ/Cj4gPiAKPiBUaGUgZ2V0X21v ZGVzKCkgZnVuY3Rpb24gbWlnaHQgcmV0dXJuIG9uZSBtb2RlIHRoYXQgaXMgc3RvcmVkCj4gaW4g ZHBfbW9kZSB3aGVuIGNvbXBsaWFuY2UgdGVzdCBpcyBpbiBwcm9ncmVzcy4gSWYgbm90LCB0aGUK PiByZXR1cm4gdmFsdWUgaXMgZXF1YWwgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBtb2RlcyBzdXBw b3J0ZWQKPiBieSB0aGUgc2luawoKQWguIEkgdGhpbmsgdGhpcyB3b3VsZCBiZSBiZXR0ZXIgdG8g ZG8gdGhpcyB3b3JrIGluIGRwX3BhbmVsX2dldF9tb2RlcyBhbmQKcmV0dXJuIDEgZnJvbSB0aGVy ZS4gVGhlbiB5b3UgY2FuIHJlbW92ZSBhbGwgb2YgdGhlIHNwZWNpYWwgaGFuZGxpbmcgZnJvbSB0 aGlzCmZ1bmN0aW9uLgoKPiAKPiA+ID4gKwkJaWYgKCFyYykKPiA+IAo+ID4gVGhpcyBjYW4gYWxz byByZXR1cm4gLWVycm5vLCB5b3Ugc2hvdWxkIGNoZWNrIGZvciB0aGF0IHRvby4KPiA+IAo+IEZp eGVkIGluIFYyLgo+IAo+ID4gPiArCQkJcHJfZXJyKCJmYWlsZWQgdG8gZ2V0IERQIHNpbmsgbW9k ZXMsIHJjPSVkXG4iLCByYyk7Cj4gPiAKPiA+IFdoeSBjb250aW51ZSBpZiB5b3Uga25vdyB5b3Ug ZmFpbGVkPwo+ID4gCj4gPiA+ICsKPiA+ID4gKwkJaWYgKGRwX21vZGUtPnRpbWluZy5waXhlbF9j bGtfa2h6KSB7IC8qIHZhbGlkIERQIG1vZGUgKi8KPiA+ID4gKwkJCW1lbXNldCgmZHJtX21vZGUs IDB4MCwgc2l6ZW9mKGRybV9tb2RlKSk7Cj4gPiA+ICsJCQljb252ZXJ0X3RvX2RybV9tb2RlKGRw X21vZGUsICZkcm1fbW9kZSk7Cj4gPiA+ICsJCQltID0gZHJtX21vZGVfZHVwbGljYXRlKGNvbm5l Y3Rvci0+ZGV2LCAmZHJtX21vZGUpOwo+ID4gPiArCQkJaWYgKCFtKSB7Cj4gPiA+ICsJCQkJcHJf ZXJyKCJmYWlsZWQgdG8gYWRkIG1vZGUgJXV4JXVcbiIsCj4gPiA+ICsJCQkJICAgICAgIGRybV9t b2RlLmhkaXNwbGF5LAo+ID4gPiArCQkJCSAgICAgICBkcm1fbW9kZS52ZGlzcGxheSk7Cj4gPiA+ ICsJCQkJa2ZyZWUoZHBfbW9kZSk7Cj4gPiA+ICsJCQkJcmV0dXJuIDA7Cj4gPiA+ICsJCQl9Cj4g PiA+ICsJCQltLT53aWR0aF9tbSA9IGNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLndpZHRoX21tOwo+ ID4gPiArCQkJbS0+aGVpZ2h0X21tID0gY29ubmVjdG9yLT5kaXNwbGF5X2luZm8uaGVpZ2h0X21t Owo+ID4gCj4gPiBZb3Ugc2hvdWxkbid0IG92ZXJ3cml0ZSB0aGVzZS4KPiA+IAo+IEZpeGVkIGlu IFYyLgo+IAo+ID4gPiArCQkJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3IsIG0pOwo+ID4g PiArCQl9Cj4gPiA+ICsJfSBlbHNlIHsKPiA+ID4gKwkJcHJfZXJyKCJObyBzaW5rIGNvbm5lY3Rl ZFxuIik7Cj4gPiAKPiA+IFRoaXMgc2hvdWxkbid0IGJlIGFuIGVycm9yCj4gPiAKPiBGaXhlZCBp biBWMi4KPiAKPiA+ID4gKwl9Cj4gPiA+ICsJa2ZyZWUoZHBfbW9kZSk7Cj4gPiA+ICsKPiA+ID4g KwlyZXR1cm4gcmM7Cj4gPiA+ICt9Cgovc25pcAoKPiA+ID4gKyAqIEBsaW5rOiBEaXNwbGF5IFBv cnQgRHJpdmVyIGRhdGEKPiA+ID4gKyAqCj4gPiA+ICsgKiBQYXJzZXMgdGhlIERQQ0QgdG8gY2hl Y2sgaWYgYW4gYXV0b21hdGVkIGxpbmsgaXMgcmVxdWVzdGVkIChCeXRlCj4gPiA+IDB4MjAxKSwK PiA+ID4gKyAqIGFuZCB3aGF0IHR5cGUgb2YgbGluayBhdXRvbWF0aW9uIGlzIGJlaW5nIHJlcXVl c3RlZCAoQnl0ZSAweDIxOCkuCj4gPiA+ICsgKi8KPiA+ID4gK3N0YXRpYyBpbnQgZHBfbGlua19w YXJzZV9yZXF1ZXN0KHN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmspCj4gPiA+ICt7Cj4gPiA+ ICsJaW50IHJldCA9IDA7Cj4gPiA+ICsJdTggYnA7Cj4gPiA+ICsJdTggZGF0YTsKPiA+IAo+ID4g T25seSBuZWVkIDEgb2YgYnAvZGF0YQo+ID4gCj4gPiA+ICsJaW50IHJsZW47Cj4gPiAKPiA+IHNz aXplX3QKPiA+IAo+ID4gPiArCXUzMiBjb25zdCBwYXJhbV9sZW4gPSAweDE7Cj4gPiAKPiA+IE5v dCBuZWVkZWQsIHVzZSBkcm1fZHBfZHBjZF9yZWFkYigpCj4gPiAKPiA+ID4gKwo+ID4gPiArCS8q Kgo+ID4gPiArCSAqIFJlYWQgdGhlIGRldmljZSBzZXJ2aWNlIElSUSB2ZWN0b3IgKEJ5dGUgMHgy MDEpIHRvIGRldGVybWluZQo+ID4gPiArCSAqIHdoZXRoZXIgYW4gYXV0b21hdGVkIGxpbmsgaGFz IGJlZW4gcmVxdWVzdGVkIGJ5IHRoZSBzaW5rLgo+ID4gPiArCSAqLwo+ID4gPiArCXJsZW4gPSBk cm1fZHBfZHBjZF9yZWFkKGxpbmstPmF1eC0+ZHJtX2F1eCwKPiA+ID4gKwkJRFBfREVWSUNFX1NF UlZJQ0VfSVJRX1ZFQ1RPUiwgJmJwLCBwYXJhbV9sZW4pOwo+ID4gPiArCWlmIChybGVuIDwgcGFy YW1fbGVuKSB7Cj4gPiA+ICsJCXByX2VycigiYXV4IHJlYWQgZmFpbGVkXG4iKTsKPiA+IAo+ID4g UHJpbnQgZXJyb3IuIFRoaXMgZ29lcyBmb3Igb3RoZXIgZmFpbHVyZSBtZXNzYWdlcyBpbiB0aGlz IGZpbGUuCj4gPiAKPiBBZGRyZXNzZWQgYWxsIHRoZSBjb21tZW50cyBhYm92ZSBpbiB0aGlzIGZ1 bmN0aW9uIGluIFYyLgo+IAo+ID4gPiArCQlyZXQgPSAtRUlOVkFMOwo+ID4gPiArCQlnb3RvIGVu ZDsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlkYXRhID0gYnA7Cj4gPiA+ICsKPiA+ID4gKwlw cl9kZWJ1ZygiZGV2aWNlIHNlcnZpY2UgaXJxIHZlY3RvciA9IDB4JXhcbiIsIGRhdGEpOwo+ID4g PiArCj4gPiA+ICsJaWYgKCEoZGF0YSAmIERQX0FVVE9NQVRFRF9URVNUX1JFUVVFU1QpKSB7Cj4g PiA+ICsJCXByX2RlYnVnKCJubyB0ZXN0IHJlcXVlc3RlZFxuIik7Cj4gPiA+ICsJCXJldHVybiAw Owo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCS8qKgo+ID4gPiArCSAqIFJlYWQgdGhlIGxpbmsg cmVxdWVzdCBieXRlIChCeXRlIDB4MjE4KSB0byBkZXRlcm1pbmUgd2hhdCB0eXBlCj4gPiA+ICsJ ICogb2YgYXV0b21hdGVkIGxpbmsgaGFzIGJlZW4gcmVxdWVzdGVkIGJ5IHRoZSBzaW5rLgo+ID4g PiArCSAqLwo+ID4gPiArCXJsZW4gPSBkcm1fZHBfZHBjZF9yZWFkKGxpbmstPmF1eC0+ZHJtX2F1 eCwgRFBfVEVTVF9SRVFVRVNULAo+ID4gPiArCQkJJmJwLCBwYXJhbV9sZW4pOwo+ID4gPiArCWlm IChybGVuIDwgcGFyYW1fbGVuKSB7Cj4gPiA+ICsJCXByX2VycigiYXV4IHJlYWQgZmFpbGVkXG4i KTsKPiA+ID4gKwkJcmV0ID0gLUVJTlZBTDsKPiA+ID4gKwkJZ290byBlbmQ7Cj4gPiA+ICsJfQo+ ID4gPiArCj4gPiA+ICsJZGF0YSA9IGJwOwo+ID4gPiArCj4gPiA+ICsJaWYgKCFkcF9saW5rX2lz X3Rlc3Rfc3VwcG9ydGVkKGRhdGEpKSB7Cj4gPiA+ICsJCXByX2RlYnVnKCJsaW5rIDB4JXggbm90 IHN1cHBvcnRlZFxuIiwgZGF0YSk7Cj4gPiA+ICsJCWdvdG8gZW5kOwo+ID4gPiArCX0KPiA+ID4g Kwo+ID4gPiArCXByX2RlYnVnKCIlcyAoMHgleCkgcmVxdWVzdGVkXG4iLCBkcF9saW5rX2dldF90 ZXN0X25hbWUoZGF0YSksCj4gPiA+IGRhdGEpOwo+ID4gPiArCWxpbmstPnJlcXVlc3QudGVzdF9y ZXF1ZXN0ZWQgPSBkYXRhOwo+ID4gCj4gPiBJZiB0ZXN0X3JlcXVlc3RlZCBpcyBvbmx5IHVzZWQg aW4gdGhlIHNjb3BlIG9mIHRoaXMgZnVuY3Rpb24sIGp1c3QgdXNlIGEKPiA+IGxvY2FsCj4gPiBh bmQgcGFzcyBpdCBhcm91bmQuIElmIHRlc3RfcmVxdWVzdGVkIGlzIHVzZWQgb3V0c2lkZSB0aGUg c2NvcGUgb2YgdGhpcwo+ID4gZnVuY3Rpb24sIHlvdSBuZWVkIGxvY2tpbmcuCj4gCj4gdGVzdF9y ZXF1ZXN0ZWQgaW4gb25seSB1c2VkIGluIGRwX2xpbmsuYy4gQnV0IHdlIHVzZSB0aGlzIGluIGRw X2RlYnVnIGZvcgo+IGRlYnVnZ2luZy4gV2UgYWxzbwo+IHVzZSB0aGlzIGluIHVuaXQgdGVzdGlu Zy4gVGhpcyBpcyBvbmUgb2YgbWFpbiByZWFzb24gd2UgaGF2ZSBpdCBpbiBkcF9saW5rCj4gc3Ry dWN0dXJlLgo+IAoKT2ssIHNhbWUgY29tbWVudCByZWdhcmRpbmcgdW5pdCB0ZXN0aW5nIGFzIGFi b3ZlLiBQbGVhc2UgY2hhbmdlIHRoaXMgdG8gYSBsb2NhbAppbiB0aGUgdXBzdHJlYW0gdmVyc2lv bi4KCi9zbmlwCgo+ID4gPiArCS8qKgo+ID4gCj4gPiAvKgo+ID4gCj4gTXVsdGktbGluZSBjb21t ZW50cywgd2UgdXNlICIvKioiCj4gCgpUaGlzIHdpbGwgY2F1c2Ugd2FybmluZ3MgaW4gdGhlIGh0 bWxkb2NzIGJ1aWxkLiBTZWUKaHR0cHM6Ly93d3cua2VybmVsLm9yZy9kb2MvaHRtbC9sYXRlc3Qv cHJvY2Vzcy9jb2Rpbmctc3R5bGUuaHRtbCNjb21tZW50aW5nCgovc25pcAoKPiA+ID4gK3N0YXRp YyB2b2lkIGRwX2xpbmtfc2VuZF90ZXN0X3Jlc3BvbnNlKHN0cnVjdCBkcF9saW5rICpkcF9saW5r KQo+ID4gPiArewo+ID4gPiArCXN0cnVjdCBkcF9saW5rX3ByaXZhdGUgKmxpbmsgPSBOVUxMOwo+ ID4gPiArCXUzMiBjb25zdCByZXNwb25zZV9sZW4gPSAweDE7Cj4gPiA+ICsKPiA+ID4gKwlpZiAo IWRwX2xpbmspIHsKPiA+ID4gKwkJcHJfZXJyKCJpbnZhbGlkIGlucHV0XG4iKTsKPiA+ID4gKwkJ cmV0dXJuOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCWxpbmsgPSBjb250YWluZXJfb2YoZHBf bGluaywgc3RydWN0IGRwX2xpbmtfcHJpdmF0ZSwgZHBfbGluayk7Cj4gPiA+ICsKPiA+ID4gKwlk cm1fZHBfZHBjZF93cml0ZShsaW5rLT5hdXgtPmRybV9hdXgsIERQX1RFU1RfUkVTUE9OU0UsCj4g PiA+ICsJCQkmZHBfbGluay0+dGVzdF9yZXNwb25zZSwgcmVzcG9uc2VfbGVuKTsKPiA+IAo+ID4g SSBzdHJvbmdseSBzdXNwZWN0IHlvdSBzaG91bGQgaGF2ZSBsb2NraW5nIHByb3RlY3RpbmcgdGVz dF9yZXNwb25zZS4KPiA+IAo+IFdpbGwgY3Jvc3MtY2hlY2sgd2hldGhlciB3ZSBuZWVkIGxvY2tp bmcgYW5kIGZpeCBpdCBpbiBWMy4gSnVzdCBjdXJpb3VzLCBkbwo+IHlvdSBzdGlsbCB0aGluawo+ IHdlIG5lZWQgbG9ja2luZyBldmVuIHRob3VnaCB3ZSBoYW5kbGUgdGhpcyBpbiBhIHNpbmdsZSB0 aHJlYWQ/CgpBRkFJQ1QsIHRoaXMgaXMgY2FsbGVkIGZyb20gdGhlIGRybSB0aHJlYWQgKHZpYSAK ZHBfY3RybF9vbi0+ZHBfY3RybF9zZW5kX3BoeV90ZXN0X3BhdHRlcm4pLCBhbmQgZXh0Y29uIGhw ZCB0aHJlYWQ/Cgovc25pcAoKPiA+ID4gK3N0YXRpYyB1OCBnZXRfbGlua19zdGF0dXMoY29uc3Qg dTgKPiA+ID4gbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0sIGludCByKQo+ID4gPiAr ewo+ID4gPiArCXJldHVybiBsaW5rX3N0YXR1c1tyIC0gRFBfTEFORTBfMV9TVEFUVVNdOwo+ID4g Cj4gPiBJIGRvbid0IHRoaW5rIHlvdSdyZSByZWFsbHkgc3VwcG9zZWQgdG8gcmVhY2ggaW50byB0 aGUgbGlua19zdGF0dXMgbGlrZQo+ID4gdGhpcy4KPiA+IEhvdyBhYm91dCBhZGRpbmcgYSBuZXcg aGVscGVyIHRvIGNoZWNrIGZvciBEUF9MSU5LX1NUQVRVU19VUERBVEVEIGFuZAo+ID4gb25lIGZv cgo+ID4gRFBfRE9XTlNUUkVBTV9QT1JUX1NUQVRVU19DSEFOR0VEPwo+ID4gCj4gVGhpcyBmdW5j dGlvbiBpcyBzaW1pbGFyIHRvIGZ1bmN0aW9uIGluIHVwc3RyZWFtIGRybV9kcF9oZWxwZXIuYyBm aWxlLgo+IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bW9zL3RoaXJk X3BhcnR5L2tlcm5lbC8rL2Nocm9tZW9zLTMuMTgvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxw ZXIuYyMyNTkKPiAKClllYWgsIHRoYXQncyBteSBwb2ludCwgaXQncyBzb21ldGhpbmcgdGhhdCdz IGRvbmUgaW50ZXJuYWxseSB0byB0aGUgaGVscGVyLgpBZGRpbmcgYSBjb3VwbGUgaGVscGVycyB0 byBkcm1fZHBfaGVscGVyIHdpbGwgY2xlYW4gdXAgdGhpcyBjb2RlIGFuZCBhbHNvCmJlbmVmaXQg b3RoZXJzIHdobyBuZWVkIHRvIGRvIHRoZSBzYW1lIHRoaW5nIChJIGRvbid0IHNlZSBhbnlvbmUg ZWxzZSBjaGVja2luZwp0aG9zZSBiaXRzIHlldCkuCgo+ID4gPiArfQoKL3NuaXAKCj4gPiA+ICtz dGF0aWMgYm9vbCBkcF9saW5rX2lzX2RzX3BvcnRfc3RhdHVzX2NoYW5nZWQoc3RydWN0Cj4gPiA+ IGRwX2xpbmtfcHJpdmF0ZSAqbGluaykKPiA+ID4gK3sKPiA+ID4gKwlpZiAoZ2V0X2xpbmtfc3Rh dHVzKGxpbmstPmxpbmtfc3RhdHVzLAo+ID4gPiBEUF9MQU5FX0FMSUdOX1NUQVRVU19VUERBVEVE KSAmCj4gPiA+ICsJCURQX0RPV05TVFJFQU1fUE9SVF9TVEFUVVNfQ0hBTkdFRCkgLyogcG9ydCBz dGF0dXMgY2hhbmdlZCAqLwo+ID4gPiArCQlyZXR1cm4gdHJ1ZTsKPiA+ID4gKwo+ID4gPiArCWlm IChsaW5rLT5wcmV2X3NpbmtfY291bnQgIT0gbGluay0+ZHBfbGluay5zaW5rX2NvdW50LmNvdW50 KQo+ID4gCj4gPiBJdCBzZWVtcyBsaWtlIHRoaXMgaXMgcnVubmluZyBpbiBhIHNlcGFyYXRlIHRo cmVhZCBmcm9tIHdoZXJlCj4gPiBwcmV2X3NpbmtfY291bnQgaXMKPiA+IHNldCwgcG90ZW50aWFs IHJhY2UgaGVyZT8KPiA+IAo+IEkgZG9uJ3QgdGhpbmsgd2UgbWlnaHQgbmVlZCBsb2NraW5nIGhl cmUuIEFsbCB0aGUgdXBkYXRlcy9jaGVja3MgcmVsYXRlZCB0bwo+IHByZXZfc2lua19jb3VudCBh cmUgZG9uZQo+IGluIGRwX2xpbmtfcHJvY2Vzc19yZXF1ZXN0KCkgd2hpY2ggd2lsbCBydW4gaW4g c2luZ2xlIHRocmVhZGVkIHdvcmsgcXVldWUuCj4KCkhtbSwgZGlkbid0IHJlYWxpemUgaXQncyBv bmx5IHNldC9hY2Nlc3NlZCBpbiBkcF9saW5rX3Byb2Nlc3NfcmVxdWVzdC4gQ2FuIHlvdQpjaGFu Z2UgdGhpcyB0byBhIGxvY2FsIHZhciBhbmQganVzdCBwYXNzIGl0IHZpYSBhcmd1bWVudHMgc28g MS0gdGhlIGNvZGUgaXMgbW9yZQpjbGVhciwgYW5kIDItIHRoZXJlJ3Mgbm8gY2hhbmNlIGl0IGdl dHMgc3RvbXBlZCBieSBhbm90aGVyIHRocmVhZC4KCi9zbmlwCgo+ID4gPiArc3RhdGljIHUzMiBk cF9saW5rX2dldF90ZXN0X2JpdHNfZGVwdGgoc3RydWN0IGRwX2xpbmsgKmRwX2xpbmssIHUzMgo+ ID4gPiBicHApCj4gPiA+ICt7Cj4gPiA+ICsJdTMyIHRiZDsKPiA+ID4gKwo+ID4gPiArCS8qCj4g PiA+ICsJICogRmV3IHNpbXBsaXN0aWMgcnVsZXMgYW5kIGFzc3VtcHRpb25zIG1hZGUgaGVyZToK PiA+ID4gKwkgKiAgICAxLiBUZXN0IGJpdCBkZXB0aCBpcyBiaXQgZGVwdGggcGVyIGNvbG9yIGNv bXBvbmVudAo+ID4gPiArCSAqICAgIDIuIEFzc3VtZSAzIGNvbG9yIGNvbXBvbmVudHMKPiA+ID4g KwkgKi8KPiA+ID4gKwlzd2l0Y2ggKGJwcCkgewo+ID4gPiArCWNhc2UgMTg6Cj4gPiA+ICsJCXRi ZCA9IERQX1RFU1RfQklUX0RFUFRIXzY7Cj4gPiA+ICsJCWJyZWFrOwo+ID4gPiArCWNhc2UgMjQ6 Cj4gPiA+ICsJCXRiZCA9IERQX1RFU1RfQklUX0RFUFRIXzg7Cj4gPiA+ICsJCWJyZWFrOwo+ID4g PiArCWNhc2UgMzA6Cj4gPiA+ICsJCXRiZCA9IERQX1RFU1RfQklUX0RFUFRIXzEwOwo+ID4gPiAr CQlicmVhazsKPiA+ID4gKwlkZWZhdWx0Ogo+ID4gPiArCQl0YmQgPSBEUF9URVNUX0JJVF9ERVBU SF9VTktOT1dOOwo+ID4gPiArCQlicmVhazsKPiA+ID4gKwl9Cj4gPiA+ICsKPiA+ID4gKwlpZiAo dGJkICE9IERQX1RFU1RfQklUX0RFUFRIX1VOS05PV04pCj4gPiA+ICsJCXRiZCA9ICh0YmQgPj4g RFBfVEVTVF9CSVRfREVQVEhfU0hJRlQpOwo+ID4gCj4gPiBBRkFJQ1QgdGJkIGNvcnJlc3BvbmRz IHRvIGEgU29DIHJlZ2lzdGVyIHZhbHVlLCBhcyBvcHBvc2VkIHRvIHRoZSBEUENECj4gPiB2YWx1 ZS4KPiA+IEl0J3MgYSBoYXBweSBjb2luY2lkZW5jZSB0aGF0IHRoZXkncmUgdGhlIHNhbWUsIGhv d2V2ZXIgSSB0aGluayB5b3UKPiA+IHNob3VsZCB1c2UgYQo+ID4gc2VwYXJhdGUgbXNtLXNwZWNp ZmljICNkZWZpbmUgaW5zdGVhZCBvZiB0aGUgZHJtX2RwX2hlbHBlciB2YWx1ZXMuCj4gPiAKPiBU aGVzZSBhcmUgc3RhbmRhcmQgYnBwIHZhbHVlcyBhbmQgd2lsbCBtYXRjaCB0byB0aGUgRFBDRCB2 YWx1ZXMuIEZvciB0aGUKPiBzYW1lIHJlYXNvbgo+IHdlIGFyZSB1c2luZyBleGlzdGluZyBzdGFu ZGFyZCBtYWNyb3MuCgpIbW0sIE9rLiBNaW5kIGFkZGluZyBhIGNvbW1lbnQgdGhlbj8gSXQncyBh IGJpdCBjb25mdXNpbmcgdG8gbWl4IHRoZSB2YWx1ZXMuCgovc25pcAoKPiA+ID4gKwlyYyA9IGRw X3BhbmVsX3JlYWRfZWRpZChkcF9wYW5lbCwgY29ubmVjdG9yKTsKPiA+IAo+ID4gV2h5IHJlYWQg dGhlIGVkaWQgc28gZWFybHk/IENhbid0IHlvdSB3YWl0IHVudGlsIGdldF9tb2RlcyBpcyBjYWxs ZWQKPiA+ICh5b3UnbGwKPiA+IGhhdmUgdG8gcmUtcmVhZCBhbnl3YXlzKS4KPiA+IAo+IFdlIHdv bid0IGRvIHJlLXJlYWQgYWdhaW4gd2hlbiBnZXRfbW9kZXMgaXMgY2FsbGVkLgo+IAoKWW91IHJl YWxseSBzaG91bGQgYmUsIHVzZXJzcGFjZSBzaG91bGQgZGV0ZXJtaW5lIHdoZW4vd2hldGhlciB0 byBsaW1pdCBpdC4gV2l0aAp0aGF0IGNoYW5nZSwgeW91IGNhbiByZW1vdmUgdGhlIHJlYWQgZnJv bSBoZXJlLgoKCj4gPiA+ICsJaWYgKHJjKSB7Cj4gPiA+ICsJCXByX2VycigicGFuZWwgZWRpZCBy ZWFkIGZhaWxlZCwgc2V0IGZhaWxzYWZlIG1vZGVcbiIpOwo+ID4gPiArCQlyZXR1cm4gcmM7Cj4g PiA+ICsJfQo+ID4gPiArCj4gPiA+ICsJaWYgKHBhbmVsLT5hdXhfY2ZnX3VwZGF0ZV9kb25lKSB7 Cj4gPiA+ICsJCXByX2RlYnVnKCJyZWFkIERQQ0Qgd2l0aCB1cGRhdGVkIEFVWCBjb25maWdcbiIp Owo+ID4gPiArCQlkcF9wYW5lbF9yZWFkX2RwY2QoZHBfcGFuZWwpOwo+ID4gCj4gPiBDaGVjayBy ZXR1cm4gdmFsdWUuIFNob3VsZCB5b3UgYWxzbyBjaGVjayB0aGUgcmF0ZS9sYW5lX2NvdW50IHZh bGlkaXR5Cj4gPiBhZ2FpbiB0b28/Cj4gPiAKPiBGaXhlZCBpbiBWMi4KPiAKPiA+ID4gKwkJcGFu ZWwtPmF1eF9jZmdfdXBkYXRlX2RvbmUgPSBmYWxzZTsKPiA+IAo+ID4gU2hvdWxkIHlvdSBoYXZl IGxvY2tpbmcgZm9yIGF1eF9jZmdfdXBkYXRlX2RvbmU/Cj4gPiAKPiBwYW5lbF9yZWFkX2VkaWQo KSBhbmQgYXV4X2NmZ191cGRhdGVfZG9uZSA9IGZhbHNlIGlzIGRvbmUgb25lIGFmdGVyIHRoZQo+ IG90aGVyIGluIHRoaXMgZnVuY3Rpb24uIEkgZG9uJ3QgdGhpbmsKPiB3ZSBsb2NraW5nIGZvciB0 aGlzLgoKQW5vdGhlciBnb29kIGNhc2Ugb2Ygbm90IG5lZWRpbmcgdG8gc3RvcmUgdGhpcyBpbiBh IGNlbnRyYWwgcGxhY2UuIEp1c3QgbWFrZQp0aGlzIGEgbG9jYWwgaW4gZHBfcGFuZWxfcmVhZF9z aW5rX2NhcHMoKS4KCi9zbmlwCgo+ID4gPiArCW1wLT52cmVnX2NvbmZpZyA9IGRldm1fa3phbGxv YygmcGFyc2VyLT5wZGV2LT5kZXYsCj4gPiA+ICsJCXNpemVvZihzdHJ1Y3QgZHNzX3ZyZWcpICog bXAtPm51bV92cmVnLCBHRlBfS0VSTkVMKTsKPiA+ID4gKwlpZiAoIW1wLT52cmVnX2NvbmZpZykg ewo+ID4gPiArCQlyYyA9IC1FTk9NRU07Cj4gPiA+ICsJCWdvdG8gZXJyb3I7Cj4gPiA+ICsJfQo+ ID4gPiArCj4gPiA+ICsJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShzdXBwbHlfcm9vdF9ub2RlLCBz dXBwbHlfbm9kZSkgewo+ID4gPiArCQljb25zdCBjaGFyICpzdCA9IE5VTEw7Cj4gPiA+ICsJCS8q IHZyZWctbmFtZSAqLwo+ID4gPiArCQlyYyA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKHN1cHBs eV9ub2RlLAo+ID4gPiArCQkJInFjb20sc3VwcGx5LW5hbWUiLCAmc3QpOwo+ID4gPiArCQlpZiAo cmMpIHsKPiA+ID4gKwkJCXByX2VycigiZXJyb3IgcmVhZGluZyBuYW1lLiByYz0lZFxuIiwKPiA+ ID4gKwkJCQkgcmMpOwo+ID4gPiArCQkJZ290byBlcnJvcjsKPiA+ID4gKwkJfQo+ID4gPiArCQlz bnByaW50ZihtcC0+dnJlZ19jb25maWdbaV0udnJlZ19uYW1lLAo+ID4gPiArCQkJQVJSQVlfU0la RSgobXAtPnZyZWdfY29uZmlnW2ldLnZyZWdfbmFtZSkpLCAiJXMiLCBzdCk7Cj4gPiAKPiA+IElu c3RlYWQgb2Ygc3RvcmluZyB0aGUgbmFtZSBqdXN0IHRvIGdldCBhIHJlZ3VsYXRvciByZWZlcmVu Y2UgbGF0ZXIsIHdoeQo+ID4gZG9uJ3QKPiA+IHlvdSBqdXN0IGdyYWIgdGhlIHJlZmVyZW5jZSBu b3cgYW5kIGF2b2lkIHRoZSBzdHJpbmcgb3BzPwo+ID4gCj4gVnJlZyBrZWVwIGNoYW5naW5nIGZv ciBlYWNoIGNoaXAuIFRoaXMgaXMgbW9yZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIHRoYXQKPiBh dm9pZHMgZG9pbmcgY2hhbmdlcyB0byB0aGUgY29kZS4KPiBVcGRhdGluZyB0aGUgZHRzaS1wbGF0 Zm9ybSBzcGVjaWZpYyBjaGFuZ2VzIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gdGhlIHZyZWdzLgoKQ2hh bmdpbmcgdGhlIGNvZGUgaXMgZnVuLCBzdHJpbmcgb3BlcmF0aW9ucyBhcmUgbm90IGZ1bi4gSW4g b3JkZXIgdG8gbWF4aW1pemUKZnVuLCBjYW4gd2UgcGxlYXNlIGNoYW5nZSB0aGVzZT8KCk1vcmUg c2VyaW91c2x5LCB0cnlpbmcgdG8gY29tZSB1cCB3aXRoIGdlbmVyaWMgc29sdXRpb25zIGlzIHN1 cGVyIHRyaWNreSBhbmQKbW9yZSBvZnRlbiB0aGFuIG5vdCwgaW5jb3JyZWN0LiBUaGUgb25seSB0 aGluZyB3ZSBrbm93IGZvciBjZXJ0YWluIGFib3V0CmRlc2lnbmluZyBjb2RlIGlzIHRoYXQgaXQg d2lsbCBldmVudHVhbGx5IGJlIG9ic29sZXRlIDopCgovc25pcAoKPiA+ID4gKwo+ID4gPiArCQlp ZiAoZHBfcGFyc2VyX2NoZWNrX3ByZWZpeChjb3JlX2NsaywgY2xrX25hbWUpKQo+ID4gPiArCQkJ Y29yZV9jbGtfY291bnQrKzsKPiA+ID4gKwo+ID4gPiArCQlpZiAoZHBfcGFyc2VyX2NoZWNrX3By ZWZpeChjdHJsX2NsaywgY2xrX25hbWUpKQo+ID4gPiArCQkJY3RybF9jbGtfY291bnQrKzsKPiA+ IAo+ID4gSnVzdCB1c2UgImNvcmUiLyJjdHJsIiBkaXJlY3RseSBoZXJlLgo+ID4gCj4gPiBIYXZl IHlvdSBjb25zaWRlcmVkIGp1c3QgaGF2aW5nIDIgY2xvY2sgbGlzdHM/IFRoYXQgd291bGQgYXZv aWQgaGF2aW5nCj4gPiB0byBkbwo+ID4gdGhpcy4KPiA+IAo+IEkgZGlkbid0IGdldCB3aGF0IHlv dSBtZWFudCBieSB0d28gY2xvY2sgbGlzdHMuIFdlIGN1cnJlbnRseSBoYXZlIHR3byBjbG9jawo+ IGxpc3QgdG8gc3RvcmUgdGhlbSBsb2NhbGx5Lgo+IFlvdSBtZWFuIGhhdmluZyB0d28gY2xvY2sg bGlzdHMgaW4gZHRzaT8KPiAKClllcywgSSBiZWxpZXZlIHRoYXQncyB3aGF0IEkgbWVhbnQuCgov c25pcAoKPiA+ID4gLS0KPiA+ID4gVGhlIFF1YWxjb21tIElubm92YXRpb24gQ2VudGVyLCBJbmMu IGlzIGEgbWVtYmVyIG9mIHRoZSBDb2RlIEF1cm9yYQo+ID4gPiBGb3J1bSwKPiA+ID4gYSBMaW51 eCBGb3VuZGF0aW9uIENvbGxhYm9yYXRpdmUgUHJvamVjdAo+ID4gPiAKPiA+ID4gX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KPiA+ID4gRnJlZWRyZW5vIG1h aWxpbmcgbGlzdAo+ID4gPiBGcmVlZHJlbm9AbGlzdHMuZnJlZWRlc2t0b3Aub3JnCj4gPiA+IGh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZnJlZWRyZW5vCgot LSAKU2VhbiBQYXVsLCBTb2Z0d2FyZSBFbmdpbmVlciwgR29vZ2xlIC8gQ2hyb21pdW0gT1MKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1h aWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs